【问题标题】:Exception: Service invoked too many times for one day: gmail - Gmail Auto Archive例外:一天内调用的服务次数过多:gmail - Gmail 自动存档
【发布时间】:2021-07-08 20:56:02
【问题描述】:

每 15 分钟触发一次代码以归档从谷歌表格提供的标签并收到此错误:

例外:一天内调用的服务次数过多:gmail。 在 archiveThreadsByLabel (archiveOldMessagesByLabelAndCategory:52:24) 在 go(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;
}

【问题讨论】:

    标签: google-apps-script triggers gmail quota


    【解决方案1】:

    我们在应用脚本中有quotas

    你的错误意味着你达到了一天读/写邮件的配额。

    消费者/免费版 20000,工作区帐户 50000。

    您可以做的最简单的事情是延长触发间隔,使其不会超过配额。

    注意:

    • 配额每天都会重置(顾名思义),但我不确定具体时间。
    • 使用MailApp.getRemainingDailyQuota() 检查您的剩余配额。您可以通过在每次在测试脚本中执行方法时检查它来检查哪些方法会影响配额。这样一来,您就可以估计您的间隔应该是多少,这样您就不会超过它。

    【讨论】:

    • 如果每 15 分钟运行一次,它最多只能归档 5-10 封电子邮件。如果这是一个愚蠢的问题,请原谅我,但我怎么可能达到 20,000 个配额?
    • @AmandaM。这根本不是一个愚蠢的问题。 MailAppGmailApp 下所有算作读/写的命令都会增加你的使用量。我还没有找到列出具体方法的文档,但search(读取)、getLastMessageDate(读取)、getFirstMessageSubject(读取)和moveToArchive(写入)因此要么读取要么写入(在某种意义上)每次执行这些方法都会增加您的使用量。详细的测试显示在here。您可能想尝试使用高级服务(Gmail API),因为它基于链接的帖子是独立的
    • MailApp/GmailAppGmail API 结合使用以减少配额压力。另外,请注意配额是每个用户的。如果同一用户下的多个脚本正在使用MailApp/GmailApp 方法,则需要考虑所有这些方法。上面的链接帖子非常有帮助,请尝试查看。请注意,MailApp.getRemainingDailyQuota() 似乎计算并返回了延迟值。根据上面的测试,据说更新前大约 8 小时。我也确认它不是实时配额。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多