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

Counting emails in gmail with google apps script - for loop limits to 500 iterations

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

除了使用 google 应用程序脚本计算某些统计数据时,如果计数超过 500,for 循环将停止并且 returns 500 除外。

这是 google 应用程序脚本循环的限制吗?反正增加迭代器的限制是这样的吗?

代码如下

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 封电子邮件。

非常感谢您的观看。

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

这将根据您的 queryString 获取所有单独的邮件,这是您在 Gmail 搜索框中输入的内容,因此您可以使用标签等(选中 advanced search for options). See the API reference here. After a quick look, you may want to also use Gmail.Users.Threads.list instead. Check on it here。它似乎工作方式与 Messages 相同(我需要单独的消息而不是线程)。

您一次只能获得 threads/messages 的 1 页(即 100),但是您还会获得带有 theads/messages 的下一页标记,然后您可以将其用作 [=14] =] 瞄准下一页,在我的代码 execProperties.nextPageId = queriedMessages.nextPageToken 中,显然在第一次访问时你不会有 nextPageId.

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