Google应用脚本基于时间触发循环超时

时间:2014-10-09 16:42:16

标签: google-apps-script google-apps

谷歌应用程序脚本是否有内置机制来防止它怀疑可能编程错误的长循环?我问的原因是我有一个谷歌应用程序脚本,我正在为我的Gmail创建,以控制它。为了避免最大的执行时间错误,我一次只清理100封电子邮件,然后使用基于时间的触发器启动该功能,这将继续,直到没有更多的电子邮件要清理。我有很多邮件要清理,脚本运行大约7次左右,然后就停止了。我已将代码设置为在每个可能的失败或结束点向我发送电子邮件但我没有收到电子邮件,它只是停止。当我查看脚本的触发器时,它们按预期每分钟左右一直到大约7到9日,然后它们就会停止。这是我的代码,但我认为这不是代码问题。

function runcleanup() {
  var unreadthreads = 'label:all label:unread -has:red-star older_than:7d',
    archivethreads = 'label:inbox -has:red-star older_than:14d',
    threads,
    execute;

  try {
    threads = GmailApp.search(unreadthreads, 0, 100);
    Logger.log(threads.length);
    if (threads.length) {
      execute = markasread(threads);
      ScriptApp.newTrigger("runcleanup")
        .timeBased()
        .at(new Date((new Date()).getTime() + 1000 * 15))
        .create();
    } else {
      GmailApp.sendEmail(Session.getActiveUser().getEmail(),
        "troubleshooting script",
        "threads = " + threads.length);
    }
  } catch (e) {
    GmailApp.sendEmail(Session.getActiveUser().getEmail(),
      "troubleshooting script ERROR",
      "error = " + e);
  }
}

function markasread(threads) {
  if (!threads) {
    return false;
  }

  for (var i = 0; i < threads.length; i++) {
    threads[i].markRead();
  }

  return true;
}

function archive(threads, maxDate, delayread) {
  if (!threads) {
    return false;
  }

  for (var i = 0; i < threads.length; i++) {
    threads[i].moveToArchive();
  }

  return true;
}

2 个答案:

答案 0 :(得分:3)

我不同意你自己的答案,我认为这个问题是不同的。

您的脚本正在创建基于时间的触发器,该触发器在15秒后运行该功能,这意味着在一段时间之后您有多个同时运行的同一功能的实例......并且这不是一个好主意。

您将在同一帐户中遇到有关属性和计算请求的其他一些限制的问题。

当使用定时器触发器来防止最大执行时间错误时,通常(和工作)的方法是,当平均执行时间更短超过5分钟时,允许每5分钟执行一次。 / p>

就我个人而言,我每10分钟设置一次触发器并使用tmie测量例程来检查我从不超过5分钟,所以我确定第一次运行已经结束,然后才开始下一次。

可以在this post for example中查看示例,但我发布了许多其他工作示例......

答案 1 :(得分:0)

对于任何好奇的人来说,答案似乎是肯定的。将此添加到我的函数顶部后,脚本可以正常工作

triggers = ScriptApp.getProjectTriggers();
if(triggers.length) {
    ScriptApp.deleteTrigger(triggers[0])
}

当然不应该说这有可能产生无限循环,所以要小心。