SpreadsheetApp.openByUrl 和 openById 给出错误
SpreadsheetApp.openByUrl and openById give errors
所以我在使用 google 电子表格和应用程序脚本编写的应用程序中遇到了问题。我整理了一个分步指南来重现它。
总结:
从脚本编辑器内部调用任何使用 SpreadsheetApp.openByUrl() 和 SpreadsheetApp.openById() 的脚本都可以正常工作,但从内部调用时会出错,即使是包含该脚本的同一个电子表格也是如此。
错误信息:
Error
You do not have permission to perform that action. (line ?).
重现步骤:
- 制作新的 Google 电子表格
- 打开它的脚本编辑器(工具菜单>> 脚本编辑器...)
- 选择空白项目
粘贴此代码
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()
注意前两个工作,所以电子表格看到脚本项目并能够运行从中编码(所以它有权运行 来自该脚本的代码)但最后两个不起作用并抱怨它没有执行该操作的权限。
那么我该如何解决这个问题呢?我是做错了什么还是有潜在的问题?
此错误是由于最近推出的更改 Google 禁止在自定义函数中使用 SpreadsheetApp.openByUrl()(或 SpreadsheetApp.openById())。
您仍然可以在菜单项、触发器等其他上下文中使用此方法。Google 出于安全原因不得不推出此更改,他们将无法恢复到旧行为。因此,唯一可能的解决方法很可能是将函数重写为 'normal' GAS 函数而不是自定义函数。
issue tracker 中列出了该问题。
我昨天确实发现了一个很好且简单的修复方法。希望这个解决方法对您有用。
通过阅读 SpreadsheetApp 文档,我发现了一个通过提供相应的 File
对象来打开电子表格的函数。
这是部分:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#open(File)
该示例表明您可以轻松地在 Google 驱动器中搜索文件类型(在本例中为电子表格)。但是,您可以使用 DriveApp.getFileById(ID)
.
来使用 file/spreadsheet 的 ID,而不是搜索整个云端硬盘库
这是该函数的文档:
https://developers.google.com/apps-script/reference/drive/drive-app#getFileById(String)
您需要做的就是:
- 通过右键单击文件并选择 "Get Link"
在驱动器中找到电子表格的 link
- 复制 link,它应该看起来像这样
docs.google.com/spreadsheets/d/{ID}/edit#gid=0
- 获取 URL
的 ID 部分
- 使用此行
SpreadsheetApp.open(DriveApp.getFileById(ID))
检索您的 Spreadsheet
对象
拿到对象后就可以进行其他处理了。让我们知道这是否有帮助。
我遇到了类似的问题。我改用已安装的触发器 运行 我的脚本,而不是使用简单的触发器。
https://developers.google.com/apps-script/guides/triggers/installable
尝试将其保存为您在 Google API 中的网络应用程序的另一个版本。我做到了,它对我有用。
所以我在使用 google 电子表格和应用程序脚本编写的应用程序中遇到了问题。我整理了一个分步指南来重现它。
总结: 从脚本编辑器内部调用任何使用 SpreadsheetApp.openByUrl() 和 SpreadsheetApp.openById() 的脚本都可以正常工作,但从内部调用时会出错,即使是包含该脚本的同一个电子表格也是如此。
错误信息:
Error You do not have permission to perform that action. (line ?).
重现步骤:
- 制作新的 Google 电子表格
- 打开它的脚本编辑器(工具菜单>> 脚本编辑器...)
- 选择空白项目
粘贴此代码
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()
注意前两个工作,所以电子表格看到脚本项目并能够运行从中编码(所以它有权运行 来自该脚本的代码)但最后两个不起作用并抱怨它没有执行该操作的权限。
那么我该如何解决这个问题呢?我是做错了什么还是有潜在的问题?
此错误是由于最近推出的更改 Google 禁止在自定义函数中使用 SpreadsheetApp.openByUrl()(或 SpreadsheetApp.openById())。 您仍然可以在菜单项、触发器等其他上下文中使用此方法。Google 出于安全原因不得不推出此更改,他们将无法恢复到旧行为。因此,唯一可能的解决方法很可能是将函数重写为 'normal' GAS 函数而不是自定义函数。
issue tracker 中列出了该问题。
我昨天确实发现了一个很好且简单的修复方法。希望这个解决方法对您有用。
通过阅读 SpreadsheetApp 文档,我发现了一个通过提供相应的 File
对象来打开电子表格的函数。
这是部分:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#open(File)
该示例表明您可以轻松地在 Google 驱动器中搜索文件类型(在本例中为电子表格)。但是,您可以使用 DriveApp.getFileById(ID)
.
这是该函数的文档: https://developers.google.com/apps-script/reference/drive/drive-app#getFileById(String)
您需要做的就是:
- 通过右键单击文件并选择 "Get Link" 在驱动器中找到电子表格的 link
- 复制 link,它应该看起来像这样
docs.google.com/spreadsheets/d/{ID}/edit#gid=0
- 获取 URL 的 ID 部分
- 使用此行
SpreadsheetApp.open(DriveApp.getFileById(ID))
检索您的Spreadsheet
对象
拿到对象后就可以进行其他处理了。让我们知道这是否有帮助。
我遇到了类似的问题。我改用已安装的触发器 运行 我的脚本,而不是使用简单的触发器。
https://developers.google.com/apps-script/guides/triggers/installable
尝试将其保存为您在 Google API 中的网络应用程序的另一个版本。我做到了,它对我有用。