使用 Google 脚本检查邮件是否有标签

Jos*_*ley 5 javascript gmail google-apps-script

在工作中,我们有一个谷歌脚本代码,每 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();
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*lls 3

这是我的尝试:

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();
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

if (thread.isUnread() && doesThisThreadHaveTheLabel === false) {
Run Code Online (Sandbox Code Playgroud)

我创建了一个变量: doesThisThreadHaveTheLabel它将具有 true 或 false 值。在每个 for 循环之前它默认设置为 false。

var doesThisThreadHaveTheLabel = false;
            
    for (var i = 0; i < labels.length; i++) {
Run Code Online (Sandbox Code Playgroud)

您可以调试代码来检查它:

调试窗口

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

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

在该图中,代码暂停在 269 行上。我可以通过单击“单步执行”图标来单步执行到下一行代码。将鼠标悬停在图标上即可弹出上下文帮助。

调试代码

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

我单步执行了该代码,并在主for 循环运行一次后结束。我还单独运行了该代码而不进行调试,它运行在:

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

您需要调试代码,查看每一行的作用,了解每个变量的值以及条件语句的工作原理。