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!
一切正常
我有一个 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!
一切正常