31

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

您无权调用 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 脚本函数的自定义菜单,而不是编写自定义函数。如果需要,从菜单触发的功能会要求用户授权,因此可以使用所有 Apps 脚本服务。

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

关于我做错了什么以及如何做到这一点的任何想法?

这是我的确切代码:

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);
};
4

5 回答 5

27

我想我会抛出一个类似的问题,这让我想到了这个问题,我收到了错误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为我解决了这个问题

于 2018-05-22T02:21:57.003 回答
13

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

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

然而,相同的脚本可以从菜单按钮或类似按钮打开其他电子表格。

链接:developers.google.com 上的文档

于 2017-10-10T07:28:28.870 回答
11

我可以用这个谷歌开发者的自动化指南解决这个问题。

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"
  ],
于 2021-05-02T02:56:18.297 回答
2

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

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

于 2015-06-02T04:51:29.317 回答
1

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

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

于 2021-08-04T01:15:58.343 回答