我做了以下事情:
在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
),而不是同时返回testFunctionSheet1
和testFunctionSheet2
。原来,它仅返回当前脚本执行的触发器!
这是有问题的,因为这可能意味着我不小心有许多脚本都在提交表单时执行。如果我从未写下过针对哪种形式执行的脚本,那么我将不知道每次提交的内容究竟是什么。其中一些脚本可能执行相同的操作(最好是浪费CPU周期,或者在最坏的情况下会互相干扰),或者可能执行完全不同的操作并可能相互冲突。
我想要一种简单的方法来查找将在表单提交时执行的 all 脚本触发器。就像该函数的实际行为符合我的预期...
即ScriptApp.getUserTriggers(form)
应该返回以下内容:
sheet1
:testFunctionSheet1
sheet2
:testFunctionSheet2
这样,我可以轻松判断提交表单后将执行哪些脚本,并可以手动删除旧脚本,以确保不会发生冲突。
是否可以找到提交表单后将在我所有脚本中执行的触发器?
更新:getUserTriggers()
的文档阐明,它将永远不会为不同脚本返回触发器:
以给定格式获取此用户拥有的所有可安装触发器,仅适用于此脚本或附加组件。 此方法不能用于查看附加到其他脚本的触发器。
那么,我如何知道与给定Google表单相关的所有触发器?注意:这不一定是编程解决方案。如果Forms中有一个UI元素可以为我提供此信息,那也足够。
答案 0 :(得分:3)
似乎没有办法做到这一点,但是有一些变通办法可以使事情更有条理:
与其将表单触发器安装在工作表上,不如将其安装在表单上。如果您养成了这种习惯,则可以轻松判断是否已安装脚本,因为您要检查的第一位在表单的脚本中。只需像上面尝试的那样运行get all triggers命令,它就会起作用。
不是在表单上安装表单触发器,而是将表单设置为向表单提交其响应,并在SpreadsheetTriggerBuilder中使用onFormSubmit()方法。要找出与表单关联的触发器,只需打开表单,然后转到目的地,然后查看该脚本是否具有表单触发器即可。
将触发器脚本名称隐藏在您不打算显示给用户的表单的某些属性中(例如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调用的函数以将触发器“记录在某处”由该项目创建。
关于“在某处登录”,更简单的设置是将日志通过电子邮件发送给“活动用户”。