Google Apps 脚本 - 如何阻止新消息进入旧线程?

Google Apps Script - How to stop new messages from going into old threads?

我有一个 Google Apps 脚本,它通过带有标签“传入”的线程进行解析,将它们触发到 webhook,然后将它们标记为“已发送”。

function send() {
    var label = GmailApp.getUserLabelByName('incoming');
    var sentlabel = GmailApp.getUserLabelByName('sent');
    var messages = [];
    var threads = label.getThreads();

    for (var i = 0; i < threads.length; i++) {
        messages = messages.concat(threads[i].getMessages())
    }

    for (var i = 0; i < messages.length; i++) {
        var message = messages[i];
        Logger.log(message);

        var payload = {
            "from": message.getFrom(),
            "to": message.getTo(),
            "cc": message.getCc(),
            "date": message.getDate(),
            "subject": message.getSubject(),
            "txtbody": message.getPlainBody()
        };

        var options = {
            'method': 'post',
            'contentType': 'application/json',
            'payload': JSON.stringify(payload),
        };

        var webhookUrl = '<redacted>';
        UrlFetchApp.fetch(webhookUrl, options);
    }

    // remove the label from these threads so we don't send them to
    // slack again next time the script is run
    label.removeFromThreads(threads);
    Utilities.sleep(200);
    sentlabel.addToThreads(threads);

    for (var i = 0; i < threads.length; i++) {
        threads[i].moveToArchive();
    }
}

问题是,因为这些电子邮件是由服务生成的,所以它们具有相似的主题 - 有时是相同的主题(我无法在服务中更改)

假设主题是“X1 上的更新”。

当收到“更新 X1”的电子邮件时 - 脚本工作正常,请放心发送。

但是,如果有新的“X1 上的更新”出现,它会同时发送新的和旧的,因为 Gmail 会标记整个线程。

这会导致大量重复。我该如何解决这个问题?

我想阐明 Gmail 上的线程标签。

截至目前(以及可预见的未来),一个线程将具有来自其消息的所有标签。

这对您仍然有帮助,因为您可以快速隔离哪些线程包含带有 "incoming" 标签的消息。

如果您指的不是 'incoming' 而是收件箱中的消息(收到的消息),那么您可以查找标签 'INBOX',如 here.

所示

有了这个消息子列表,您就可以用 thread.getMessages(). Then you can use the Advanced Google services for Gmail in order to call the Users.messages.get to retrieve the Message 表示来处理包含的消息,包括它的标签列表 labelIds[]

然后您可以操作每封邮件并在发送邮件时为其添加标签。


备选方案

另一种解决方案是使用某种形式的存储来存储已处理的 messageIds,然后在将它们发送给您 webhook 之前检查它们。

您可以使用 JDBC connection on Apps Script, Firebase Realtime Database 甚至您自己的 DIY Google 文档解决方案来做到这一点。

这不是必需的,但如果您希望存储邮件以便在 Gmail 外部进行长期查询,这会很有用。