问题描述
每 15 分钟触发一次下面的代码以归档从 Google 表格提供的标签并收到此错误:
异常:服务在一天内调用的次数过多:gmail。 在 archiveThreadsByLabel(archiveOldMessagesByLabelAndCategory:52:24) 在去(archiveOldMessagesByLabelAndCategory:21:15)
任何编辑建议,以便我可以每 15 分钟运行一次?对此非常陌生,因此将不胜感激任何帮助。
谢谢! :)
原文出处: https://github.com/warwickallen/GMail-Archive-old-messages-by-label-and-category
代码:
function go() {
var fname = "Archive old messages by label and category";
var files = DriveApp.getFilesByName(fname);
var spreadsheet;
while ((typeof spreadsheet !== 'object') && files.hasNext())
{
try
{
spreadsheet = SpreadsheetApp.openById(files.next().getId());
}
catch (e)
{
Logger.log("WARNING: " + e.message)
}
}
if (typeof spreadsheet !== 'object')
{
Logger.log("FATAL: Cannot find a Google speadsheet called '" + fname + "'.");
return -1;
}
var count = archiveThreadsByLabel(getSheetData(spreadsheet,"label"));
count += archiveThreadsByCategory(getSheetData(spreadsheet,"category"));
Logger.log("INFO: Archived " + count + " threads.");
}
function getSheetData(spreadsheet,sheet_name)
{
var data_array = spreadsheet.getSheetByName(sheet_name).getDatarange().getValues();
data_array.shift(); // Remove the headings row.
var data_object = new Object;
data_array.forEach(function(datum) {data_object[datum[0]] = datum[1]});
return data_object;
}
function archiveThreadsByLabel(minAgesInHours) {
var blockSize = 50;
var start = 0;
var count = 0;
while (1)
{
var threads = GmailApp.getInBoxThreads(start,blockSize);
if (threads.length < 1) break;
start += threads.length;
for (var label in minAgesInHours)
{
var maxTime = new Date();
var localCount = 0;
maxTime.setTime(maxTime.getTime() - minAgesInHours[label]*3600000);
for (var i = 0; i < threads.length; i++)
if (threads[i].getLastMessageDate() < maxTime)
{
var labels = threads[i].getLabels();
for (var j = 0; j < labels.length; j++)
if (labels[j].getName() == label)
{
Logger.log("INFO:\n " + threads[i].getFirstMessageSubject() + "\n " + threads[i].getLastMessageDate());
threads[i].movetoArchive();
localCount++;
break;
}
}
Logger.log("INFO: Archived " + localCount + " threads labelled '" + label + "' that are older than " + maxTime);
count += localCount;
}
Utilities.sleep(1000); // Google doesn't like it if GmailApp API calls are called too often in a short period of time.
}
return count;
}
function archiveThreadsByCategory(minAgesInHours) {
var blockSize = 50;
var count = 0;
for (var category in minAgesInHours)
{
var start = 0;
var localCount = 0;
var maxTime = new Date();
maxTime.setTime(maxTime.getTime() - minAgesInHours[category]*3600000);
var query = 'in:inBox category:' + category + ' before:' + maxTime.getFullYear() + '-' + (maxTime.getMonth() + 1) + '-' + (maxTime.getDate() + 1);
while (1)
{
var threads = GmailApp.search(query,start,blockSize);
if (threads.length < 1) break;
start += threads.length;
for (var i = 0; i < threads.length; i++)
if (threads[i].getLastMessageDate() < maxTime)
{
Logger.log("\n " + threads[i].getFirstMessageSubject() + "\n " + threads[i].getLastMessageDate());
threads[i].movetoArchive();
localCount++;
}
Utilities.sleep(1000); // Google doesn't like it if GmailApp API calls are called too often in a short period of time.
}
Logger.log("INFO: Archived " + localCount + " threads categoriSAEd as '" + category + "' that are older than " + maxTime);
count += localCount;
}
return count;
}
解决方法
我们在应用脚本中有 quotas。
您的错误意味着您已达到一天内阅读/编写电子邮件的配额。
消费者/免费版为 20000,工作区帐户为 50000。
您可以做的最简单的事情是延长触发间隔,使其不会超过配额。
注意:
- 配额每天都会重置(顾名思义),但我不确定具体时间。
- 使用
MailApp.getRemainingDailyQuota()
检查您的剩余配额。您可以通过在测试脚本中每次执行方法时进行检查来检查哪些方法会影响配额。这样,您就可以估计您的间隔应该是多少,这样您就不会超过它。