【问题标题】:Check if a message has a label using Google Script使用 Google Script 检查邮件是否有标签
【发布时间】:2014-09-11 13:45:34
【问题描述】:

在工作中,我们有一个谷歌脚本代码,它每 4 小时运行一次,并检查每个人的@文件夹中是否有未读邮件。如果找到未读邮件,则将其移至收件箱并用@@UNREAD 标记。

我需要一种方法让脚本检查它是否已经有@@UNREAD 标签,在这种情况下不要移动到收件箱。

这是代码

function process_unread() {

    //Define user label
    var label = GmailApp.getUserLabelByName("@Josh");

    //Define unread label
    var unreadlabel = GmailApp.getUserLabelByName("@@UNREAD");

    if (label) {
        var threads = label.getThreads();

        for (var i = 0; i < threads.length; i++) {
            var thread = threads[i];
            if (thread.isUnread()) {
                //Remove label
                thread.addLabel(unreadlabel);
                thread.moveToInbox();
            }
        }

    }
}

如果电子邮件没有@@UNREAD 标签,我如何才能只移动它们?

【问题讨论】:

    标签: gmail google-apps-script javascript


    【解决方案1】:

    这是我的尝试:

    function process_unread() {
    
        //Define user label
        var label = GmailApp.getUserLabelByName("@Josh");
    
        //Define unread label
        var unreadlabel = GmailApp.getUserLabelByName("@@UNREAD");
    
        if (label) {
            var threads = label.getThreads();
    
            for (var i = 0; i < threads.length; i++) {
                var thread = threads[i];
                
                var labels = thread.getLabels();
                var doesThisThreadHaveTheLabel = false;
                
                  for (var i = 0; i < labels.length; i++) {
                    var thisParticularLabel = labels[i].getName();
                    Logger.log(labels[i].getName());
                  
                    if (thisParticularLabel === "@@UNREAD") {
                      var doesThisThreadHaveTheLabel = true;
                    };
                }
     
                if (thread.isUnread() && doesThisThreadHaveTheLabel === false) {
                    //Remove label
                    thread.addLabel(unreadlabel);
                    thread.moveToInbox();
                }
            }
    
        }
    }
    

    在将话题移至收件箱之前,您需要确保它没有标签。因此,在 If 检查中添加另一个条件。

    if (thread.isUnread() && doesThisThreadHaveTheLabel === false) {
    

    我创建了一个变量:doesThisThreadHaveTheLabel,它的值为真或假。在每个 for 循环之前默认设置为 false。

    var doesThisThreadHaveTheLabel = false;
                
        for (var i = 0; i < labels.length; i++) {
    

    您可以调试代码进行检查:

    在上图中,您会在菜单中看到一个错误图标。在单击之前,首先单击错误右侧的下拉菜单,然后选择要运行的函数的名称。此外,在代码中添加断点。在该图中,您会在代码编辑器的行号中看到一个红点。这就是代码将停止的地方。

    我将标签 @josh 添加到我帐户中的一封电子邮件中,因此变量 label 中有一个对象。但是,我没有任何带有标签 @@UNREAD 的电子邮件,因此您会注意到在变量列表中,变量 unreadlabel 的值为 @ 987654327@.

    在该图片中,代码暂停在 269 行。我可以通过单击 step in 图标step in 进入下一行代码。将鼠标悬停在图标上会弹出上下文帮助。

    我逐行进一步,检索放入变量“ThisParticularLabel”的标签。您可以在窗口中看到,它的值为 @Josh

    我单步执行了该代码,它在主 for 循环 运行一次后结束。我也自己运行了那个代码,没有调试它,它运行在:

    执行成功 [0.246 秒总运行时间]

    你需要调试你的代码,看看它在每一行都做了什么,知道每个变量对一个值有什么作用,以及条件语句是如何工作的。

    【讨论】:

    • 当我运行脚本时,它似乎永远不会完成。用于在几秒钟内运行。
    • 我在我的答案中添加了一些关于调试代码的信息。如果您的代码陷入无限循环,请检查 View 菜单下的 Execution Transcript,它可能会很长。
    • 太棒了!谢谢你告诉我。
    【解决方案2】:

    脚本不会以两个都使用变量 i 的 for 循环结束,因为 i 将被内部 for 循环连续设置为 0 并且不会递增。将内部循环切换到 j 变量,脚本将完成。

    【讨论】:

    • 这似乎是对已接受答案的评论,似乎完全正确。但请注意,您已经写了一个答案。因此,它应该包含解决方案。也许你只是复制/粘贴答案并更正它,这样它就可以工作了。你这样做会得到我的支持;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2017-06-13
    相关资源
    最近更新 更多