【问题标题】:Permissions error when running a script in a Google spreadsheet在 Google 电子表格中运行脚本时出现权限错误
【发布时间】:2016-10-05 18:45:13
【问题描述】:

我们正在开发一个使用 Google 电子表格作为输入的程序。读取、处理电子表格的值并将结果显示在网页中。

当用户注册时,我们使用服务帐户从模板中克隆电子表格。该模板有一些我们想用来帮助用户在电子表格中介绍值的脚本。

但脚本似乎拥有服务帐户的所有者,并且根据 Google 属于服务帐户的脚本无法执行。

错误信息是:

Google Apps 脚本:该脚本无法运行,因为它归服务帐户所有。运行前请将项目复制或转移到有效账号。

我们将电子表格的所有权从服务帐户转移给 gmail 用户,如果该用户创建了一个脚本,它可以完美运行,但是从模板继承的脚本似乎仍然拥有服务帐户的所有者,因此不能被处决了。

我的问题是......我如何将项目(脚本)的所有权从服务帐户转移给另一个用户?

我用谷歌搜索并在开发者 Google 电子表格网站上搜索,但找不到答案

【问题讨论】:

  • 脚本在电子表格中吗?似乎脚本未附加到电子表格本身,问题在于脚本文件本身属于服务帐户。如果您有 Google Apps 脚本文件,则将该文件的所有权转移到 Google 帐户。或者更好的是,如果它是从 Web 应用程序启动的,请确保将其设置为执行作为访问 Web 应用程序的用户(通常默认为 me
  • @Vytautas 我通过打开工具 | 在模板上创建了脚本。脚本编辑器 |创建一个新项目,所以我总是将脚本附加到电子表格中。我认为问题在于从模板克隆会创建一个新的电子表格,其中脚本属于服务帐户。由于我不知道如何将脚本项目的所有权转移到谷歌帐户,所以我被卡住了。
  • 用户如何启动脚本?是通过网络应用程序运行它还是他们打开电子表格并从那里运行它?
  • @Vytautas 用户打开电子表格,然后脚本应该运行
  • 你不会对triggers 限制身份验证有问题吗? onOpen 不知道谁在运行会话。您可以尝试转移脚本所有权的另一件事是转到Resources → Developers Console Project → Click link at the top,然后转到 IAM&Admin 并在那里更改所有者。我能想到的就这些了。

标签: google-apps-script google-sheets google-drive-api google-cloud-iam


【解决方案1】:

截至今天的简短回答:

  • 参见文档here
  • 按如下方式发出 POST 请求:
curl --request POST \
  'https://www.googleapis.com/drive/v3/files/1_AVYCjzIATBg2OmK6CzgXXy8hB-GsLxoIKCHEqyndhs/permissions?emailMessage=[NEW_OWNER_EMAIL]&sendNotificationEmail=true&transferOwnership=true&alt=json&key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"role":"owner","type":"user","emailAddress":[NEW_OWNER_EMAIL]}' \
  --compressed

地点:

  • NEW_OWNER_EMAIL:新主人的邮箱
  • YOUR_ACCESS_TOKEN:当前所有者(服务帐户)的访问令牌
    • 使用python(我的项目在python中)我做到了:
import json
from oauth2client.service_account import ServiceAccountCredentials

json_secret = json.load(open("client-secret.json"))
scope = ["https://www.googleapis.com/auth/drive"]
credentials = ServiceAccountCredentials.from_json_keyfile_dict(json_secret, scope)
token = credentials.get_access_token()[0]
print(token)
  • YOUR_API_KEY:您可以从 GCP Api 和服务部分生成的 API 密钥,Ids

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多