1

任何人都可以在这段代码中看到任何错误

  // 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"

它运行没有错误,两条日志消息似乎表明触发器已创建。但是,当我打开新电子表格并进行编辑时,什么都不会触发,脚本编辑器也不会显示任何声明的触发器。

4

2 回答 2

1

在这个线程上 有没有办法在另一个谷歌文档电子表格中安装“编辑触发器”?

我读到“虽然可以为另一个电子表格添加 onEdit 触发器,但触发器将始终属于创建它的脚本,并且只能在创建它的脚本中运行函数。- Eric Koleda Jun 30 at 0:05”

也许这就是解释?

于 2012-12-31T07:01:37.370 回答
1

因为在这种情况下,您似乎正在制作主机工作表和脚本的副本,所以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
}

如果您可能有许多相同脚本的副本浮动,您可以进行一项改进,您可以调用托管在其他地方的库中的处理程序函数,以将触发的代码保存在一个地方。如果您在打开开发模式的情况下将外部脚本附加为库,该库也将附加到您对原始电子表格制作的任何副本。这将允许您修改触发的代码,而无需打开所有副本

制作一个带有处理函数的独立 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;
  }
}

然后在您的模板电子表格中将外部脚本添加为库(例如命名EditLibrary)。

在您的简单onEdit()函数中,只需调用库函数而不是内联的任何内容;将事件详细信息作为参数传递。

function onEdit() {
  Browser.msgBox(EditLibrary.editFunction(eventObject));
}

这应该可以满足您的需要,而无需使用 triggerBuilder 并允许您稍后修改代码。

于 2012-12-31T16:02:38.327 回答