【问题标题】:Why does my apps script deployed as API executable return Permission Denied?为什么我的应用程序脚本部署为 API 可执行文件返回 Permission Denied?
【发布时间】:2015-10-03 08:24:15
【问题描述】:

我在脚本编辑器中创建了一个脚本,将其发布为“部署为 API 可执行文件”。在这个脚本中,我为我的工作表提供了一个 doc_id 并定义了一个函数来从该工作表中获取数据。

然后我去https://developers.google.com/apps-script/execution/rest/v1/scripts/run 测试执行API。我添加了范围,授权了应用程序并尝试了它。我收到以下错误消息:

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

谁能告诉我我做错了什么?

【问题讨论】:

  • 您在脚本中使用了什么 API?进行身份验证的用户是否有权使用这些?
  • 我只是在我的脚本中使用电子表格 API,并在 Google 开发者控制台中为我的项目启用了 Drive API 和 Google Apps 脚本执行 API。我还使用 OAuth 2 Playground (developers.google.com/oauthplayground/?code=4/…) 验证了我(身份验证用户)确实具有对该电子表格的读取权限。
  • 这里也一样...有什么反馈吗?
  • 我发现的其他信息是,当我转到我的帐户并列出连接的应用程序时,我可以看到该应用程序,但它不在通过转到服务 > Drive API v2 > 返回的应用程序列表中drive.apps.list (developers.google.com/apis-explorer/?hl=en_US#p/drive/v2/…)。不应该吗?
  • 您是否尝试在您的帐户中删除该应用并重新进行身份验证。在文件 > 项目属性下列出并包含在前端应用程序中的脚本项目中列出的所有范围也很重要

标签: google-apps-script google-apps-script-api


【解决方案1】:

确保应用脚本与正确的开发控制台项目相关联。

该脚本应与与使用的 OAuth 2.0 客户端 ID 对应的开发控制台项目 ID 相关联(此开发控制台项目还应启用“Apps Script Execution API”)。

要更改应用脚本的开发者控制台项目,请选择以下菜单项:资源 > 开发者控制台项目...

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

【讨论】:

  • 我发现我把事情搞混了,因为我使用同一个电子表格来构建一个 Web 应用程序以及一个使用执行 API 的应用程序,而且我在没有仔细注意的情况下做了一些事情。对于 Web 应用程序,脚本详细信息位于与电子表格关联的脚本编辑器中,但对于另一个,它们位于项目中,正如 Farhad 指出的那样。通过仔细检查我所做的一切,我的问题得到了解决。
  • 我不明白,我必须使用 Compute Engine 才能使用 Execution API 还是可以远程调用 Apps Scripts 函数?如果我不需要保护对“运行”链接的访问,这与将项目部署为 Web 应用程序有什么区别?
  • @Nakilon 您必须提供有效的 OAuth 令牌才能使用 API,这需要开发者控制台项目。
  • 啊,完美!谢谢你,法哈德!我已经让这个过程为客户工作,但我没有意识到他的电子表格与不同的项目相关联。我从没想过要去看,谢谢你救了我几天!
  • 您在“项目信息”下的菜单(3个点)中获得项目编号
【解决方案2】:

即使一切正常,您也可以通过"devMode":true 得到该错误。 多亏了这一点,我在尝试为其他用户部署时浪费了半天时间。

仅供参考。

【讨论】:

  • 我认为这是因为您没有以脚本所有者的身份运行。 developers.google.com/apps-script/execution/rest/v1/scripts/… 描述了 devMode 是什么:“如果为 true 并且用户是脚本的所有者,则脚本以最近保存的版本运行,而不是为与 Execution API 一起使用而部署的版本。可选;默认为 false,”但是它不会告诉您您可能会收到权限被拒绝错误。
【解决方案3】:

您只需将服务帐户用户添加为项目的编辑者

要添加的服务帐户的电子邮件如下所示 {project-name}@{project-name}.iam.gserviceaccount.com

【讨论】:

    【解决方案4】:

    我综合了您的所有建议,另外我需要使用项目的非“过时”ID。当我发布脚本时,它会给我一个 ID,只要所有者运行例程,我就会成功使用它,并且只能在 Google Chrome 中使用(如果我在 Edge 上尝试它会失败)。当我发布并与其他用户一起尝试时,它停止工作。我打开脚本,转到文件/项目属性并复制较长的脚本 ID。然后,该例程开始为任何用户工作。在下图中,我用红色强调了仅适用于开发人员的键,并用绿色强调了适用于所有用户的键(它们是有目的的,我的环境是西班牙语,所以实际翻译的选项可能会有所不同,抱歉)

    我认为值得做一个总结:

    1. 我按照“Using the execution API”和quickstarts 的说明将我的脚本发布为执行 API。 (创建脚本,启用 Google Apps 脚本执行 API,发布为 API 可执行文件,每个人都可以访问)
    2. 我让每个人都可以看到脚本,在文件/共享上:
    3. 我确保在我的通话中没有将 devMode 设置为 true。这里的 JavaScript 调用片段:
    4. 我确保在 OAuth 请求期间包含项目中的所有范围:
    5. 我必须等待几分钟才能准备好所有安全权限(即 OAuth 凭据)

    基本上,为了让脚本启动并运行,这些都是我需要遵循的所有必要步骤。希望能帮助到你。最后我想让你看看我在失败和成功时看到了什么:

    谢谢!

    【讨论】:

      【解决方案5】:

      我也遇到了错误,并且所有内容都关联起来......经过一段时间的调查,我发现工作表应该通过链接共享。这是 googleapis v4 的限制。

      【讨论】:

        【解决方案6】:

        我遇到了同样的权限问题,我通过将我的 google sheet 的状态更改为 public 来解决它。现在我可以使用 GET 方法读取数据了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-03
          • 2013-06-07
          相关资源
          最近更新 更多