【问题标题】:"Exception: This script has too many triggers" when creating a time-based trigger创建基于时间的触发器时出现“异常:此脚本的触发器太多”
【发布时间】:2020-06-16 06:56:04
【问题描述】:

您好,我是 Google Apps 脚本的初学者。我收到一个错误:

异常:此脚本有太多触发器。

即使我只有 1 个触发器:

ScriptApp.newTrigger("Status()").timeBased().atDate(2021, 2, 1).create();

我实际上正在考虑使用更多时间驱动的触发器,但我尝试了 1 并出现此错误。你知道发生了什么吗?


当 Web 应用程序启动时,总​​是会创建新的触发器。有什么方法可以在访问 Web App 时保留触发器而不创建另一个触发器?

【问题讨论】:

  • 一开始我以为这是复制品,但你说你只创建了一个。你确定吗? triggers tab 对当前脚本的触发器数量有何看法?请更新问题以包括如何设置(安装)触发器
  • 哇,我只是检查了一下,显然每次我尝试运行触发器时,它都会保存为触发器。解决了,谢谢!
  • 没问题 - 很常见的问题。您不需要多次安装触发器,该功能应该只运行一次,但您已经想通了 - 祝你好运!
  • @OlegValter 谢谢!但是,显然我刚刚遇到了另一个问题,所以每次我从链接启动 Google Web App 时,都会创建触发器。这就是我的太多触发器错误的原因。有什么方法可以在 Web 应用访问时保留触发器而不创建另一个触发器?
  • 没问题。雷,请更新问题,以澄清问题是由您在上面的评论中描述的内容引起的。

标签: google-apps-script triggers


【解决方案1】:

问题

每次打开 Web 应用时安装一个新触发器。

确保只安装一个触发器实例

下面的示例是一个实用程序,用于检查可安装触发器是否已经到位或需要安装。根据您的喜好配置它,并在每次 Web 应用打开时使用doGet 触发器运行。

/**
 * @summary gets or installs a trigger
 * @param {string} callbackName
 * @param {GoogleAppsScript.Script.EventType} type
 * @param {function} installer
 */
const getOrIntallTrigger = (callbackName, type, installer) =>

    /**
     * @returns {?GoogleAppsScript.Script.Trigger}
     */
    () => {

        console.log(`Checking for triggered ${callbackName} function`);

        const ss = SpreadsheetApp.getActiveSpreadsheet();

        const triggers = ScriptApp.getUserTriggers(ss);

        const found = triggers
            .filter(trigger => trigger.getEventType() === type && trigger.getHandlerFunction() === callbackName);

        const [trigger] = found;

        !trigger && installer();

        return trigger;
    };

备注

  1. 要使此功能正常工作,您需要拥有V8 runtime enabled 并舒适地使用with ES6 syntax

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多