Google apps script 应用程序脚本GmailApp.search与gmail界面中的搜索不一致

Google apps script 应用程序脚本GmailApp.search与gmail界面中的搜索不一致,google-apps-script,gmail,Google Apps Script,Gmail,我正在尝试构建一个google应用程序脚本,将从在线表单收到的邮件导入电子表格 我使用了两个标签:一个是通过gmail过滤器添加的“to_process”,另一个是在电子邮件添加到工作表后通过此脚本添加的“processed”。 我正在使用搜索查询标签:to_process搜索所有有“to_process”但未“processed”的电子邮件!标签:在中处理:全部' 我让它部分工作(见下面脚本的核心部分) 我正在使用脚本编辑器运行函数运行脚本 问题是,在gmail界面中使用相同的查询,我收到了1

我正在尝试构建一个google应用程序脚本,将从在线表单收到的邮件导入电子表格

我使用了两个标签:一个是通过gmail过滤器添加的“to_process”,另一个是在电子邮件添加到工作表后通过此脚本添加的“processed”。
我正在使用搜索查询标签:to_process搜索所有有“to_process”但未“processed”的电子邮件!标签:在中处理:全部'

我让它部分工作(见下面脚本的核心部分)
我正在使用脚本编辑器运行函数运行脚本

问题是,在gmail界面中使用相同的查询,我收到了100多封电子邮件,但在脚本日志中,我收到了6封,它们都得到了处理。 我错过什么了吗

function extractInfo() {
  var step = 30;
  var max = 500;
  var currentStep = 0;
  while(max--) {
    var threads = GmailApp.search('label:to_process !label:processed in:all', currentStep++ * step, step);
    if(threads.length == 0) break;
    Logger.log("-------- found threads: " + threads.length);
    var threadId = threads.length;

    while(threadId--) {
      var thread = threads[threadId];
      thread.refresh();
      if(hasLabel(thread, "processed")) {
        Logger.log("was processed: " + thread.getPermalink())
        continue;
      }
      if(!hasLabel(thread, "to_process")) {
        Logger.log("isn't mark to process: " + thread.getPermalink())
        continue;
      }
      var messages = thread.getMessages(); 
      var messageId = messages.length;
      while(messageId--) {
        var message = messages[messageId];
        var row = extractMessageData(message);
        sheet.appendRow(row);
        GmailApp.markMessageRead(message);
      }
      threads[threadId].addLabel(processedLabel);
    }
  }
}

function hasLabel(thread, name) {
  var labels = thread.getLabels();
  var l = labels.length;
  while(l--) {
    if(labels[l].getName() == name) {
      return true;
    }
  }
  return false;
}

经过多次尝试和错误,我部分地解决了这个问题

我在gmail ui中看到的实际上是消息,而不是线程。但处理标签是每线程的事情。 我只是从一个给定的标签中提取所有线程的所有消息,然后处理这些消息

如果一个线程有一个标签“processed”,这并不意味着它的所有消息都被处理了,这是一个问题


关于我在UI中看到的消息数量以及我使用API得到的消息数量,仍然存在不一致。

UI还显示线程,当您打开线程时,您可以看到消息。使用搜索功能,我能够获得与UI相同数量的线程。你所说的差异是什么?我尝试了很多变化。问题中描述的一个直接记录后面的线程数(我得到8个)。如果我在UI中输入相同的搜索,然后单击复选框选择所有消息(包括其他页面),我会得到更多的消息(大约200条)。但是,如果我获取所有线程对象(8个线程)并将它们的所有消息聚合在一起,我会得到大约300个。当在查询中仅使用“label:to_process”时,是否仍会得到不一致的线程数?是的,搜索在ui和脚本中返回的项目数不相同。另一种方法是(只是为了检查为什么会获得不同数量的线程)您可以获得标签,然后从该标签中获得线程:GmailApp.getUserLabels()['to_process label']的索引。getThreads()。尝试此方法,看看是否仍然获得不同数量的线程。