问题描述
问题
如何从一个由 onEdit 命令触发的连接脚本编辑两个不同的电子表格?
我的案例
我正在尝试创建一个主电子表格,用于向另外两个电子表格发送和删除信息。我有一个 onEdit 功能,一旦选中一个复选框,它就会将指定的信息发送到另一个工作表。
我的尝试
为了打开另一个电子表格,我首先尝试了 openByID 函数,但通过一些研究,我认为不可能通过绑定到电子表格的脚本编辑另一个电子表格。所以我创建了一个独立的脚本(名为 MasterF),我将其部署为一个库来存储我的函数,以便我以后可以调用它。我将该库添加到主电子表格并使用它来调用该函数,但它不断抛出错误,提示“您无权调用 SpreadsheetApp.openById”。我的所有应用程序脚本都拥有编辑、删除等的完全权限。我还从绑定到我想要连接的其他电子表格的脚本中创建了库,并将这些库添加到 MasterF 库中以查看是否有帮助。尽管尝试使用独立脚本,但在打开编辑功能时我仍然收到相同的错误消息。也许我错过了什么,或者我完全有可能做不到我想做的事情。
脚本
这是我创建的自定义函数的开始。本质上,当 onEdit 函数被触发时,“提交”表中的电子表格 1 中的数据将传输到“仪表板”表中的电子表格 2。
function DataSend() {
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var submit = ss.getSheetByName("Submit");
var selldata = submit.getRange('E23:I23').getValues();
//@NotOnlyCurrentDoc
var dash = app.openById(<sheetid>).getSheetByName("Dashboard");
这是绑定到电子表格 1(不是 MasterF 库的直接一部分)的脚本中的 onEdit 函数,该函数触发保存在 MasterF 库中的数据发送函数。
function onEdit(e) {
var sheetName = "Submit"
var range = e.range;
if (range.getSheet().getSheetName() == sheetName && range.getA1Notation() == 'K23' && range.isChecked()) {
MasterF.DataSend();
}
}
解决方法
要从一个由 onEdit 命令触发的连接脚本编辑两个不同的电子表格,您需要安装触发器。一个简单的触发器没有编辑多个电子表格所需的权限。 Ref。在我的问题中,我试图使用一个独立的脚本和多个库。这是不必要的。从单个脚本编辑多个电子表格所需的只是一个可安装的触发器。
就我而言,我使用以下函数来创建可安装的触发器:
function EditTrigger() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ScriptApp.newTrigger('Edit')
.forSpreadsheet(ss)
.onEdit()
.create();
}
'Edit' 是我用来检测第一个电子表格中所做更改的 onEdit 函数的名称。如果 onEdit 函数中的 If 语句为真,则它运行一个单独的函数来编辑两个不同的电子表格。编写 EditTrigger() 函数后,在应用程序脚本中手动运行它并在必要时接受权限。现在,当 onEdit 函数 ('Edit') 被触发时,它应该能够编辑多个电子表格。