所以我在使用谷歌电子表格和应用程序脚本编写的应用程序中遇到了问题。我已经整理了一步一步的指导来重现它。
要点: 任何使用SpreadsheetApp.openByUrl()和SpreadsheetApp.openById()的脚本在从脚本编辑器内部调用时都可以正常运行,但是当从内部调用时甚至会在其中包含该脚本的同一电子表格中出现错误。
错误消息:
Error You do not have permission to perform that action. (line ?).
重现它的步骤:
粘贴此代码
function demo1() { return "cat"; } function demo2() { return [["bob", "fred"], ["x", "y"]]; } function demo3() { Logger.log("demo3-1") ss = SpreadsheetApp.openByUrl("[==URL==]") name = ss.getName() Logger.log("demo3-2 " + name) return name } function demo4() { Logger.log("demo4-1") ss = SpreadsheetApp.openById("[==id==]") name = ss.getName() Logger.log("demo4-2 " + name) return name }
更改“[== URL ==]”和“[== id ==]”以引用您自己的文档
保存脚本
从运行菜单中选择 demo1 。这将触发有关特权的问题。授予它要求的特权。 (要求访问您的Google云端硬盘)
返回电子表格本身
设置以下单元格以包含以下公式:
A1 : =demo1() C2 : =demo2() F1 : =demo3() h1 : =demo4()
注意前两个工作,所以电子表格看到脚本项目并能够从中运行代码(因此它有权从该脚本运行代码)但最后两个不工作并抱怨它没有执行该行动的许可。
那么我该如何解决这个问题呢?我做错了什么或存在潜在问题?
答案 0 :(得分:4)
此错误是由于Google最近推出的更改禁止在自定义函数中使用SpreadsheetApp.openByUrl()(或SpreadsheetApp.openById())。 您仍然可以在其他上下文中使用此方法,例如菜单项,触发器等。出于安全原因,Google必须推出此更改,并且无法恢复旧行为。所以唯一可能的修复方法可能就是将函数重写为“普通”GAS函数而不是自定义函数。
问题列在issue tracker。
中答案 1 :(得分:3)
我昨天发现了一个很好的解决方案。希望这个解决方法适合您。
通过SpreadsheetApp文档,我找到了一个函数,它通过提供相应的File
对象来打开电子表格。
以下是章节:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#open(File)
该示例显示您可以轻松搜索Google云端硬盘中的文件类型(本例中为电子表格)。但是,您无需搜索整个云端硬盘库,只需使用DriveApp.getFileById(ID)
即可使用文件/电子表格的ID。
以下是该功能的文档: https://developers.google.com/apps-script/reference/drive/drive-app#getFileById(String)
您需要做的就是:
docs.google.com/spreadsheets/d/{ID}/edit#gid=0
SpreadsheetApp.open(DriveApp.getFileById(ID))
检索您的Spreadsheet
对象拥有该对象后,您可以在此之后进行其他处理。如果这有帮助,请告诉我们。
答案 2 :(得分:2)
我有类似的问题。我切换到使用已安装的触发器来运行我的脚本,而不是使用简单的触发器。
https://developers.google.com/apps-script/guides/triggers/installable
答案 3 :(得分:0)
尝试将其另存为Google API中的Web应用程序的另一个版本。我做到了,它为我工作。