在 Gmail 插件中使用 UrlFetchApp 的权限错误
Posted
技术标签:
【中文标题】在 Gmail 插件中使用 UrlFetchApp 的权限错误【英文标题】:Permissions error using UrlFetchApp in Gmail Add-on 【发布时间】:2018-04-06 00:19:22 【问题描述】:我刚开始尝试构建新的 Gmail 插件,并遇到以下错误消息:
"你没有权限调用 fetch"
在脚本编辑器中测试插件时会发生这种情况,在我的 Gmail 中部署时也会发生这种情况。以下是代码示例:
function getContextualAddOn(e)
var API_KEY = 'TESTKEY';
var URL = 'https://[REDACTED]';
var options =
'method' : 'post',
'contentType': 'application/json',
'headers':
'x-api-key': API_KEY
,
'payload' : JSON.stringify( 'foo': 'bar' )
;
var response = UrlFetchApp.fetch(URL, options);
[more code that builds a card]
如您所见,UrlFetchApp.fetch
的使用非常简单。我是 Apps 脚本的新手,所以我的清单中可能缺少一些权限声明或范围。我尝试了一个更简单的例子,只使用UrlFetchApp.getRequest
,但也失败了“你没有权限调用getRequest
”。
插件的清单与示例中的相同:
"timeZone": "America/New_York",
"dependencies":
,
"exceptionLogging": "STACKDRIVER",
"oauthScopes": [
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.addons.current.message.readonly",
"https://www.googleapis.com/auth/userinfo.email"
],
"urlFetchWhitelist": [
"https://[REDACTED]"
],
"gmail":
"name": "Test Add-On",
"logoUrl": "some url",
"primaryColor": "#4285F4",
"secondaryColor": "#4285F4",
"contextualTriggers": [
"unconditional": ,
"onTriggerFunction": "getContextualAddOn"
],
"version": "TRUSTED_TESTER_V2"
UrlFetchApp
是否应该允许在 Gmail 插件中使用,或者这只是一个错误?我是否需要在清单中添加一些内容或在脚本编辑器中启用其他选项?
【问题讨论】:
尝试在 Simple Trigger 中触发 URL 获取,例如 onOpen 或 onEdit。这种解决方法似乎在SO post 知道如何为 Gmail 插件设置它吗?我认为只有上下文触发。 【参考方案1】:UrlFetchApp
服务需要一个额外的范围,https://www.googleapis.com/auth/script.external_request
。将其添加到您的范围列表中,代码应该可以工作。
每个 Apps 脚本方法所需的范围列在参考文档 (example) 的“授权”部分下。或者,您可以通过暂时删除清单的 oauthScopes
部分并在 文件 > 项目属性 > 范围中查看代码的自动确定范围来发现脚本所需的范围。 (如果您在清单中定义任何范围,这将禁用 Apps 脚本的“自动范围检测”行为。)
参考文献
Setting Scopes Manifest File All Google Scopes【讨论】:
谢谢!这正是缺少的。 请注意,如果您添加新范围,您可能需要通过 OAuth 重新授权。我可以通过将触发器重新添加到项目中来实现这一点,该项目会验证新权限。 在清单文件中设置 oauthScope 后,我仍然得到同样的错误。还有什么我应该做的吗? 即使在设置之后我也遇到了同样的错误。我尝试了简单的触发器、可安装的触发器……这是一场噩梦。【参考方案2】:接受的答案来自 2017 年。我不知道 Google 从那时起是否更改了其授权政策,但简单地向 Project Properties 设置添加新范围是行不通的。 p>
如何触发调用fetch
的函数?。你不能使用简单的触发器来做到这一点。它们会自动触发,因此它们无法访问需要授权的服务。 UrlFetchApp
绝对需要许可。无法通过简单的触发器打开对话框来询问用户的内容。
作为脚本所有者,您可以添加新的授权范围,但是当您与最终用户一起部署此脚本时会发生什么?他们将如何授予脚本对某些不熟悉的服务器进行 API 调用的权限?
要解决此问题,您需要使用可安装的触发器。无论在简单触发器中可用,在可安装触发器中都有等效的。
假设您要在打开电子表格时调用 API。
在脚本编辑器中,转到编辑>>当前项目的触发器并设置一个新触发器。
在运行下,选择您要触发的函数的名称。在 OP 的情况下,它是 getContextualAddOn(e)
函数。
在选择事件源下,选择从电子表格。
在事件类型下,选择打开时。
根据需要配置其他设置并保存。
【讨论】:
【参考方案3】:改用可安装触发器并编写您自己的绑定到可安装触发器的函数。
https://developers.google.com/apps-script/guides/triggers/installable#g_suite_application_triggers
这为我解决了这个问题。
【讨论】:
以上是关于在 Gmail 插件中使用 UrlFetchApp 的权限错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求
UrlFetchApp 请求在菜单函数中失败,但在自定义函数中失败(连接到外部 REST API)
为啥编码标头内容类型:text/html;在 Outlook 插件中使用 MailItem 时缺少 GMAIL 的 SMTP 服务器:SMTP.GMAIL.COM?
Google 应用程序脚本:urlfetchapp - 服务调用次数过多
在 Google 脚本中: UrlFetchApp.fetch(''https://accounts.spotify.com/api/token'') 返回代码 405