我正在开发一个小应用程序来在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封电子邮件。
非常感谢您一看。
答案 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
,因为我可能只是从之前的执行中获得它。