Google Apps 脚本 API DriveApp.getFileById 的授权

Google Apps Script API Authorizations for DriveApp.getFileById

我有一个 Google 云平台项目 (GCP),运行 几乎所有 scripts/functions 都是直接的,但有几个是通过 API 完成的。所有内容都只能在 G Suite 域内部访问,并且 OAuth 同意屏幕应用程序类型为“内部”。

我有一个脚本,它不是通过 API 调用的,而是每 x 分钟直接在计时器上调用的。它执行

DriveApp.getFileByID(pictureID)

这太棒了!没问题。

我在同一个 GCP 项目中还有一个不同的脚本,它不是 运行ning 由计时器触发,而是 运行s 通过 API 调用。这是调用它的代码行(不是很重要):

var result = UrlFetchApp.fetch(url, options);

API 脚本 运行 太棒了!直到它到达以下几行:

      try { var file = DriveApp.getFileById(pictureID); }
      catch (e) {
        Logger.log('e = ' + JSON.stringify(e));
        return;
      }

日志的结果是

e = {"name":"Exception"}

我验证了图片 ID 与有效的非 API 脚本中的相同。我正在这个 API-运行 脚本中进行“尝试”,以确保软件可以访问该文件,而不是实际访问它。

我很确定这是授权问题。我现在只使用 GCP 一段时间,对授权有一些经验,但不是很多。

以下是有关授权的一些​​详细信息...

项目的脚本项目属性(File/Project 属性)显示它需要以下 OAuth 范围:

根据 Google 在 https://developers.google.com/apps-script/reference/drive/drive-app#getfilebyidid 的文档,

Scripts that use this method require authorization with one or more of the following scopes: 

https://www.googleapis.com/auth/drive.readonly
https://www.googleapis.com/auth/drive

以下是我现在在 GCP Oauth 同意屏幕上定义的范围:

如您所见,我添加了驱动器,drive.readonly,& drive.file(似乎并不需要)。

最重要的是,这个特定的图像文件存储在 GCP 项目所有者、脚本和 G Suite 域的顶级管理员的 Google 驱动器中。情况并非总是如此,因为用户会将他们自己的 Google 驱动器中的图像分享给这个 software/GCP 所有者。但是,我有一种感觉,即使现在由计时器触发的脚本也可以处理那些用户共享的文件,但不能处理通过 API.

调用的脚本

我很确定这是一个 Auth 问题,但我在某处遗漏了一些东西。

感谢您的帮助!

更新:

这是调用 API 脚本的脚本代码(为了保密而更改了一些),因为我想知道问题是否可能不在 client/calling 方面。也许我没有正确获取 OAuthToken?或者令牌没有正确的权限?

  var token = ScriptApp.getOAuthToken();
  
  var header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + token,
  };
  
  var parms = [id];
  
  var data = {
    "function": "updateSettings",
    "parameters": parms,
    "devMode": true,
  }
  
  var options = {
    "method":"POST",
    "headers": header,
    "muteHttpExceptions": true,
    "payload": JSON.stringify(data)
  };
  
  // Call the API
  var result = UrlFetchApp.fetch(url, options);

我在联系 Google 后弄明白了,不幸的是没有得到太多帮助,又花了几个小时尝试和研究...

我缺少的是将“oathScopes”添加到 manifest/appsscript.json 文件。我尝试了所需的示波器,并最终得到了如下所示的两个示波器。我通过查看这个答案找到了解决方案:.

在脚本编辑器中,转到 View/Show 清单文件。

这是之前的样子:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

这是现在的样子...

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request"
    ]
}

添加后,我保存了appsscript.json。然后我转到我的 runOnEdit 触发器(调用脚本),删除并 re-added 它。但是,这导致了一个看起来很讨厌的错误:

我查了一下,发现这个 post:Receiving error when creating new trigger on Apps Script。所以,我 运行 脚本编辑器中的代码,它确实调出了授权屏幕。我批准了 re-added 触发器,现在调用 API!

一切正常