【问题标题】:GmailApp.getMessagesForThreads() returns too many messagesGmailApp.getMessagesForThreads() 返回太多消息
【发布时间】:2020-09-03 13:57:00
【问题描述】:

我想在我的 Gmail 帐户中返回指定日期收到的所有电子邮件主题的列表。如果有多条消息具有相同的主题,我想知道有多少条。这就是我所做的:

var emailThreads = GmailApp.search("subject:<partial_subject> after:2020/8/30 before:2020/8/31");
var messages = GmailApp.getMessagesForThreads(emailThreads);

这将返回“消息数组的数组,其中外部数组中的每个项目对应于一个线程,而内部数组包含该线程中的消息”。

我尝试像这样访问我需要的数据:

for (i = 0; i < messages.length; i++) {
  messages[i][0].getSubject() // a subject
  messages[i].length          // number of messages with the same subject
}

但是,这会返回比 Gmail 用户界面中显示的更多的邮件。

这是我注意到的:

  • 它只发生在包含多条消息的线程中
  • 并非所有线程都会出现多条消息
  • 每次在同一天运行我的脚本,结果都是一样的
  • 当我在不同天运行脚本时,即使收到相同的电子邮件,结果也会不同

考虑到这段代码非常简单,而且我只使用谷歌提供的方法,我想我一定是误解了什么,或者 Gmail 对线程中的消息做了一些奇怪的事情。

任何想法这可能是什么以及如何解决它?


编辑: 我注意到 gmail 过滤器中有一个“不包括聊天”复选框,它将“-in:chats”添加到搜索查询中,但它也没有帮助。 我还尝试在查询中添加“in:inbox”,但结果没有变化。

【问题讨论】:

  • 我编辑我的答案。如果您需要进一步的帮助,我建议您添加 minimal reproducible example,其中包含足够的详细信息以重现您获得的结果以及您正在执行的操作的详细步骤,以将 Gmail UI 的结果与脚本的结果进行比较。跨度>

标签: google-apps-script gmail


【解决方案1】:

解释:

  • 您收到太多消息的原因是因为您当前的 过滤条件不仅查询电子邮件,还查询 环聊 消息 或其他线程而不是电子邮件。

  • 使用它来获取所有电子邮件的主题:

    var emailThreads = GmailApp.search("is:inbox after:2020/8/30 before:2020/8/31");
    

解决办法:

这是完整代码的样子:

function myFunction() {
  
  var emailThreads = GmailApp.search("is:inbox after:2020/8/30 before:2020/8/31");
  var messages = GmailApp.getMessagesForThreads(emailThreads);
  var messageArr = [];
   
  for (i = 0; i < messages.length; i++) {
  Logger.log(messages[i][0].getSubject()) // a subject
  Logger.log(messages[i].length)        // number of messages with the same subject
}
      
  messages.forEach(m=>{
         messageArr.push({
         subject: m[0].getSubject(),
         num_messages:m.length
  })});    
}
  • 我还为您创建了一个 json 数组 messageArr,其中包含所有 主题名称和每个主题的消息数量。

【讨论】:

  • 在 gmail 搜索栏中输入“email after:2020/8/30 before:2020/8/31”不会返回任何结果。当我展开过滤器时,“电子邮件”被输入到“有字词”字段中,我看不到在哪里选择消息类型。有一个“不包括聊天”复选框,它添加了“-in:chats”,但它也没有帮助
  • 再次尝试我的代码。我知道您说过您尝试过 is:inbox 但在我的情况下它有效。有没有可能那天您没有收到任何电子邮件?既然是星期天?尝试不同的日期范围,看看是否是这种情况。还要确保您准确复制我们提供的代码。没有其他解释。 @marcin
【解决方案2】:

来自问题

但是,这会返回比 Gmail UI 中显示的更多的邮件。

这可能有一些原因

  1. 垃圾邮件和垃圾邮件中的邮件不会显示在 Gmail 用户界面的搜索结果中(除非您以文本形式包含 in:anywhere
  2. UI 未显示所有消息,因为结果可能是分页的,而您错过了这一点
  3. 在接收/导入/删除大量邮件后,将它们显示在 UI 上会有明显的延迟,因此即使您看起来已到达最后一个搜索结果页面,请等待几分钟并重新登录 Gmail网页。

getMessagesForThreads 返回的邮件可能不会显示在 Gmail UI 搜索结果中,因为它们被发送到垃圾邮件垃圾邮件

要正确比较 Gmail 用户界面的结果与此方法的结果,请在 Gmail 用户界面上将in:anywhere 作为搜索的一部分。完整的搜索语句将如下所示:

in:anywhere subject:<partial_subject> after:2020/8/30 before:2020/8/31

正如本答案第一部分所述,您可能需要多次刷新 Gmail 网页,以确保最近没有通过网络 UI 提供的邮件。

相关

资源

【讨论】:

  • 我尝试添加“in:inbox”和其他一些,但没有帮助
  • 我建议的搜索词在文本上是 in:anywhere,而不是 in:inbox 或任何其他
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多