【问题标题】:You do not have permission to call openById您无权调用 openById
【发布时间】:2015-08-15 17:29:56
【问题描述】:

问题:当我运行脚本时,Google 告诉我,

您无权调用 openById

我从另一个 Google 电子表格中复制了一个脚本,更改了 target_ssKey 变量的单元格引用,并在源电子表格和目标电子表格中创建了大小合适的命名范围。

Google Apps 脚本文档没有说明它可能无法正常工作的原因:

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openById%28String%29

另一个 Google Apps 脚本文档说它应该对我有用,因为我从自定义菜单调用它:

https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services

上面的第二个链接说:

如果你的自定义函数抛出错误信息你没有 调用 X 服务的权限。,该服务需要用户授权 因此不能在自定义函数中使用。

要使用上述以外的服务,请创建自定义菜单 运行 Apps Script 函数而不是编写自定义的 功能。从菜单触发的功能将询问用户 必要时进行授权,因此可以使用所有应用程序 脚本服务。

我尝试将函数放入“自定义函数”项目,然后放入“附加”项目,但仍然收到相同的错误消息。

关于我做错了什么以及如何使其发挥作用的任何想法?

这是我的确切代码:

function exportData_SStoSS() {
    //  Get the source data.
    var source_ss = SpreadsheetApp.getActiveSpreadsheet();
    var data = source_ss.getRangeByName("exportData").getValues();

    //  Identify the target.
    var controls_sh = source_ss.getSheetByName("Controls");
    var target_ssKey = controls_sh.getRange('C2').getValue();
    var target_ss = SpreadsheetApp.openById(target_ssKey);

    //  Paste the data to the target.
    target_ss.getRangeByName("importData").setValues(data);
};

【问题讨论】:

  • 问题没有包含足够的细节来重现问题,特别是当从自定义菜单和插件调用函数时(自定义函数无法执行需要权限的方法)跨度>
  • 可能重复No permission to call msgBox in Google Apps Scripting(虽然错误消息与原因不完全相同,并且该问题较旧)

标签: google-apps-script google-sheets google-apps-script-addon google-sheets-custom-function


【解决方案1】:

可以从“空白项目”调用方法 openById,但不能从“表格中的自定义函数”或“Google 表格插件”项目中调用。

我认为“空白项目”会创建一个未连接到我的电子表格的项目,但我错了。空白项目已连接到我的电子表格。我尝试使用的其他类型的项目似乎是脚本项目的有限范围版本,无法执行某些 GAS 方法。

【讨论】:

  • 这些信息有官方来源吗?
  • 就官方来源而言,我可以为您提供的最好的方法是:打开工作表,单击工具 > '脚本编辑器'。您被带到的页面是该工作表的“附加”功能。如果您创建了一个空白项目,此选项将不起作用(但您也将无法使用该方法访问 onEdit 等内容)
【解决方案2】:

我发现了这个官方说明,我相信它可以解决导致问题的原因。

如果您的函数是自定义函数,即可以像工作表本身的常规电子表格函数一样使用,那么它对事物的访问权限有限,无法打开其他电子表格。

同样的脚本可以通过菜单按钮或类似按钮打开其他电子表格。

链接:Documentation at developers.google.com

【讨论】:

    【解决方案3】:

    我想我会抛出一个类似的问题,这让我想到了这个问题,我收到了错误You don't have permission to call by openById

    在我的例子中,我试图从 translate.gs 调用函数,我从这个示例中复制了这些函数:

    https://developers.google.com/apps-script/quickstart/docs

    注意translate.gs的顶部

    /**
     * @OnlyCurrentDoc
     *
     * The above comment directs Apps Script to limit the scope of file
     * access for this add-on. It specifies that this add-on will only
     * attempt to read or modify the files in which the add-on is used,
     * and not all of the user's files. The authorization request message
     * presented to users will reflect this limited scope.
     */
    

    这里的罪魁祸首是@OnlyCurrentDoc 评论。参考这里:

    https://developers.google.com/apps-script/guides/services/authorization

    删除 @OnlyCurrentDoc 为我解决了这个问题

    【讨论】:

    • 删除 @OnlyCurrentDoc 也为我解决了这个问题
    • 好吧,我的应用脚本中没有@OnlyCurrentDoc 标签,但我收到了这个错误。
    • 我删除了@OnlyCurrentDoc,但它并没有为我解决这个问题!
    【解决方案4】:

    我可以通过这个 google 开发者的自动化指南解决这个问题。

    https://developers.google.com/apps-script/concepts/scopes#setting_explicit_scopes

    此条目在json文件中是必需的。

     "oauthScopes": [
          "https://www.googleapis.com/auth/spreadsheets.readonly",
          "https://www.googleapis.com/auth/userinfo.email",
          "https://www.googleapis.com/auth/spreadsheets"
      ],
    

    【讨论】:

    • 这帮助我解决了我的问题,需要将它抱怨的范围添加到项目根目录中的appsscript.json。如果您没有看到此文件,则需要转到项目设置(在左侧导航器中)并选中“在编辑器中显示“appsscript.json”清单文件”复选框。
    【解决方案5】:

    遇到同样的问题,来分享我的解决方案。就我而言,我有两个电子表格,分别称为 A 和 B。两者都使用绑定到每个电子表格的脚本。电子表格 B 能够将数据写入电子表格 A 的选项卡。但电子表格 A 在尝试从电子表格 B 读取数据时不断收到“您无权调用 openById”错误。然后我尝试将其添加为自定义菜单项,但还是一样的问题。

    在我的案例中,解决方案非常简单。我在 script.google.com 中创建了一个新的未绑定脚本,它使用 openById 调用两个电子表格。第一次运行时,我的脸上露出了微笑,因为它要求授权。此后一帆风顺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多