【问题标题】:Google Apps Script : not reliable time triggersGoogle Apps 脚本:不可靠的时间触发器
【发布时间】:2013-02-20 04:21:24
【问题描述】:

是否允许像这样在 Google App 脚本中链接时间触发器:

 function doGet(e){   //first invocation by user, HTTP GET 
    if (e == null || e.parameters == null) {
      return ContentService.createTextOutput("EMPTY");
    }

    saveGetParametersForUser(Session.getUser().getEmail(), e);

    //trigger 10 seconds
    var timeTrigger = ScriptApp.newTrigger("timeDrivenEvent").timeBased().after(10 * 1000).create();

 }


function timeDrivenEvent() { //runs until there are some data in ScriptDB
  Logger.log("INVOKED AT " + new Date());

  removeAllPreviousTriggers(); //removes old time triggers

  var somedata = loadTaskData({email: "" + Session.getUser().getEmail()});
  var remainingData = processTaskData(somedata);

    if(remainingData == null){
       return; //we are finished here
    } 

  removePreviousAndSaveRemainingTaskData(remainingData);

  var timeTrigger = ScriptApp.newTrigger("timeDrivenEvent").timeBased().after(10 * 1000).create();

}
  • 用户第一次调用 doGet()
  • 在处理完所有数据之前,脚本会以 10 秒的间隔调用自身(例如,处理 2 分钟,10 秒没有任何反应,然后再处理 2 分钟......)
  • 处理的数据大小约为几千字节,处理时间通常需要 1-2 分钟。

有时脚本被中断并且数据未完全处理,这对我有什么影响!我没有收到任何电子邮件提醒,日志或执行记录中也没有任何内容 - 一切正常。

我开始认为可能 10 秒启动脚本方法相当快,但毕竟它在 API 中......

有什么想法吗? 这是唯一可能的解决方案,如何将大任务分成更小的部分,因为 Google App 脚本的运行时间不能超过 ~ 5-6 分钟(请参阅配额)。

【问题讨论】:

  • 您每天将使用多少总处理时间?
  • 在开发过程中,我每天至少运行 20 次脚本......这不会超过 1 小时/天,这是免费谷歌应用程序的限制。我们确实有 Google Apps for Business(更大的配额)。
  • 我担心您会达到每个脚本的 20 个触发器配额。您提供的代码正在重复创建触发器。所以也许你应该删除以前的触发器?那是ScriptApp.getProjectTriggers()。检查处理函数是否为"timeDrivenEvent",如果使用ScriptApp.deleteTrigger()则删除。
  • 为什么不使用一个每 5 分钟触发一次并在任务完成时被删除的触发器?
  • 不一定,您可以在第一次调用时直接调用该函数而无需使用触发器,第二次(以及随后的)调用将是“定时器触发”。让我们知道您在测试后的结果。

标签: google-apps-script google-api google-apps


【解决方案1】:

按照 cmets 中的建议,使用一个周期性时间触发器效果很好。

我只是想知道为什么时间触发链接不起作用!我做了什么原则打破了 Google App Script 不喜欢那样。

文档:https://developers.google.com/apps-script/class_clocktriggerbuilder

method everyMinutes 将要创建的触发器设置为在传入的分钟数间隔内触发,该间隔必须是 1、5、10、15 或 30 之一。

【讨论】:

  • 感谢更新,很高兴知道它有帮助。
  • 这个新的解决方案带来了新的问题。我将不得不适当地使用一些锁定,因为脚本有时可以同时运行两次(例如,当处理时间大于 1 分钟时,第二个脚本实例开始运行,因为我正在使用 everyMinute(1)。Google App Script 带来了很多对我来说很痛苦。
  • 您可以使用存储在 ScriptProperties 中的标志来允许脚本仅在当前块被处理时运行 - 或者您可以使用 5 分钟触发器来确保没有“重叠”。跨度>
  • @MartinV。更好的可能是使用LockService.getPrivateLock();developers.google.com/apps-script/reference/lock/lock-service
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多