【问题标题】:How to create a new clock trigger on another document如何在另一个文档上创建新的时钟触发器
【发布时间】:2019-05-29 15:17:51
【问题描述】:

我有 30 多个用户,每个用户都有自己的电子表格。每个用户的绑定脚本都引用了一个自定义库脚本,我用它来保持代码集中且易于更新。

我正在尝试使用应用程序脚本来创建在特定时间运行特定功能的触发器。但是,我不知道如何指定时钟触发器安装在哪个脚本文档上。

这是我首先尝试的:

createTimeTrigger("sendTimesheetsToHeads",1440);

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .create();
}

上述代码在库文件中,但由于用户正在运行代码,因此它将触发器安装在用户的容器绑定脚本文件上,而不是库文件上。当触发器运行时,它会失败,因为触发器使用了库中用户没有直接引用的函数。

我需要能够以编程方式在独立库脚本文件上安装触发器,就像我可以手动执行的操作一样。因此,在查看了应用程序脚本文档 (https://developers.google.com/apps-script/reference/script/trigger-builder#forDocument(String)) 后,我找到了触发器构建器的 forDocument() 函数并尝试了这个:

createTimeTrigger("sendTimesheetsToHeads",1440);

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .forDocument(<library script id here>)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .create();
}

但上面的代码会产生以下错误:“TypeError: Cannot find function timeBased in object DocumentTriggerBuilder.”

然后我尝试切换顺序:

function createTimeTrigger(functionToRun,minutesToWait) {
  ScriptApp.newTrigger(functionToRun)
  .timeBased()
  .at(new Date(new Date().getTime()+minutesToWait*60*1000))
  .forDocument(<library script id here>)
  .create();
}

并收到此错误:“TypeError: Cannot find function forDocument in object ClockTriggerBuilder。”看起来 forDocument() 和 timeBased() 函数在触发器构建器中不兼容?

是否可以使用应用程序脚本执行我的要求?

【问题讨论】:

    标签: google-apps-script document eventtrigger


    【解决方案1】:

    请再次查看TriggerBuilder reference - 您的函数createTimeTrigger() 应该创建两个 触发器,一个带有timeBased(),另一个带有forDocument()。这两种方法在调用时会返回不同的类实例 - 分别为 ClockTriggerBuilderDocumentTriggerBuilder(所以,您的第一个问题的答案是 - 是的,它们不兼容

    包装函数

    第一种方法假设您可以访问用户文档的应用程序脚本项目,或者可以将wrapperInDoc() 函数添加到文档中(保留此解决方案以防有人需要):

    1. 用户运行你的库脚本yourLib.createTimeTrigger();
    2. 基于时间的触发器将安装在用户文档上;
    3. 基于时间的触发器触发库中的函数

    您的库函数应该创建一个触发器来运行 包装函数,其名称对于所有引用库中 目标函数 的用户文档都是通用的。像这样:

    库范围示例

    function createTimeTrigger(functionToRun,minutesToWait) {
      ScriptApp.newTrigger('wrapperInDoc').timeBased().at(yourCond).create();
    }
    
    function wrapperInLib() {
      sendTimesheetsToHeads(); //function calls go here;
    }
    

    文档范围示例

    function wrapperInDoc() {
      yourLib.wrapperInLib();
    }
    

    自调用库

    正如 cmets 中所阐明的,您希望:

    1. 用户运行你的库脚本yourLib.createTimeTrigger();
    2. createTimeTrigger()yourLib 上安装基于时间的触发器
    3. 基于时间的触发器触发库中的函数

    容器绑定示例

    function testLib() {
     var r = PG.createTimeTrigger(); //PG is how I named lib in my project;
     //do anything else;
    }
    

    库示例

    我设置了从“现在”到触发的 1 分钟的任意偏移量,只需根据需要创建您的触发。此外,请确保您的脚本作为 WebApp 发布,并且任何人,甚至匿名 访问都设置在它上面(这应该没问题,因为您将它用作库)。您应该使用部署 URL 进行提取(带有 /exec 的那个)。

    /**
     * Runs on a get request;
     * @param {Object} e event object;
     * @returns {Content} text output to conform to being a web app;
     */
    function doGet(e) {
      createTrigger();
      return ContentService.createTextOutput('success!');
    }
    
    /**
     * Self-run library project;
     */
    function createTimeTrigger() {
      UrlFetchApp.fetch('yourLibraryUrl');
    }
    
    /**
     * Create trigger on self;
     */
    function createTrigger() {
      var tr = ScriptApp.newTrigger('doSomething');
          tr.timeBased().at(new Date(new Date().valueOf()+60000)).create();
    }
    
    /**
     * Actual trigger callback;
     */
    function doSomething() {
      //do something;
    }
    

    【讨论】:

    • 感谢@Oleg Valter 的回复。为了澄清,我需要: 1)用户运行库脚本 yourLib.createTimeTrigger(); 2)要安装在 LIBRARY 文档上的基于时间的触发器(这是一个独立的脚本文件,其中包含我在应用程序脚本仪表板中手动安装的其他触发器); 3) 基于时间的触发器来触发库中的函数;我想避免在用户容器绑定脚本中创建包装函数,因为将来管理和更新会很麻烦。
    • 在这种情况下,可能会更容易,等等,需要测试一些东西!
    • 解决了所有问题,将在一分钟内更新答案!
    • 顺便说一句,这是一个需要思考的问题!希望这对你有用 - 我在我的“游乐场”项目中测试了这个解决方案,工作正常。
    • 这是有道理的。谢谢奥列格!
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多