服务帐户可以调用 Google Apps Script Execution API 吗?

Posted

技术标签:

【中文标题】服务帐户可以调用 Google Apps Script Execution API 吗?【英文标题】:Can the Google Apps Script Execution API be called by a service account? 【发布时间】:2016-01-23 05:22:13 【问题描述】:

我想使用 service account 通过 Apps 脚本 Execution API 访问 Google 表格,但从文档中不清楚这是否受支持。

我尝试过的步骤(导致 Execution API 出现 403 状态)是:

    创建一个新的(未绑定的)Apps 脚本 访问链接的开发者控制台项目 启用执行 API 在同一项目中创建一个新的服务帐户(下载 生成的 JSON 文件) 创建一个新的 Google 表格并与服务帐户的 电子邮件地址(这是我最不确定的步骤) 编写一个从电子表格中读取的应用脚本函数 从脚本编辑器手动运行脚本(设置范围 在脚本上正确) 发布脚本(“部署为 API 可执行文件”),使其可访问 对“任何人” 使用服务帐户和范围创建一个新的 OAuth2 令牌 链接到脚本(在我们的例子中只是 'https://www.googleapis.com/auth/spreadsheets') 尝试使用令牌调用 Execution API

这是我得到的回复:


  "error": 
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  

这是否不起作用,因为服务帐户永远无法访问执行 API?还是上面的步骤有问题?

【问题讨论】:

您可能错过了令牌上的 google 脚本执行 api 范围 谢谢 - 我试图找到这样的范围,但我找不到。 OAuth 2.0 Scopes for Google APIs 列表中的唯一一个用于通过 Execution API 访问服务,而不是用于 Execution API 本身。我还发现文档说“在应用程序代码中,为 API 调用生成一个 OAuth 访问令牌。这不是 API 本身使用的令牌,而是脚本需要的令牌。” - 我读到(可能是错误的)意思是身份断言是针对脚本使用的服务的。 答案是否解决了您的问题? 可以将执行 API 与服务帐户一起使用吗? 这里有同样的问题。项目和脚本的 id 相同。启用 API 执行。用户可以访问脚本,但仍有问题。 @StephenL 你有没有找到解决这个问题的方法?我目前遇到了同样的问题。 【参考方案1】:

您最初的 403 错误表明您为服务帐户设置了错误的身份验证。但是,即使您能够正常工作,截至目前(2015 年 11 月 10 日),您无法通过服务帐户执行 Apps 脚本。

这是一个已知错误,正在应用程序脚本Issue Tracker 中进行跟踪。

【讨论】:

不幸的是,这是正确的答案。我花了大约 3 天的毫无意义的试验才在这里找到这个答案。感谢@Party Ark 终于让我走上了正轨。 @Jpsy 好奇您是否曾经设法解决跟踪问题所描述的 400 错误?我也面临这个问题,但继续得到 403,我有理由确定我的身份验证是正确的。【参考方案2】:

目前(2020 年),服务帐户无法使用 Apps 脚本 API。如documentation所写,

警告:Apps Script API 不适用于服务帐户。

【讨论】:

原作者询问通过 Google 服务帐户调用时,部署为 Execution API 的 Google Apps 脚本是否可访问。 Apps Script API 与部署为 Execution API 的自定义 Apps Script 完全不同。 @ariestav OP 在他的问题中链接了 [Execution API],这是一个直接链接到我的答案中链接的 Apps 脚本 api 页面。 我明白了,是的,你是对的。 Apps Script API 是链接的,而不是 Execution API 上的文档。 我不认为它们是两个不同的 api【参考方案3】:

您的问题可能是脚本关联了错误的项目(即它自己的项目,而不是与您的服务帐户关联的项目)。以下是您需要做的:

从脚本编辑器中选择以下菜单项:Resources > Developer Console Project

在此屏幕上输入您的开发控制台的项目编号。

cfthis answer

【讨论】:

谢谢。恐怕不是这样 - 我正在使用的开发者控制台项目是使用 Apps 脚本自动创建的,并且服务帐户与同一个项目相关联。 在这种情况下,我建议从开发者控制台创建一个新项目,启用相关 API(可能只是 Google Apps Script Execution API 和 Google Drive API),在该项目下生成一个新服务帐户,并将您的脚本(或其副本)传输到该项目。 另外,您是否使用“部署为 API 可执行文件”对话框中提供的 API ID 来调用脚本?您必须使用它而不是工作表本身的 ID。

以上是关于服务帐户可以调用 Google Apps Script Execution API 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Apps 帐户登录时,在 Android 上对 Google Play 游戏服务进行身份验证会导致错误

使用 nodejs 中的服务帐户域范围委派通过 Google Apps Gmail 发送邮件

如何找到我的 Google Apps 帐户的不可变 ID?

允许匿名访问 Google Apps Script Web 应用程序(Google Apps 帐户)

通过 Google Apps 帐户通过 C# 发送电子邮件

通过C#通过Google Apps帐户发送电子邮件