I'm trying to copy a range from one sheet to another (whilst preserving the formulas). I wrote a simple script using 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);
}
Which I call as followed:
=copyRangeAcrossSheets("TEST_source","A1:A3","TEST_target","A1:A3")
And I'm getting the below error:
You do not have the permission to call copyTo
I did some digging around and found that functions have to use special triggers (installable) in order to modify another file. However here I'm modifying the same file.
Q1: Why is copyTo
failing here?
Q2: How can I workaround the issue without having to define installable triggers? (I just want to copy ranges whilst preserving formulas)
答案 0 :(得分:1)
为什么会失败?
您无法通过自定义功能修改其他任何需要授权的文档。原因是您的函数是以匿名用户身份执行的,无法获得编辑其他工作表或文档的必要授权。
参考:https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services
具体到你就是这个片段:
电子表格:只读(可以使用大多数get *()方法,但不能设置*())。 无法打开其他电子表格(SpreadsheetApp.openById()或SpreadsheetApp.openByUrl())。
此外:
如果您的自定义函数抛出错误消息"您无权调用X服务。" ,该服务需要用户授权,因此无法在自定义中使用功能
你如何解决这个问题?
编写通过触发器或手动执行的应用脚本功能,您可以使用onEdit
或onChange
触发器或基于时间的触发器。您甚至可以在需要时在Apps Script IDE中手动运行该功能。这是Apps脚本的预期行为。
答案 1 :(得分:0)
不确定您的数据是否在源电子表格中保持不变,但您始终可以使用内置的IMPORTRANGE()
功能。语法是:
=IMPORTRANGE("SPREADSHEET_ID","SOURCE_SHEET!RANGE_START:RANGE_END")
SPREADSHEET_ID
是您正在处理的文件的ID。