在 Gmail 附加组件中使用 UrlFetchApp 时出现权限错误

Permissions error using UrlFetchApp in Gmail Add-on

我刚开始尝试构建新的 Gmail 插件,运行 收到以下错误消息:

"You do not have permission to call 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 Script 的新手,所以我的清单中可能缺少一些权限声明或范围。我尝试了一个更简单的例子,只使用 UrlFetchApp.getRequest,但是 "You do not have permission to call 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 加载项中使用,或者这只是一个错误?我是否需要在我的清单中添加一些东西或在脚本编辑器中启用一些其他选项?

UrlFetchApp 服务需要一个额外的范围,https://www.googleapis.com/auth/script.external_request。将它添加到您的范围列表,代码应该可以工作。

每个 Apps 脚本方法所需的范围列在参考文档 (example) 的 "Authorization" 部分下。或者,您可以通过暂时删除清单的 oauthScopes 部分并在 File > Project properties > Scopes[=28= 中查看代码自动确定的范围来发现脚本所需的范围]. (如果您在清单中定义任何范围,这将禁用 Apps 脚本的 "automatic scope detection" 行为。)

参考资料

改为使用可安装触发器并编写您自己的绑定到可安装触发器的函数。

https://developers.google.com/apps-script/guides/triggers/installable#g_suite_application_triggers

这解决了我的问题。

接受的答案是从 2017 年开始的。我不知道 Google 从那时起是否更改了其授权策略,只是简单地向 Project Properties[=43= 添加了一个新范围] 设置将不起作用。

如何触发调用fetch的函数?您不能使用简单的触发器来做到这一点。它们会自动启动,因此无法访问需要授权的服务。 UrlFetchApp 绝对需要许可。无法使用简单的触发器打开对话框来询问用户的内容。

作为脚本所有者,您可以添加新的授权范围,但是当您将此脚本部署到最终用户时会发生什么情况?他们将如何授予脚本对某些不熟悉的服务器进行 API 调用的权限?

要解决这个问题,您需要使用可安装的触发器。无论简单触发器中有什么,可安装触发器中都有等效项。

假设您要在打开电子表格时调用 API。

从脚本编辑器中,转到编辑>>当前项目的触发器并设置一个新触发器。

  • 运行下,select您要触发的函数的名称。在 OP 的例子中,它是 getContextualAddOn(e) 函数。

  • Select事件源下,选择来自电子表格。

  • 事件类型下,选择打开时。

  • 根据需要配置其他设置并保存。