【问题标题】:Google Apps Script - How to stop new messages from going into old threads?Google Apps 脚本 - 如何阻止新消息进入旧线程?
【发布时间】:2019-11-27 22:02:21
【问题描述】:

我有一个 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 标记了整个线程。

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

【问题讨论】:

    标签: javascript google-apps-script gmail


    【解决方案1】:

    我想了解一下 Gmail 上的主题标签。

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

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

    如果您指的是收件箱中的消息(收到的消息)而不是“传入”,那么您可以查找标签“收件箱”,如 here 所示。

    通过拥有此消息子列表,您可以使用thread.getMessages() 处理包含的消息。然后,您可以将Advanced Google services 用于Gmail,以便调用Users.messages.get 来检索Message 表示,包括它的标签列表labelIds[]

    然后,您可以处理每条消息并在发送消息时为其添加标签。


    替代解决方案

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

    您可以使用 Apps 脚本上的 JDBC connectionFirebase Realtime Database 甚至您自己的 DIY Google 文档解决方案来做到这一点。

    这不是一项要求,但如果您希望存储邮件以在 Gmail 之外进行长期查询,这可能会很有用。

    【讨论】:

    • “因为您可以快速隔离哪些线程包含带有“传入”标签的消息。” .... 如何?你只是随口一提,没有任何解释。
    • 在没有外部服务或在谷歌云上启动服务器的情况下,有没有办法做到这一点?我只想要一个简单的电子邮件转发到 webhook。 Gmail 让这一切变得更加困难。本来应该是“如果消息=新,发送,现在消息=发送”
    • @NictraSavios 获取带有特定标签的消息,您可以查看问题上的代码。 GmailApp.getUserLabelByName('incomming');。如果您指的是收件箱中的消息(收到的消息)而不是“传入”,那么您可以查找标签“收件箱”,如 here 所示。至于您的第二个问题,Apps 脚本不需要 Google Cloud 上的服务器或外部服务。我的替代解决方案将使用它来长期存储已发送或未发送的消息,但这不是执行操作所必需的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多