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 ?).
    

重现步骤:

  1. 制作新的 Google 电子表格
  2. 打开它的脚本编辑器(工具菜单>> 脚本编辑器...
  3. 选择空白项目
  4. 粘贴此代码

    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
    }
    
  5. 将“[==URL==]”和“[==id==]”改为引用自己的文档

  6. 保存脚本

  7. 运行 菜单中选择 demo1。这将引发有关特权的问题。授予它它要求的特权。 (要求访问您的 Google 驱动器)

  8. 返回电子表格本身

  9. 将以下单元格设置为具有这些公式:

    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)

您需要做的就是:

  1. 通过右键单击文件并选择 "Get Link"
  2. 在驱动器中找到电子表格的 link
  3. 复制 link,它应该看起来像这样 docs.google.com/spreadsheets/d/{ID}/edit#gid=0
  4. 获取 URL
  5. 的 ID 部分
  6. 使用此行 SpreadsheetApp.open(DriveApp.getFileById(ID)) 检索您的 Spreadsheet 对象

拿到对象后就可以进行其他处理了。让我们知道这是否有帮助。

我遇到了类似的问题。我改用已安装的触发器 运行 我的脚本,而不是使用简单的触发器。

https://developers.google.com/apps-script/guides/triggers/installable

尝试将其保存为您在 Google API 中的网络应用程序的另一个版本。我做到了,它对我有用。