使用谷歌应用程序脚本计算Gmail中的电子邮件 - 循环限制为500次迭代

时间:2016-11-27 04:19:29

标签: 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 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);
}

示例输出:

[16-11-26 19:59:35:548 PST] 497.0
[16-11-26 19:59:35:601 PST] 498.0
[16-11-26 19:59:35:652 PST] 499.0
[16-11-26 19:59:35:652 PST] FINAL REPLY RATE:499

如果计算的时间超过一天,则最终回复率总是为499.但是,当我计算一天结果为386时,似乎没有计算超过499的任何一天。

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

非常感谢您一看。

2 个答案:

答案 0 :(得分:1)

问题是你可以获得的最大线程数是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。

答案 1 :(得分:1)

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

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

这将根据您在Gmail搜索框中输入的queryString获取所有单个邮件,以便您可以使用标签等。(选中advanced search选项)。请参阅API参考here。快速查看后,您可能还想使用Gmail.Users.Threads.list。检查here。它似乎与Messages的工作方式相同(我需要单独的消息而不是线程)。

您一次只能获得1页的主题/消息(这是100),但是您还会获得带有theads /消息的下一页令牌,您可以将其用作'pageToken':来瞄准在我的代码execProperties.nextPageId = queriedMessages.nextPageToken中的下一页显然在第一次使用时您将没有nextPageId

我还建议设置一个超时程序,因为我发现你会通过收到大量的电子邮件轻松地超过6分钟。我所做的是让它检查一个循环平均执行多长时间,如果我剩下更少的时间(我使用5分钟标记以防万一)再执行1次,我将所有内容存储在脚本属性中,设置一个触发1分钟后,然后终止脚本。这就是为什么你看到execProperties.nextPageId,因为我可能只是从之前的执行中获得它。