如何获取所有表单触发器(不仅仅是针对当前脚本)?

时间:2019-04-29 04:15:20

标签: javascript google-apps-script google-form

我做了以下事情:

  1. 创建了Google表单(例如,表单ID = ABC)
  2. 创建了Google表格(我们称其为sheet1)

在sheet1的脚本编辑器中,使用以下代码将触发器安装到我的表单中:

var form = FormApp.openById("ABC");
ScriptApp.newTrigger("testFunctionSheet1").forForm(form).onFormSubmit().create();

当我拨打以下电话时,我看到我的触发器已正确安装:

ScriptApp.getUserTriggers(form);

一切都很棒。每当提交Google表单时,我都可以执行代码。

问题是,稍后我继续创建一个新的Google表格(我们将其命名为sheet2),其代码类似:

ScriptApp.newTrigger("testFunctionSheet2").forForm(form).onFormSubmit().create();

为了安全起见,我尝试从所有旧脚本(即sheet1)中删除所有以前的触发器。但是,当我运行时:

ScriptApp.getUserTriggers(form);

...它返回一个结果(testFunctionSheet2),而不是同时返回testFunctionSheet1testFunctionSheet2。原来,它仅返回当前脚本执行的触发器!

这是有问题的,因为这可能意味着我不小心有许多脚本都在提交表单时执行。如果我从未写下过针对哪种形式执行的脚本,那么我将不知道每次提交的内容究竟是什么。其中一些脚本可能执行相同的操作(最好是浪费CPU周期,或者在最坏的情况下会互相干扰),或者可能执行完全不同的操作并可能相互冲突。

我想要一种简单的方法来查找将在表单提交时执行的 all 脚本触发器。就像该函数的实际行为符合我的预期...

ScriptApp.getUserTriggers(form)应该返回以下内容:

  • sheet1testFunctionSheet1
  • sheet2testFunctionSheet2

这样,我可以轻松判断提交表单后将执行哪些脚本,并可以手动删除旧脚本,以确保不会发生冲突。

是否可以找到提交表单后将在我所有脚本中执行的触发器?


更新getUserTriggers()的文档阐明,它将永远不会为不同脚本返回触发器:

  

以给定格式获取此用户拥有的所有可安装触发器,仅适用于此脚本或附加组件。 此方法不能用于查看附加到其他脚本的触发器

那么,我如何知道与给定Google表单相关的所有触发器?注意:这不一定是编程解决方案。如果Forms中有一个UI元素可以为我提供此信息,那也足够。

3 个答案:

答案 0 :(得分:3)

似乎没有办法做到这一点,但是有一些变通办法可以使事情更有条理:

  1. 与其将表单触发器安装在工作表上,不如将其安装在表单上。如果您养成了这种习惯,则可以轻松判断是否已安装脚本,因为您要检查的第一位在表单的脚本中。只需像上面尝试的那样运行get all tr​​iggers命令,它就会起作用。

  2. 不是在表单上安装表单触发器,而是将表单设置为向表单提交其响应,并在SpreadsheetTriggerBuilder中使用onFormSubmit()方法。要找出与表单关联的触发器,只需打开表单,然后转到目的地,然后查看该脚本是否具有表单触发器即可。

  3. 将触发器脚本名称隐藏在您不打算显示给用户的表单的某些属性中(例如customClosedFormMessage)。将其设置为类似This script has an active trigger associated with sheet1.的内容。您可以创建一个帮助器函数,该函数在安装触发器之前可以确保那里不存在文本(例如,如果您希望每个表单限制为1个触发器)。

答案 1 :(得分:2)

转到https://script.google.com/home/triggers?trigger_type=3&document_id=ABC

这应该列出ID为form的{​​{1}}的所有触发器。您可以在那里清除过滤器并添加新的过滤器。

答案 2 :(得分:1)

正如问题中已经提到的OP,文档中说一个脚本无法获取其他脚本创建的触发器。

如果您是唯一一个从脚本项目创建触发器的人,请转到https://script.google.com>触发器,您将在其中找到由您的帐户创建的所有触发器的列表。

我还没有尝试过,但是我认为一种替代方法是在创建触发器的项目中启用Google Apps Script API,并添加要通过Google Apps Script API调用的函数以将触发器“记录在某处”由该项目创建。

关于“在某处登录”,更简单的设置是将日志通过电子邮件发送给“活动用户”。