天道酬勤,学无止境

Permissions error when running a script in a Google spreadsheet

We are developing a program that uses Google spreadsheets as the input. The values of the spreadsheet is read, processed and a result is showed in a webpage.

When an user sign up we clone a spreadsheet from a template using a service account. The template has some scripts we want to use to help the user to introduce the values on the spreadsheet.

But the scripts seems to have as the owner the service account, and according to Google scripts belonging to service accounts can not be executed.

The error message is :

Google Apps Script: The script cannot be run because it is owned by a service account. Please copy or transfer the project to a valid account before running.

We transfer the ownership of the spreadsheet from the service account to a gmail user, and if that user creates an script it runs perfectly, but the scripts inherited from the template seems to still has as owner the service account and therefore can not been executed.

My question is ... how exactly can I transfer the ownership of a project (a script) from the service account to another user?

I've googled it and searched on the developer Google spreadsheet site but couldn't find an answer

评论

Short answer as of today:

  • see the doc here
  • make a POST request as follows:
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

where:

  • NEW_OWNER_EMAIL: the email of the new owner
  • YOUR_ACCESS_TOKEN: an access token for the current owner (the service account)
    • using python (my project is in python) I did:
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: the API key that you can generate from the GCP Api and Services section, Ids

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 尝试编辑受保护的工作表时,onEdit 触发的脚本遇到权限错误(Script triggered onEdit runs into permissions error when trying to edit protected sheet)
    问题 我的电子表格的 Google 脚本有问题。 我必须通过资源菜单脚本安装onEdit。 该脚本将一些单元格从不受保护的工作表复制到受保护的工作表。 当我登录到我的帐户(我是电子表格的所有者)时,该脚本运行良好,但在从无法访问受保护工作表的协作者帐户运行时遇到权限错误。 脚本不应该以我(帐户所有者)的身份运行并且不会遇到权限问题吗? 同一电子表格中运行onFormSubmit 的另一个脚本能够在协作者提交表单时编辑受保护的工作表,即使他无法访问受保护的工作表。 这表明问题本身不在于权限,而是特定于 onEdit 触发器,对吗? 回答1 这是预期的行为。 onEdit 触发器是三个“简单触发器”之一。 来自文档:“这些简单的触发器运行以响应 Google 电子表格中的操作,并且它们以活动用户的身份运行。例如,如果 Bob 打开电子表格,则 onOpen 函数将以 Bob 的身份运行,无论是谁将脚本添加到电子表格。出于这个原因,简单触发器在它们被允许做的事情上受到限制: 当电子表格以只读模式打开时,它们无法执行。 他们无法确定当前用户。 他们无法访问任何需要以该用户身份进行身份验证的服务。 例如,谷歌翻译服务是匿名的,可以通过简单的触发器访问。 Google 日历、Gmail 和协作平台不是匿名的,简单的触发器无法访问这些服务。 他们只能修改当前的电子表格。 禁止访问其他电子表格。
  • Google App 脚本错误:您无权调用 getActiveForm?(Google App Script Error: You do not have permission to call getActiveForm?)
    问题 我正在创建一个脚本,该脚本从表单中获取信息并将其写入日历。 当我在脚本编辑器中运行脚本时,它运行良好,从电子表格中获取信息并创建日历事件。 但是,当我填写表单并提交(提交是触发器)时,我收到一条错误消息,指出我无权调用 getActiveForm()。 我拥有表格和日历。 我很欣赏任何想法。 代码 function createEvent() { var calendarToUse = "testing"; var ssUrlToUse ='https://docs.google.com/a/bay.k12.fl.us/spreadsheets /d/1ZTDQL9G5U7RqbbKQbAfb3ERqFwpSsC3EOQxdD1zdQwA/edit#gid=441997215'; /* Get Canalnder*/ var calen = CalendarApp.getCalendarsByName(calendarToUse); var cal = calen[0]; Logger.log(cal.getName()); /* get info from responses*/ var mySS =SpreadsheetApp.openByUrl(ssUrlToUse).getActiveSheet() Logger.log(mySS.getName()); var
  • Script triggered onEdit runs into permissions error when trying to edit protected sheet
    I have a problem with a Google script for a spreadsheet. I have a script installed onEdit through the Resources menu. The script copies some cells from an unprotected sheet to a protected sheet. The script works fine when I'm logged in to my account (I'm the owner of the spreadsheet), but runs into permission errors when run from a collaborator's account who has no access to the protected sheet. Shouldn't the script run as me (the account owner) and not run into permission issues? Another script in the same spreadsheet that runs onFormSubmit is able to edit a protected sheet when a
  • 如何使用 openByID() 在 Google Apps Script 中获得访问外部电子表格的权限 [重复](How to get permission to access an external spreadsheet in Google Apps Script using openByID() [duplicate])
    问题 这个问题在这里已经有了答案: MailApp.sendEmail 错误消息 - “无权调用 sendEmail” [重复] (1 个回答) 去年关闭。 我试图从一个 Google Sheets 电子表格访问数据,以便更新另一个 Google Sheets 电子表格中的条目。 到目前为止,我为完成此任务而编写的代码如下: var ss1 = SpreadsheetApp.openById("123456789").getSheetByName('Sheet1'); function onEdit (e) { var sheet = e.source.getActiveSheet(); sheet.getRange("C4").setValue(ss1.getUrl()); } 但是,当我编辑目标电子表格中的条目以触发脚本时,出现以下错误: 例外:您无权调用 SpreadsheetApp.openById。 所需权限: https://www.googleapis.com/auth/spreadsheets 未知功能 我如何获得运行 openByID() 方法的权限,或者是否有更好的方法来访问外部 Google 表格电子表格的数据? 回答1 /* * The trigger function to call */ function updateOtherSheet(e) {
  • 新的Google表格自定义功能有时会无限期显示“正在加载...”(New Google Sheets custom functions sometimes display “Loading…” indefinitely)
    问题 特定于:仅“ NEW”个Google表格。 google在新表格中突出显示了这是一个已知问题。 问题:如果您在Google表格的google-apps-script中编写复杂的*自定义函数,则有时会遇到单元格,该单元格周围的单元格中显示一个红色错误框,文本为“正在加载...”。 Google建议: 如果发生这种情况,请尝试重新加载页面或重命名功能,并将所有引用更改为新名称。 但是,对于其他遇到此问题的开发人员(并且他们无法摆脱“正在加载...”错误),我在下面的答案中写下了我的发现,以一致地克服这一问题(有限制)。 *我们将此问题视为对Google表格的不确定“错误...正在加载数据”问题的规范答案。 它不仅限于复杂或缓慢的功能。 回答1 我还具有以下功能的无限加载问题。 // check if an item can be checked off function checkedOff( need, have ) { var retStr = "nope"; if( have >= need ){ retStr = "yep"; } return retStr; }; 原来您不应该在结尾加上“;”。 删除分号即可解决问题。 // check if an item can be checked off function checkedOff( need, have ) {
  • How to get permission to access an external spreadsheet in Google Apps Script using openByID() [duplicate]
    This question already has an answer here: MailApp.sendEmail Error Message - "do not have permission to call sendEmail" [duplicate] (1 answer) Closed last year. I'm attempting to access data from one Google Sheets spreadsheet in order to update entries in another Google Sheets spreadsheet. The code I've written to accomplish this so far is as follows: var ss1 = SpreadsheetApp.openById("123456789").getSheetByName('Sheet1'); function onEdit (e) { var sheet = e.source.getActiveSheet(); sheet.getRange("C4").setValue(ss1.getUrl()); } But I'm getting the following error when I edit an entry in the
  • 所需权限:https://www.googleapis.com/auth/spreadsheets(Required permissions: https://www.googleapis.com/auth/spreadsheets)
    问题 我在 appscript 上创建了一个简单的代码来从 URL 中获取 Google Drive 文件名 function FileName (URL) { var ss = SpreadsheetApp.openByUrl(URL); return ss.getName(); } 当我运行时,我收到一个错误: 例外:您无权调用 SpreadsheetApp.openByUrl。 所需权限:https://www.googleapis.com/auth/spreadsheets (linha 6)。 我已经在高级 Google 服务区域启用了 Drive 和 Sheets API,所以“https://www.googleapis.com/auth/spreadsheets”应该没问题,但事实并非如此。 我怎样才能做到这一点? 我在此链接中创建了一个带有问题复制的示例表。 回答1 问题说明: 您正在使用自定义函数。 官方文档里有很好的解释: 如果您的自定义函数抛出错误信息 You don't have permission to call X service.,则该服务需要用户授权,因此无法在自定义函数中使用。 正如消息中明确指出的那样,您不得在自定义函数中使用需要授权的服务,例如SpreadsheetApp.openByUrl(URL) 。
  • Google Apps 脚本禁止从工作表创建日历事件?(Google Apps Script create calendar event from sheet forbidden?)
    问题 在我们公司电子表格中的文档绑定 Google Appscript 中,我创建了一个脚本,可将电子表格行转换为 Google 日历约会。 该功能对我来说很好用,但对我的同事却没有用,即使我们都有编辑日历和更改共享权限的权限,而且我的同事证明他可以从 calendar.google.com 在日历上创建约会。 他在运行脚本时收到以下错误消息: {"message":"Forbidden","name":"GoogleJsonResponseException","fileName":"SCHEDULER","lineNumber":204,"stack":"\tat SCHEDULER:204 (createAppointments)\n"} 第 204 行对应于命令: Calendar.Events.insert(event, CAL, {sendNotifications: true, supportsAttachments:true}); 如果他有日历的编辑权限,为什么会被禁止? Google Apps Script 中的日历服务是否有问题? 更重要的是,我将 CAL 变量更改为我个人创建并以相同权限共享给他的日历。 他可以很好地编辑那个日历。 这是函数的伪代码 function createAppointments() { var CAL = 'companyname
  • How does google know which onsubmit trigger to execute when a form is submitted if you have multiple forms sending responses to a single spreadsheet
    I need clarification from someone. I understand that multiple forms can send their responses to a single spreadsheet in the new Google Sheets. So I created two Google forms and had them both send their responses to a new Google spreadsheet. I then created two scripts in the spreadsheet (not in the forms). Each script is set to trigger when a form is submitted. Here are the two simple scripts. function form2() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); sheet.getRange(sheet.getLastRow(),3).setValue("This is for test 2"); } function form1() { var sheet
  • 如果您有多个表单向单个电子表格发送响应,那么 google 如何知道在提交表单时执行哪个 onsubmit 触发器(How does google know which onsubmit trigger to execute when a form is submitted if you have multiple forms sending responses to a single spreadsheet)
    问题 我需要有人澄清。 我了解多个表单可以将其回复发送到新的 Google 表格中的单个电子表格。 所以我创建了两个 Google 表单,并让它们都将回复发送到一个新的 Google 电子表格。 然后我在电子表格中(而不是在表单中)创建了两个脚本。 每个脚本都设置为在提交表单时触发。 这是两个简单的脚本。 function form2() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); sheet.getRange(sheet.getLastRow(),3).setValue("This is for test 2"); } function form1() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 2"); sheet.getRange(sheet.getLastRow(),3).setValue("This is for test 1"); } 不知何故,谷歌正在为适当的表单运行正确的脚本! 这个怎么可能? 即有人提交form1时自动触发form1(),有人提交form2时自动触发form2()。 所以我的问题是,“Google
  • Google Apps Script Add On google.run.script 作为开发者运行?(Google Apps Script Add On google.run.script runs as developer?)
    问题 我只在 GAS 工作了不到 6 个月。 到目前为止,所有内容都绑定了电子表格项目,但已经创建了很多。 我有一个新的需求,即创建一个人们可以在他们想要的任何电子表格中使用的附加侧边栏(在域中)。 我创建了代码,发布了它,因此只有域可以看到它,并且可以将它作为同一域中的另一个用户安装,所有这些似乎都工作正常。 该问题与sidebar.html有关,并使用google.script.run在我的脚本中调用一个函数来调用一个获取一些外部数据并将其写入当前工作表的函数。 获取外部数据的所有代码都可以正常工作,它们都进入了一个二维数组。 它中断的部分位于SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,1,x,y).setValues(array) 。 我收到“您无权访问请求的文档” 。 我在测试期间做了以下一些事情: 1) 插件脚本最初是作为现有工作表的绑定脚本进行开发的。 考虑到这可能是问题所在,我将该项目重新创建为独立的 GAS,并将其作为工作表的 Web 插件发布。 这并没有什么不同。 2) 开发者可以正常运行插件,没有侧边栏错误。 3) 我为插件创建了另一个菜单项,而不是打开侧边栏并让侧边栏通过 google.script.run 调用该功能,而是直接从菜单中运行该功能。 这样做,它对其他域用户
  • 谷歌电子表格——通过脚本获取共享权限(Google Spreadsheet -- get sharing permissions by script)
    问题 是否可以通过javascript从谷歌电子表格中获取用户和权限列表? 我在共享的谷歌驱动器上有几个电子表格,我想检查一下,如何通过脚本设置共享权限。 我正在与 20 多个其他用户共享这些电子表格,因此很难手动检查每个电子表格。 是否可以? 是否可以在整个谷歌驱动器之上运行一些脚本? 例如,如果我想使用共享权限列表获取驱动器上所有 google spredsheets 和文件夹的列表,我可以在 google 驱动器上方编写一些 javascript 吗? 非常感谢 回答1 免责声明-这是我的第一个 Goolge Apps 脚本,所以我不能 100% 确定这是您想要的。 我使用 DocsList API 列出给定 Google Drive 文件夹中每个电子表格的所有者、编辑者和查看者: function start() { var folder = DocsList.getFolderById("...put folder ID here..."), files = folder.getFilesByType(DocsList.FileType.SPREADSHEET), file = null, spreadsheet = null, owner = null, editors = null, editor = null, viewers = null, viewer =
  • How to authorize scope for GAS to edit Google Spreadsheets
    I have a Powershell script that calls a Google App Script function. When I run the Powershell script I can see the following error on the Error Reporting on my GCP project: Exception: You do not have permission to call SpreadsheetApp.getActiveSpreadsheet. Required permissions: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets) at toSpreadsheet (Código:3) at fromPS (Código:14) I have understood that I have to authorize the scope, so I've been trying to do that by editing the manifest file. The Authorization Scopes Documentation says,
  • Google Apps Script create calendar event from sheet forbidden?
    In a document-bound Google Appscript in one of our company spreadsheets, I've created a script that turns spreadsheet lines into Google calendar appointments. The function works fine for me, but not for my coworker, even though we both have permissions to edit the calendar and change sharing permissions, and my coworker proved he can create appointments on the calendar from calendar.google.com. He gets the following error message when he runs the script: {"message":"Forbidden","name":"GoogleJsonResponseException","fileName":"SCHEDULER","lineNumber":204,"stack":"\tat SCHEDULER:204
  • File.setOwner() 在将所有权转移给编辑器时返回“不允许操作”(File.setOwner() returns "Action not allowed" when Transferring ownership to an Editor)
    问题 我有一个谷歌脚本,用于从谷歌电子表格中存储的数据生成文档。 生成文档后,我尝试将所有者更改为其他 Gmail 帐户,但不断收到以下错误: [15-09-23 09:55:09:480 PDT] File.setOwner([bob@gmail.com]) [1.03 秒] [15-09-23 09:55:09:566 PDT] 执行失败:不允许操作(第 82 行,文件“Helpers”)[5.401 秒总运行时间] 我试图了解为什么我无法使用 Google App Script 更改所有者,但我可以通过 Google Drive 手动更改。 细节: Bob (Bob@gmail.com) 与 Alice (Alice@gmail.com) 共享了他的云端硬盘上的目录。 共享目录中有一个电子表格,用于根据电子表格的内容生成发票。 Alice 使用电子表格(她具有编辑权限)并调用电子表格上的“生成 > 发票”菜单操作来创建发票。 由于她调用了该函数,因此文件是以 Alice 作为所有者创建的,但 Bob 希望成为所有发票的所有者。 Bob 尝试在创建文档后立即使用 Google App Script 设置文档的所有者,但它返回了上面记录的错误。 电子表格内容: | A | B | 1| First Name | Last Name | 2| John | Doe | 谷歌应用脚​
  • Google Apps Script Add On google.run.script runs as developer?
    I've only been working in GAS for a little under 6 months. Everything thus far has been bound spreadsheet projects, but have created quite a few. I have a new need to create an add-on sidebar that people can use in any spreadsheet they want (in a domain). I created the code, published it so only the domain can see it, and can install it as another user in the same domain, all of that seems to work fine. The issue has to do with the sidebar.html, and calling a function in my script using google.script.run to call a function that gets some external data and writes it to the current sheet. All
  • 尝试访问谷歌应用程序脚本编辑器时没有此类用户(No Such User when trying to access google apps script editor)
    问题 在我的 Google 电子表格中,当我转到“工具->脚本编辑器..”时,我看到一个页面显示“没有这样的用户”错误。 知道如何解决这个问题吗? 我认为这可能是权限问题,但不确定如何在需要时更改权限。 回答1 最后我意外地找到了解决方案。 通过将 GoogleAppsScript 作为驱动器的一部分来解决该问题。 在您的网络浏览器中打开 Google 云端硬盘。 单击新建 > 更多 > + 连接更多应用程序,然后选择 GoogleAppsScript。 一旦我这样做回到我的电子表格的脚本编辑器,就不会再出现任何错误。 这是包含此步骤的链接:- https://developers.google.com/drive/v2/web/quickstart/apps-script 尝试运行脚本时,还有关于无效 OAuth 客户端的其他问题。 这是我面临的,因为每个应用程序脚本都必须附加到 Google Cloud 项目。 这仅可由最初创建文件的人访问,即使在团队驱动器中之后也是如此。 在这种情况下,您需要通过进入 File->Make a copy 来制作应用程序脚本的副本。 然后在资源下拉菜单中,您将看到 Cloud Platform 项目,单击它后,您现在可以提供您在 console.cloud.google.com 上创建的 Google Cloud Platform
  • Google Apps Script send email through spreadsheet not working
    I have a problem with some Google Script stuff. Basically, my goal is to have the script check to see if a client's case was resolved and then send an email to them that the issue has been resolved. I've gotten the logic done on when to send an email, but every time I try and implement it into the spreadsheet, I get the error: Error You do not have permission to call MailApp.sendEmail. Required permissions: https://www.googleapis.com/auth/script.send_mail (line 8). I've got a simple function to test the functionality of it, and when run in the script editor it works fine, but not on the
  • 如何让未授权用户保护电子表格(How to enable not authorized users to protect the spreadsheet)
    问题 在我们的团队中,我们有以下场景:我们正在使用带有一些受保护区域的谷歌电子表格(主要是不能被覆盖的公式 - 只有“管理员”,在我们的例子中是我,可以编辑它们)。 其他输入字段不受保护。 每个团队成员都可以输入他们的数据。 在某个时间点(冲刺结束),我们的项目经理需要报告电子表格中的数字。 为确保数字不会在之后发生更改,他们希望查看整个工作表。 对于下一个冲刺,我们创建一个新的电子表格。 我添加了一个应用程序脚本(下面的代码)并将其分配给一个按钮,他们可以单击该按钮来锁定工作表(或至少是人们输入数据的重要范围)。 如果我单击按钮,一切正常。 但如果他们这样做,他们会得到一个例外:“例外:您正在尝试编辑受保护的单元格或对象。如果您需要编辑,请联系电子表格所有者以取消保护。” 我尝试了各种选项,设置范围保护,工作表保护,删除我作为编辑器,将它们作为编辑器添加到保护等。但在所有情况下,只要调用保护功能(例如 addEditor()),出现这个异常。 知道如何使它成为可能,以便基本上每个人都可以单击按钮并锁定整个工作表吗? 在我的功能之下。 这个例子使用了 sheet.protect(),但我也尝试了范围保护,只是为了更容易理解我在说什么;) function lockSheet() { var me = Session.getEffectiveUser(); var as =
  • 在脚本中复制 Google 电子表格 + 与相同用户共享(Copy Google Spreadsheet + Share with same users in script)
    问题 我已经在互联网上搜索了几天,但似乎无法找到解决我的问题的方法。 我对编程的了解有限,但如果我能让它工作,它会做很多很棒的事情。 解释:我需要使用电子表格 A 中的脚本制作模板电子表格的副本,并将模板的所有权限复制到副本中(特别是名称和受保护的范围)。 我正在使用 SheetSpider。 截至目前,我可以创建模板的副本,但 SheetSpider 似乎放弃了模板具有的权限,并使用您在设置过程中定义的用户重写它们。 相反,我只想复制模板文件的权限。 这似乎很棘手,因为电子表格的常规副本仍然不会带来名称和受保护范围设置的权限,就像您转到“文件”>“复制电子表格”并选中“并与相同用户共享”框一样" 这确实保留了受保护的范围设置。 同样,我对编程的了解非常有限,但我想我已经查明了似乎删除和重置权限的行。 我已经尝试使用下面的几天来让它单独保留权限,但无济于事。 任何帮助或指导将不胜感激! 谢谢! function checkFixFileACLs(file, approvedViewers, approvedEditors) { var viewers = file.getViewers().join(","); viewers = viewers.split(","); var editors = file.getEditors().join(","); editors =