如何在 Gmail 中使用标签来识别单个邮件,而不是已由脚本处理的线程

Posted

技术标签:

【中文标题】如何在 Gmail 中使用标签来识别单个邮件,而不是已由脚本处理的线程【英文标题】:How to use labels in Gmail to identify single messages instead of threads that have already been processed by a script 【发布时间】:2015-01-19 05:52:19 【问题描述】:

使用谷歌邮件的谷歌脚本,我正在尝试使用 API 将带有特定标签的新电子邮件上传到我们的 CRM。我无法检查消息是否已经上传,所以我必须在邮箱中为之前处理过的消息应用一个标签。

不幸的是,谷歌脚本只允许您在线程级别添加或检查标签。由于线程在上次上传到 CRM 后可能会收到新消息,因此我不知道线程的哪些消息实际上已经被处理。

下面的代码包含了我的想法,getLabels 函数对 Message 不起作用,因此它不起作用。

希望有人有一个聪明的解决方案!

谢谢

//execute main sequence
function collecttobesend() 
    var labeladd = GmailApp.getUserLabelByName("add to CRM");
    var labeladded = GmailApp.getUserLabelByName("added to CRM");
    //var threads = label.getThreads();
    var threads = GmailApp.search('label:added-to-crm -label:add-to-crm')

    for (var i = 0; i < threads.length; i++) 
        thread = threads[i];

        // get all messages in a given thread
        var messages = thread.getMessages();

        // iterate over each message
        for (var j = 0; j < messages.length; j++) 
            message = messages[j];
            var labels = message.getLabels();
            var messagehaslabeladded = false;

            for (var k = 0; k < labels.length; k++) 
                if (labels[k] = labeladded) 
                    messagehaslabeladded = true;
                
            

            // if message has not been added yet
            if (messagehaslabeladded = false) 
                var success = false;

                //add to CRM through API
                success = true;

                //if succesfull add label
                if (success = true) 
                    message.addLabel(labeladded);
                
            
        
    

【问题讨论】:

我刚遇到同样的问题。然后在Gmail search query help上发现了一个矛盾的说法> 注意:labels only added to a message, and not a whole > conversation 我的经验正好相反,API只允许我获取标签在对话级别,而不是单个消息级别。我会尝试让支持人员发表评论 收到您的评论通知。我实际上找到了解决方案,请参见下面的答案。 【参考方案1】:

棘手。

在我看来,您的问题是双重的。

1) 如果线程在应用“已添加到 CRM”标签后收到响应,则该新消息甚至不会触发检查是否需要添加,因为它永远不会有“添加到 CRM” '申请了。

2) 它无法区分线程中已添加的消息和仍需要添加的消息。

这不是一个特别优雅的解决方案,但关于 1),有一个麻烦但可行的解决方案。您可以设置一个脚本来检查收件箱中的邮件,使用.getInboxThreads() 来检查类似的内容:

 // if message might have been updated
    if (messageHasLabelAdded == true && messageIsInInbox == True) 
       //Iterate through again to index the new messages
 

每隔几分钟运行一次应该会捕获线程中的任何新消息,但它在很大程度上依赖于您的用户在完成后“归档”消息。

使用 2) 您是否能够通过 CRM 获取/发布元数据?如果是这样,您始终可以使用 getId() 获取消息 ID。这是一个独特的属性,因此如果它可以与您的 CRM 中的消息相关联,只需将 ID 与您的 CRM 中的 ID 进行比较,并检查具有该 ID 的消息是否已上传。

一旦您将数千条消息上传到您的 CRM,这可能会变得很麻烦,但这可能是您需要的开始。

【讨论】:

感谢您的帮助。 getId() 确实可以解决它,但是正如您提到的,当 CRM 有很多消息时,它会变得非常棘手。您确定的问题 1 实际上不是问题。有趣的是,虽然您只能在线程级别检查标签,但谷歌实际上将标签附加到单个消息。因此,第 6 行中的搜索功能给出了所有线程,其中至少一条消息具有添加到 crm 标签,并且至少一条消息错过了添加到 crm 标签。 这是有道理的,因为可以查看线程和非线程的消息,因此如果用户具有非线程视图,则仍需要应用标签。至于您的循环消息 ID 问题,我只能建议循环过去 30 天左右的时间限制。如果您觉得这个答案对您有帮助并且可能对其他人也有帮助,请考虑支持/接受这个答案(***.com/help/someone-answers)。【参考方案2】:

我实际上找到了解决方案。正如 Le Stephane 评论的那样,谷歌注释指出标签被添加到消息中,这是真的。但是,在线程级别上一次对线程中的所有消息添加和删除标签。

因此解决方案是使用两个标签:“添加”和“添加”。运行第二个脚本,从线程(以及线程中具有该标签的所有消息)中删除“to-add”标签,并立即再次添加标签(到线程中的所有消息)。

这意味着线程中的所有新旧消息都带有“待添加”标签,而只有旧消息带有“已添加”标签。您现在可以搜索带有“待添加”标签而不是“已添加”标签的邮件。在 api 将这些消息添加到 crm 后,您将标签“已添加”添加到线程,因此线程中的所有消息。

脚本运行后进入的消息在带有这些标签的线程中,但没有附加到消息本身的标签,因此上述两步方法有效。

【讨论】:

嗨,Jhon,我也面临同样的问题。您的解决方案仍然有效吗?您能否用一个简单的代码示例扩展您的帖子,我可以测试什么?根据您的描述,我并没有真正理解您的解决方法。谢谢,【参考方案3】:

'starred'阅读后的消息。'starred'仅适用于消息。

【讨论】:

以上是关于如何在 Gmail 中使用标签来识别单个邮件,而不是已由脚本处理的线程的主要内容,如果未能解决你的问题,请参考以下文章

考虑到每条消息应用标签,2人如何使用相同的Gmail帐户并过滤每个用户的传入电子邮件?

使用 mailcore2 在 gmail 帐户中创建标签

如何从 gmail 下载许多电子邮件附件

如何在保留元数据的同时转发电子邮件而不将电子邮件重新发送给抄送收件人?

使用 gmail python API 如何获取没有标签“已读”的最新电子邮件

考虑到每封邮件都应用了标签,两个人如何使用同一个 Gmail 帐户并为每个用户过滤传入的电子邮件?