任何人都可以在此代码中看到任何错误
// make new ssheet
var payablesNewDoc=SpreadsheetApp.getActiveSpreadsheet().copy(newName); // NB undocumented function
// Create onEdit trigger for the new Spreadsheet
var onEditTrigger = ScriptApp.newTrigger("onChange")
.forSpreadsheet(payablesNewDoc)
.onEdit()
.create();
Logger.log(onEditTrigger.getHandlerFunction()); // logs "onChange"
Logger.log(onEditTrigger.getEventType()); // logs "ON_EDIT"
它运行时没有错误,两条日志消息似乎表明触发器已创建。但是,当我打开新电子表格并进行编辑时,不会触发任何内容,脚本编辑器也不会显示任何已声明的触发器。
答案 0 :(得分:1)
在这个帖子Is there any way to install an "on edit trigger" in another google docs spreadsheet?
上我看了 “虽然可以为另一个电子表格添加onEdit触发器,但触发器将始终属于创建它的脚本,并且只能在创建它的脚本中运行函数。 - Eric Koleda Jun 30 at 0:05”
也许这就是解释?
答案 1 :(得分:1)
因为在这个实例中你似乎正在制作主机Sheet和脚本的副本,onEdit
可以作为模板脚本中的简单触发器添加,即如此定义的函数:function onEdit() { // do stuff }
。
此功能将与电子表格本身一起复制。
function onEdit() {
// This function being present will automatically add an onEdit trigger
// It can act as a parent for calling any other functions
// e.g. onChange() as per your example
}
如果您可能拥有相同脚本的许多副本,您可以进行一项改进,可以在其他位置调用托管在其他库中的处理函数,以将触发的代码保存在一个位置。如果启用了开发模式的attach the external script as a Library,则此库也将附加到您对原始电子表格所做的任何副本。这将允许您修改触发的代码,而无需打开所有副本
使用处理程序函数创建一个独立的GS脚本,该函数将复制您最初希望触发的函数,因此您需要通过Id传递活动工作表:
function editFunction(event) {
try {
var range = event.source.getActiveSheet().getActiveSelection();
return "cells " + range.getA1Notation() + \
" changed to " + range.getValues().toString() + \
" in \"" + event.source.getName() + \
"\" by " + Session.getEffectiveUser();
} catch (err) {
return err;
}
}
然后在您的模板Spreadsheet中将外部脚本添加为库(例如名为EditLibrary
)。
onEdit()
函数中,只需调用库函数而不是内联函数;将事件详细信息作为参数传递。
function onEdit() {
Browser.msgBox(EditLibrary.editFunction(eventObject));
}
应该做你需要的,而不需要使用triggerBuilder并允许你稍后修改你的代码。