创建程序化触发器会无声地失败

时间:2012-12-31 06:55:05

标签: google-apps-script

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

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

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

2 个答案:

答案 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并允许你稍后修改你的代码。