0

我正在尝试将范围从一张纸复制到另一张纸(同时保留公式)。我写了一个简单的脚本使用copyTo

function copyRangeAcrossSheets(source_sheet,source_range,target_sheet,target_range) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var source_sheet = spreadsheet.getSheetByName(source_sheet);
  var target_sheet = spreadsheet.getSheetByName(target_sheet);
  var source_range = source_sheet.getRange(source_range);
  var target_range = target_sheet.getRange(target_range);
  source_range.copyTo(target_range);
}

我称之为如下:

=copyRangeAcrossSheets("TEST_source","A1:A3","TEST_target","A1:A3")

我收到以下错误:

您无权调用 copyTo

我做了一些挖掘,发现函数必须使用特殊触发器(可安装)才能修改另一个文件。但是在这里我正在修改同一个文件。

Q1:为什么copyTo在这里失败?

Q2:如何在无需定义可安装触发器的情况下解决该问题?(我只想在保留公式的同时复制范围)

4

2 回答 2

1

为什么会失败?

您不能通过自定义功能修改其他任何需要授权的文档。原因是您的功能是作为匿名用户执行的,无法获得必要的授权来编辑您的其他工作表或文档。

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

具体到你是这个片段:

电子表格:只读(可以使用大多数 get*() 方法,但不能使用 set*())。无法打开其他电子表格(SpreadsheetApp.openById() 或 SpreadsheetApp.openByUrl())。

还:

如果您的自定义函数抛出错误消息“您无权调用 X 服务”。,该服务需要用户授权,因此不能在自定义功能中使用。

你怎么能解决这个问题?

编写一个通过触发器或手动执行的 Apps Script 函数,您可以使用onEditonChange触发器,或基于时间的触发器。您甚至可以在需要时在 Apps Script IDE 中手动运行该函数。这是 Apps 脚本的预期行为。

于 2016-04-25T09:57:58.990 回答
1

不确定您的数据是否在源电子表格中持久存在,但您始终可以使用内置IMPORTRANGE()函数。语法是:

=IMPORTRANGE("SPREADSHEET_ID","SOURCE_SHEET!RANGE_START:RANGE_END")

SPREADSHEET_ID您正在处理的文件的 ID 在哪里。

于 2016-04-25T23:34:33.923 回答