使用 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
,因为我可能只是从上一次执行中得到它。
我正在开发一个 运行 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
,因为我可能只是从上一次执行中得到它。