【问题标题】:How to get all form triggers (not just for the current script)?如何获取所有表单触发器(不仅仅是当前脚本)?
【发布时间】:2019-04-29 04:15:19
【问题描述】:

我做了以下事情:

  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 周期,或者最坏的情况是会相互干扰),或者它们可能会做完全不同的事情并可能相互冲突。

我想要一种简单的方法来查找将在提交表单时执行的所有脚本触发器。就像函数实际上表现得像我预期的那样......

ScriptApp.getUserTriggers(form) 应该返回类似:

  • sheet1: testFunctionSheet1
  • sheet2: testFunctionSheet2

这样我可以很容易地判断在提交表单时将执行哪些脚本,并且可以手动删除旧的,以确保不会发生冲突。

有没有办法在提交表单时找出哪些触发器将在我的所有脚本中执行?


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

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

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

【问题讨论】:

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


    【解决方案1】:

    似乎没有办法做到这一点,但有一些解决方法可以使事情更有条理:

    1. 不要将表单触发器安装在工作表上,而是将其安装在表单上。如果您养成了这种习惯,您可以轻松判断是否安装了脚本,因为您首先要检查的是表单的脚本。只需像上面尝试的那样运行获取所有触发器命令,它就会起作用。

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

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

    【讨论】:

      【解决方案2】:

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

      这应该会列出来自form 的所有触发器,ID 为ABC。您可以在那里清除过滤器并添加新过滤器。

      【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        相关资源
        最近更新 更多