【问题标题】:How to query for NOT trashed emails with Google App Scripts?如何使用 Google App Scripts 查询未删除的电子邮件?
【发布时间】:2021-05-31 03:59:10
【问题描述】:

我正在尝试为 Gmail 创建一个脚本以仅获取“未删除”的电子邮件,但我也收到了已删除的电子邮件。

为什么?

function fromGmailToDrive() {
    var query = "in:inbox -in:trash has:attachment";
    var threads = GmailApp.search(query);

    threads.forEach((t) => {
        const messages = t.getMessages()
        messages.forEach((m) => {
            console.log("m.isInTrash():", m.isInTrash()) //<- some are true, why?
        })
    })
}

如果我在 Gmail 浏览器应用程序中使用该查询,则该查询有效。

【问题讨论】:

  • 只试query = "-in:trash"
  • 我试过了。一样的,有的m.isInTrash()true,有的false。快把我逼疯了!
  • 如果我在 Gmail 中使用该查询,它就可以工作!在脚本中没有。为什么?
  • 这个查询得到的结果相同:label:test AND -in:trash AND has:attachment。我觉得有些不对劲……
  • 我更新了我的答案。您应该检查已删除的线程而不是已删除的消息。

标签: google-apps-script gmail-api


【解决方案1】:

更新答案:

threadsmessages 都支持方法 isInTrash()。在您的解决方案中,您正在检查已删除的消息,而不是已删除的线程。

如果你想检查一个线程是否被丢弃,你应该在 threads 上应用isInTrash() 方法:

function fromGmailToDrive() {
    var query = "-in:trash has:attachment";
    var threads = GmailApp.search(query);

    threads.forEach((t) => {
            console.log("m.isInTrash():", t.isInTrash());
    })
}

可选的解决方法

获取所有trashed threads 并从threads 中排除它们(!includes):

function fromGmailToDrive() {
    var query = "-in:trash has:attachment";
    var threads = GmailApp.search(query);
    var trashThreadsIDs = GmailApp.getTrashThreads().map(t=>t.getId());
    var clean_threads = threads.filter(t=>!trashThreadsIDs.includes(t.getId()));

    clean_threads.forEach((t) => {
        const messages = t.getMessages()
        messages.forEach((m) => {
            console.log("m.isInTrash():", m.isInTrash()) //<- some are true, why?
        })
    })
}

【讨论】:

  • 很好的解决方法。我实际上能够重新创建一次问题,但是当我删除垃圾下线程上的主电子邮件时,我似乎无法再做一次。我的预感是被删除的线程邮件中的主要电子邮件被视为垃圾邮件,但它后面的线程却不是。线程电子邮件中的主要电子邮件已被删除。但它后面的线程被视为不是垃圾。算作不是垃圾,同时算作垃圾。当我测试它时,它确认了 isInTrash 返回 true 的邮件计数
  • @NaziA 感谢您的支持和反馈。我实际上认为我了解问题所在,但当然 OP 需要验证这一点。显然,您可以删除消息和线程。 OP 正在检查已删除的消息,但他应该检查已删除的线程。
  • 感谢您的回答,但现在 clean_threads[] 为空。
  • 我有一些邮件在收件箱里,一些在垃圾箱里。线程将它们放在里面。所以一个线程可以被丢弃,但也可以在收件箱中!真是一团糟!!!!
  • 您尝试过代码的第一部分吗? @user15308346 我更新了解决方法,但如果我的答案中的第一个脚本有意义并回答了您的问题,则使用该解决方法没有意义。
【解决方案2】:

根据评论中提到的马里奥斯,你想要-in:trash。但是由于您添加了in:inboxhas:attachment,它也添加了那些符合这些条件的电子邮件。

如果您只想查找包含附件且不在垃圾箱中的邮件,请使用:

代码:

function fromGmailToDrive() {
    var query = "-in:trash has:attachment";
    var threads = GmailApp.search(query);

    threads.forEach((t) => {
        const messages = t.getMessages()
        messages.forEach((m) => {
            console.log("m.isInTrash():", m.isInTrash()) 
        })
    })
}

注意:

  • 您还可以在查询条件/标准之间添加ORAND 以明确。相应地使用它们。

编辑:

  • 如果一切都失败了,您可能只需要有一个条件来检查邮件何时不在垃圾箱中。这不是一个好的答案,应该被视为最后的手段,但它仍然可以解决您的问题。

代码:

if (!m.isInTrash())
  // do something when message not in trash

【讨论】:

  • 感谢您的回答。我试过了。是一样的,有些 m.isInTrash() 是真的,有些是假的。快把我逼疯了!
  • 如果我在 Gmail 中使用该查询,它就可以工作!在脚本中没有。为什么?
  • 这个查询得到的结果相同:label:test AND -in:trash AND has:attachment。我觉得有些不对劲……
  • 我现在不太确定它为什么会这样对你。它按预期在我的身上工作。你能在帖子中展示你的整个脚本吗?创建一个检查if(!m.isInTrash()) // do something when not in trash 的条件不适用吗?如果一切都失败了,也许这将是你最后的手段。
  • 我不明白为什么它对你有效,而对我无效。它发现一些线程有一些垃圾邮件,而另一些则没有。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多