Google apps script 创建一个编程触发器失败

Google apps script 创建一个编程触发器失败,google-apps-script,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")

有人能看出这个代码有什么错误吗

  // 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"
它运行时没有错误,两条日志消息似乎表明触发器已创建。但是,当我打开新的电子表格并进行编辑时,不会触发任何操作,脚本编辑器也不会显示任何声明的触发器。

在这个线程上

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


也许这就是解释?

因为在本例中,您似乎正在制作主机工作表和脚本的副本,
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;
  }
}
然后在模板电子表格中将外部脚本添加为库(例如名为
editbrary

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

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

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

这篇文章很棒,还有一些好建议。然而,我之所以使用显式触发器,而不是隐式onEdit(),是因为我发现onEdit并不总是被触发。它可能是被触发的——困难在于隐式触发器中的失败似乎总是无声地发生。值得将全部内容包装在一个try:catch中,根据您的用例,邮件失败或显示在电子表格浏览器消息中。我发现try:catch-in触发器对于跟踪整个“事务”是否已执行是至关重要的。我认为这是正确的答案,但我接受@Jonathon作为解决方法中的有用建议。出于同样的原因,我已经提高了您的自我回答