如何使用 Google 应用程序脚本查询未被丢弃的电子邮件?

How to query for NOT trashed emails with Google App Scripts?

我正在尝试为 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 浏览器应用程序中使用该查询,则该查询有效。

正如评论中提到的 Marios,您想要 -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()) 
        })
    })
}

注:

  • 您还可以在查询 conditions/criteria 之间添加 ORAND 以明确显示。相应地使用它们。

编辑:

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

代码:

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

更新的答案:

isInTrash() 方法 threads and messages 均受支持。在您的解决方案中,您检查的是被丢弃的消息,而不是被丢弃的线程。

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

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

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

可选解决方法

threads:

获取所有 trashed threads and exclude them (! 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?
        })
    })
}