Google apps script 使用谷歌应用程序脚本计算gmail中的电子邮件,循环次数限制为500次

Google apps script 使用谷歌应用程序脚本计算gmail中的电子邮件,循环次数限制为500次,google-apps-script,gmail,Google Apps Script,Gmail,我正在开发一个在gmail上运行收件箱分析的小应用程序。我使用的gmail帐户是一个付费的谷歌应用程序帐户 除了使用谷歌应用程序脚本计算某些统计数据时,如果计数超过500,则for循环停止并返回500 这是谷歌应用程序脚本循环的限制吗?是否有增加迭代器限制的方法 下面是代码 var DAYS_TO_SEARCH = 10; // look only in sent messages from last 7 days, otherwise script takes a while var SING

我正在开发一个在gmail上运行收件箱分析的小应用程序。我使用的gmail帐户是一个付费的谷歌应用程序帐户

除了使用谷歌应用程序脚本计算某些统计数据时,如果计数超过500,则for循环停止并返回500

这是谷歌应用程序脚本循环的限制吗?是否有增加迭代器限制的方法

下面是代码

var DAYS_TO_SEARCH = 10; // look only in sent messages from last 7 days, otherwise script takes a while
var SINGLE_MESSAGE_ONLY = false; // exclude multi-message conversations where I sent the last message? 
var NO_REPLY = 0;

function label_messages_without_response() {
  var emailAddress = Session.getEffectiveUser().getEmail();
  Logger.log(emailAddress);
  var EMAIL_REGEX = /[a-zA-Z0-9\._\-]+@[a-zA-Z0-9\.\-]+\.[a-z\.A-Z]+/g;
  var label = GmailApp.createLabel("AwaitingResponse");
  var d = new Date();
  d.setDate(d.getDate() - DAYS_TO_SEARCH);
  var dateString = d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate();
  threads = GmailApp.search("in:Sent after:" + dateString);
  for (var i = 0; i < threads.length; i++)
  {
    var thread = threads[i];
    if (!SINGLE_MESSAGE_ONLY || thread.getMessageCount() == 1)
    {
      var lastMessage = thread.getMessages()[thread.getMessageCount()-1];
      lastMessageSender = lastMessage.getFrom().match(EMAIL_REGEX)[0];
      if (lastMessageSender == emailAddress)
      {
      NO_REPLY ++;
      Logger.log(NO_REPLY);


      }
    }
  }
  Logger.log("FINAL REPLY RATE:" + NO_REPLY);
}
如果计算超过一天,最终回复率始终为499。然而,当我仅仅计算一天的结果是386,似乎任何超过499的东西都没有计算出来

注意*我每天从这个帐户发送300到700封电子邮件


非常感谢您的关注。

问题是您可以获得的最大线程数是500,作为检查,您可以尝试以下方法:

function threads (){
 var threads = GmailApp.search("in:Sent"); 
  Logger.log(threads.length);
}
日志将显示500,即使您有更多

解决方案是分500批进行:

threads = GmailApp.search("in:Sent after:" + dateString, start, max);

注意上面的最大值不能超过500。

处理大量电子邮件时,最好使用Gmail API。我有一个脚本,可以获取开始日期和结束日期之间的所有电子邮件,并将接收日期、收件人、发件人和标题输出到电子表格中

queriedMessages =
      Gmail.Users.Messages.list(userInfo.mail, {
        'q': queryString,
        'pageToken': execProperties.nextPageId
      });
这将根据您在Gmail搜索框中输入的查询字符串获取所有单独的消息,因此您可以使用标签等。检查选项。请参阅API参考。快速浏览之后,您可能还想改用Gmail.Users.Threads.list。检查一下。它的工作方式似乎与我需要单独消息而不是线程的方式相同

您一次只能获得1页线程/消息,即100,但是您还可以获得带有ADS/messages的下一页标记,您可以将其用作“pageToken”:指向下一页,在我的代码execProperties.nextPageId=queriedMessages.nextPageToken中,显然在第一次尝试时,您将没有下一页标记

我还建议你设置一个超时程序,因为我发现你会很容易地收到大量的电子邮件,超过6分钟。我要做的是让它检查一个循环执行平均需要多长时间,如果我剩下的时间少了,我会用5分钟标记,以防再执行一次,我会将所有内容存储在脚本属性中,设置一个触发器,等待1分钟,然后终止脚本。这就是为什么您会看到execProperties.nextPageId,因为我可能刚刚从上一次执行中看到它

queriedMessages =
      Gmail.Users.Messages.list(userInfo.mail, {
        'q': queryString,
        'pageToken': execProperties.nextPageId
      });