SpreadsheetApp.openByUrl 和 openById 给出错误

Mad*_*d G 3 google-docs google-sheets google-apps-script

所以我在使用谷歌电子表格和应用程序脚本编写的应用程序中遇到了问题。我已经整理了一个分步指南来重现它。

总结: 任何使用 SpreadsheetApp.openByUrl() 和 SpreadsheetApp.openById() 的脚本在从脚本编辑器内部调用时都可以正常工作,但从内部调用时会出现错误,即使是包含该脚本的同一个电子表格。

错误信息:

错误
    您无权执行该操作。(线 ?)。
    

重现它的步骤:

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

    功能演示1(){
      返回“猫”;
    }
    
    功能演示2(){
      返回 [["bob", "fred"], ["x", "y"]];
    }
    
    功能演示3(){
      Logger.log("demo3-1")
      ss = SpreadsheetApp.openByUrl("[==URL==]")
      名称 = ss.getName()
      Logger.log("demo3-2" + 名称)
      返回名称
    }
    
    功能演示4(){
      Logger.log("demo4-1")
      ss = SpreadsheetApp.openById("[==id==]")
      名称 = ss.getName()
      Logger.log("demo4-2" + 名称)
      返回名称
    }
    
  5. 将“[==URL==]”和“[==id==]”更改为引用您自己的文档

  6. 保存脚本

  7. 运行菜单中选择demo1。这将引发一个关于权限的问题。授予它所要求的特权。(要求访问您的 Google 云端硬盘)

  8. 回到电子表格本身

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

    A1:=演示1()
    C2:=演示2()
    F1:=演示3()
    h1:=演示4()
    

请注意,前两个工作,因此电子表格看到脚本项目并能够从中运行代码(因此它有权从该脚本运行代码)但后两个不起作用并抱怨它没有权限执行那个动作。

那么我该如何解决这个问题?我做错了什么还是有潜在的问题?

Hec*_* S. 8

我昨天实际上发现了一个很好且简单的解决方法。希望此解决方法适合您。

通过阅读SpreadsheetApp文档,我发现了一个通过提供相应File对象来打开电子表格的函数。

这是该部分:https :
//developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#open(File)

该示例表明您可以轻松地在 Google Drive 中搜索文件类型(在本例中为电子表格)。但是,您无需搜索整个 Drive 库,而只需使用文件/电子表格的 ID 即可DriveApp.getFileById(ID)

这是该功能的文档:https : //developers.google.com/apps-script/reference/drive/drive-app#getFileById(String)

您需要做的就是:

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

拥有对象后,您可以进行其他处理。如果这有帮助,请告诉我们。


JPV*_*JPV 7

此错误是由于 Google 最近推出的一项更改,禁止在自定义函数中使用 SpreadsheetApp.openByUrl()(或 SpreadsheetApp.openById()。您仍然可以从其他上下文(如菜单项、触发器等)中使用此方法。Google出于安全原因不得不推出此更改,他们将无法恢复到旧行为。因此,唯一可能的解决方法很可能是将该函数重写为“正常”GAS 函数而不是自定义函数.

问题在问题跟踪器中列出。