如何修复此Google Apps脚本上的"Exceeded maximum execution time"错误?



我想设计一个脚本来清理我的电子邮件。我想创建一些名为"自动存档/#天"的标签,其中#是一个介于0和9之间的数字。我在下面写了这个脚本,但每次运行时,我都会收到一个"超过最大执行时间"的错误。

我有一个时间驱动(小时计时器)触发器,设置为每12小时运行一次。我在触发器中调用autoArchive方法。我尝试添加了几次Utilities.sleep,但都无济于事。[我应该把它们放在代码的其他地方吗?]

非常感谢您的帮助!提前谢谢!

function cleanUp(delayDays) {
//var delay2Weeks = 14 // Enter # of days before messages are moved to archive
//var delay2Days = 2 // Enter # of days before messages are moved to archive
  if (typeof delayDays != 'number') {
    return null;
  }
  var maxDate = new Date();
  maxDate.setDate(maxDate.getDate()-delayDays);
  var label = GmailApp.getUserLabelByName("Auto Archive/" + delayDays + " days");
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    if (threads[i].getLastMessageDate()<maxDate)
    {
      var randnumber = Math.random()*5000;
      Utilities.sleep(randnumber);
      Utilities.sleep(randnumber);
      threads[i].moveToArchive();
    }
  }
}

function autoArchive()
{
  for (var i = 1; i < 10; i++) {
     cleanUp(i); 
  }
}

所以我似乎是用"自动存档/X天"获取所有项目,而不是将结果集限制为仅收件箱中的项目。更正后,最大执行时间错误消失了。我先选择收件箱中的项目,然后选择带有标签的项目,从而纠正了这一问题。

function cleanUp(delayDays) {
//var delay2Weeks = 14 // Enter # of days before messages are moved to archive
//var delay2Days = 2 // Enter # of days before messages are moved to archive
  if (typeof delayDays != 'number') {
    return null;
  }
  var maxDate = new Date();
  maxDate.setDate(maxDate.getDate()-delayDays);
  var inboxItems = GmailApp.getInboxThreads(); 
  for (var i = 0; i < inboxItems.length; i++) {
      if (inboxItems[i].getLastMessageDate()<maxDate) {
        var autoItems = inboxItems[i].getLabels();
        for(var j=0; j < autoItems.length; j++) {
          if (autoItems[j].getName() == "Auto Archive/" + delayDays + " days") {
            inboxItems[i].moveToArchive();
            break;
          }
        }
      }
    }  
}

function autoArchive()
{
  Session.getActiveUser().getEmail();
  for (var i = 1; i < 10; i++) {
     cleanUp(i); 
  }
}

有很多方法可以加快速度。对于初学者来说,不要称之为睡眠,因为这会使问题变得更糟(使脚本从你的每日配额中花费更多的时间,并触发5分钟的限制)。之后,如果问题是线程太多,那么写一个要归档的线程列表(例如在scriptdb中存储线程ID)可能会有所帮助,但还没有归档。稍后,从另一个触发器(比如每10分钟)开始,您将按块处理列表(请参阅https://developers.google.com/apps-script/reference/gmail/gmail-app#getThreadById(字符串)),并在需要时使用更多触发器以避免5分钟的限制。

相关内容

最新更新