在Google Addon(Google App Script)中实现可安装触发器的正确​​方法

Stu*_*own 1 javascript google-sheets google-apps-script

我有一个谷歌应用程序脚本,它作为谷歌表格插件发布。该插件的功能之一是它获取单元格的值,查询 Google Big Query 表,并使用下拉选项填充下一个单元格。\xc2\xa0\xc2\xa0一旦用户选择一个选项另一个查询发送到 Big Query,依此类推。

\n

因为此活动发生在用户编辑单元格\xc2\xa0 时,我认为我需要使用\xc2\xa0 onEdit()\xc2\xa0type 功能。然而,文档明确表明我可以\xe2\x80\x99t用来onEdit()发出需要授权的此类请求(我使用服务帐户),所以我需要使用触发器,并且因为它\xe2\x80\x99s用于附加我需要使用可安装的触发器。

\n

我按照文档\xc2\xa0以编程方式执行此操作

\n
/**\n\xc2\xa0* Creates a trigger for when a spreadsheet opens.\n\xc2\xa0*/\nfunction createSpreadsheetOpenTrigger() {\n\xc2\xa0 var ss = SpreadsheetApp.getActive();\n\xc2\xa0 ScriptApp.newTrigger(\'stu\')\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .forSpreadsheet(ss)\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .onEdit()  //the docs actually is onOpen()\n\xc2\xa0 \xc2\xa0 \xc2\xa0 .create();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

反过来,函数stu从单元格获取值并调用另一个查询 Big Query 的函数:

\n
function stu(e) {\n  var activeCell = e.range;\n  var cellValue = e.value;\n....\n....\nif (wsName === "Targets" && c < 7 && r > 1) {\n    var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Targets");\n    var rowValues = ws.getRange(r, 1, 1, 6).getValues();\n    runQuery(cellValue, r, nextCol, rowValues);  // runQuery executes the BigQuery query\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我遇到了几个问题:

\n
    \n
  1. 当用户安装附加组件时,似乎无法安装可安装的触发器。\xc2\xa0\xc2\xa0为了解决这个问题,我遵循了\xc2\xa0https://stackoverflow.com/questions 上的建议/61314827/install-trigger-for-google-app-script-in-custom-addon\xc2\xa0 并添加了一个菜单项以允许用户安装触发器。

    \n
  2. \n
  3. 我开始收到诸如Exception: This add-on has created too many edit triggers in this document for this Google user account.\xc2\xa0\xc2\xa0之类的错误

    \n
  4. \n
\n

任何人都可以建议我在编辑上创建可安装触发器是否正确

\n
ScriptApp.newTrigger(\'stu\')\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .forSpreadsheet(ss)\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .onEdit()\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .create();\n
Run Code Online (Sandbox Code Playgroud)\n

也许我应该使用

\n
ScriptApp.newTrigger(\'stu\')\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .forSpreadsheet(ss)\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .onOpen()\n    \xc2\xa0 \xc2\xa0 \xc2\xa0 .create();\n
Run Code Online (Sandbox Code Playgroud)\n

然后在函数中将stu功能包装在onEdit()

\n
function stu(e) {\n  onEdit(e) {\n    var activeCell = e.range;\n    var cellValue = e.value;\n   ....\n   ....\n   if (wsName === "Targets" && c < 7 && r > 1) {\n     var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Targets");\n     var rowValues = ws.getRange(r, 1, 1, 6).getValues();\n     runQuery(cellValue, r, nextCol, rowValues);  // runQuery executes the BigQuery \n   query\n  }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我正确使用可安装触发器,我是否应该删除以前的实例以避免Exception: This add-on has created too many edit triggers in this document for this Google user account.\xc2\xa0\xc2\xa0 错误?我可以看到有一种方法可以检查触发器是否存在并酌情删除(也在\xc2\xa0https://developers.google.com/apps-script/guides/triggers/installable#managing_triggers_manually)。\xc2 \xa0\xc2\xa0

\n

我怀疑实际上我从根本上理解了应该如何使用可安装的触发器。我已通读文档,但非常感谢任何建议。\xc2\xa0

\n

Coo*_*per 6

这只会产生一个:

function creatonedittrigger(funcname) {
  if(ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == funcname).length == 0) {
    ScriptApp.newTrigger(funcname).forSpreadsheet(SpreadsheetApp.getActive()).onEdit().create();
  }
}
Run Code Online (Sandbox Code Playgroud)