使用工作表而不是电子表格的基于函数的触发器失败

jwi*_*eke 1 google-sheets google-apps-script

我有两个表格送入同一张纸中,并且每张纸都需要不同的触发器。尝试使用基于函数的触发器来触发,但这不起作用。

该函数的工作原理:

function testTrigger() {
  var sheet = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("myFunction")
    .forSpreadsheet(sheet)
    .onChange()
    .create();
}
Run Code Online (Sandbox Code Playgroud)

这个失败了:

function testTriggerTwo() {
  var sheet = SpreadsheetApp.openById("...").getSheetByName("Responses");
  ScriptApp.newTrigger("myFunction")
    .forSpreadsheet(sheet)
    .onChange()
    .create();
}
Run Code Online (Sandbox Code Playgroud)

“例外:参数 (SpreadsheetApp.Sheet) 与 ScriptApp.TriggerBuilder.forSpreadsheet 的方法签名不匹配。”

有任何想法吗?

Coo*_*per 5

function testTrigger() {
  var sheet = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("myFunction")
    .forSpreadsheet(sheet)//this sheet is a class Spreadsheet
    .create();
}
Run Code Online (Sandbox Code Playgroud)

这个失败了:

function testTriggerTwo() {
  var sheet = SpreadsheetApp.openById("...").getSheetByName("Responses");
  ScriptApp.newTrigger("myFunction")
    .forSpreadsheet(sheet)//this sheet is a class Sheet
    .onChange()
    .create();
}
Run Code Online (Sandbox Code Playgroud)

处理 Google Apps 脚本和 Google 的问题之一是,销售产品的人决定开始使用术语 Sheet 作为电子表格的同义词,但在 Apps 文档表中指的是类似 Excel 的工作表,我猜电子表格指的是到类似 excel 的工作簿。一个是文件,另一个是选项卡。在该函数的第二个版本中,当您应该使用类电子表格时,您正在使用类表。

我建议使用类似的东西来创建触发器,以避免为任何给定函数创建多个触发器的可能性,这可能会产生难以调试的问题。

function testTrigger() {
  const ss = SpreadsheetApp.getActive();
  if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "myFunction").length == 0) {
    ScriptApp.newTrigger("myFunction")
      .forSpreadsheet(ss)
      .onChange()
      .create();
  }
}
Run Code Online (Sandbox Code Playgroud)

通过检查所有项目项目触发器都没有具有相同函数名称的处理程序,您可以确保同一函数没有两个触发器。