SpreadsheetApp.openByUrl和openById会出错

时间:2015-08-18 16:31:48

标签: google-apps-script google-sheets google-docs

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

要点: 任何使用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()
    
  10. 注意前两个工作,所以电子表格看到脚本项目并能够从中运行代码(因此它有权从该脚本运行代码)但最后两个不工作并抱怨它没有执行该行动的许可。

    那么我该如何解决这个问题呢?我做错了什么或存在潜在问题?

4 个答案:

答案 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)

您需要做的就是:

  1. 右键单击文件并选择"获取链接"
  2. ,在驱动器中找到电子表格的链接
  3. 复制链接,该链接应如下docs.google.com/spreadsheets/d/{ID}/edit#gid=0
  4. 获取网址的ID部分
  5. 使用此行SpreadsheetApp.open(DriveApp.getFileById(ID))检索您的Spreadsheet对象
  6. 拥有该对象后,您可以在此之后进行其他处理。如果这有帮助,请告诉我们。

答案 2 :(得分:2)

我有类似的问题。我切换到使用已安装的触发器来运行我的脚本,而不是使用简单的触发器。

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

答案 3 :(得分:0)

尝试将其另存为Google API中的Web应用程序的另一个版本。我做到了,它为我工作。