Google Apps 脚本 - GmailApp.search 日期提供的结果与 gmail 搜索的结果不同?

Google Apps Script - GmailApp.search dates don't give same results as gmail search?

所以,我有这个代码

function readEmails()
{
 
  var threads = GmailApp.search('label:"Typed Reports/Security Reports" after:2022/3/25')
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1")
  var subject;
  var messages;
  var body;
  for(i = threads.length-1; i >= 0; i--)
  {
    Logger.log(i)
    subject = threads[i].getFirstMessageSubject()
    messages = threads[i].getMessages()
    for(j = threads[i].getMessageCount()-1; j >= 0; j--)
    {
      Logger.log(j)
      body = messages[j].getPlainBody()
      sheet.insertRowBefore(2);
      sheet.getRange("A2").setValue(subject)
      sheet.getRange("B2").setValue(body)
    }
  }
  
}

在 gmail 的设置中,我关闭了对话视图。 运行 在 gmail 中查询 label:"Typed Reports/Security Reports" after:2022/3/25,它 returns 47 封邮件。

运行 代码,returns 80 行充满了消息。

所以我交叉比较了两个输出。

该代码提供了 gmail 搜索所做的一切,加上所有 23 日和 24 日(减去 23 日分别在美国东部时间 7:05pm 和 9:20am 收到的两条消息(晚上 11:05和 1:20pm UTC),所以相当于搜索 label:"Typed Reports/Security Reports" after:2022/3/23 减去两条随机消息。

为什么代码在日期之后搜索没有得到正确的尊重?

我看到的关于代码不一致的所有其他问题都是人们的代码给出的消息比 gmail 搜索 ,而不是更多并且公然无视搜索参数。 (基本上与 Google Apps Script -GmailApp.search not returning all results (some are missing) 完全相反的问题是当我全部输入时出现的最高 'similar question')

想通了。如果您将 gmail 配置为显示非 threads/conversations 的邮件并执行 'after:2022/3/25' 之类的搜索,则自 2022/3/25 以来收到的所有电子邮件都将显示在 gmail 中。但是,使用我使用的代码,它会提取自 2022 年 3 月 25 日以来收到消息的所有线程,并提供这些线程中的所有消息。

因此,如果您的线程中有 4 条消息分别于 3 月 3 日、3 月 17 日、3 月 26 日和 3 月 27 日收到,则 gmail 中的搜索会显示最后两条消息,而脚本会得到所有 4.

使用 API 可以正确处理消息日期。

function readEmails()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1")
  var subject;
  var body;
  var messages = Gmail.Users.Messages.list('me', { q: 'label:"Typed Reports/Security Reports" after:2022/3/25', maxResults: '500', includeSpamTrash: 'true' }); 
  for (i = messages.messages.length - 1; i >= 0; i--) 
  {
     body = messages[i].getPlainBody()
     subject = messages[i].getSubject()
     sheet.insertRowBefore(2);
     sheet.getRange("A2").setValue(subject)
     sheet.getRange("B2").setValue(body)
  }
}