Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌应用程序脚本-如何阻止新消息进入旧线程?_Javascript_Google Apps Script_Gmail - Fatal编程技术网

Javascript 谷歌应用程序脚本-如何阻止新消息进入旧线程?

Javascript 谷歌应用程序脚本-如何阻止新消息进入旧线程?,javascript,google-apps-script,gmail,Javascript,Google Apps Script,Gmail,我有一个GoogleApps脚本,可以解析带有“incomming”标签的线程,将它们发送到webhook,然后将它们标记为“sent” 函数send(){ var label=GmailApp.getUserLabelByName('incomming'); var sentlab=GmailApp.getUserLabelByName('sent'); var消息=[]; var threads=label.getThreads(); 对于(var i=0;i

我有一个GoogleApps脚本,可以解析带有“incomming”标签的线程,将它们发送到webhook,然后将它们标记为“sent”

函数send(){
var label=GmailApp.getUserLabelByName('incomming');
var sentlab=GmailApp.getUserLabelByName('sent');
var消息=[];
var threads=label.getThreads();
对于(var i=0;i
问题是,因为这些电子邮件是由一个服务生成的,它们有相似的主题-有时是相同的主题(我不能在服务中更改此主题)

假设主题为“X1上的更新”

当收到“X1更新”的电子邮件时,脚本工作正常,发送时无需担心。 但是,如果一个新的“更新X1”,它会同时发送新的和旧的,因为Gmail会标记整个线程


这导致大量重复。我怎样才能解决这个问题呢?

我想让大家了解一下Gmail上的线程标签

从现在起(对于可感知的未来),一个线程将拥有它消息中的所有标签


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

如果不是“传入”而是指收件箱中的邮件(已接收邮件),则可以查找标签“收件箱”,如图所示

通过拥有此消息子列表,您可以使用来处理包含的消息。然后,您可以使用for Gmail调用来检索表示,包括它的标签列表
labelIds[]

然后,您可以操纵每条消息,并在发送消息时向其添加标签


替代解决方案 另一种解决方案是使用某种形式的存储,在其中存储已处理的
messageId
s,然后在将它们发送给webhook之前检查它们

你可以通过应用程序脚本,甚至是你自己的DIY谷歌文档解决方案来实现这一点


这不是一项要求,但如果您希望在Gmail之外存储长期查询的消息,这可能会很有用。

“因为您可以快速隔离哪些线程包含带有“传入”标签的消息。”。。。。怎样?你只是漫不经心地提到这一点,没有任何解释。在没有外部服务或在谷歌云上启动服务器的情况下,有没有办法做到这一点?我只想要一封简单的电子邮件转发到webhook。Gmail让这一切变得更加困难。它应该是“如果message=new,send,now message=send”@NictraSavios。要获取带有特定标签的消息,您可以查看您的任务上的代码<代码>GmailApp.getUserLabelByName('incomming')。如果不是“传入”而是指收件箱中的邮件(已接收邮件),则可以查找标签“收件箱”,如图所示。至于第二个问题,应用程序脚本不需要谷歌云上的服务器或外部服务。我的替代解决方案将使用它来长期存储发送或不发送的消息,但这不是执行操作所必需的。
    function send() {
    var label = GmailApp.getUserLabelByName('incomming');
    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();
    }
}