首页 > 解决方案 > addLabel(label) 方法的“无效参数”错误

问题描述

一段时间以来,我一直在尝试在 Google Apps 脚本中为 Gmail 创建一个自动标记器。该脚本解析电子邮件正文并查找格式为“#DL:”的行,提取其后的文本(即日期),通过我编写的标准化程序运行此字符串,计算该日期之间的日期差现在,如果它是紧急的,分配一个颜色。它获取电子邮件的所有信息和标签。这是我使用的代码:

var filters = [{
    match: /[\n\r][ \t]*#DL:[ \t]*([^\n\r]*)/,
    archive: false
}, ];

var from = [];

function labeler() {

    var batchSize = 10;
    var labelCache = {};
    var query = "in:anywhere";
    var threads = GmailApp.search(query, 0, batchSize);
    GmailApp.getMessagesForThreads(threads);

    var findOrCreateLabel = function(name) {
        if (labelCache[name] === undefined) {
            labelCache[name] = GmailApp.getUserLabelByName(name) || createLabelByGmailApi(name);
        }
        //GmailApp.createLabel(name);
        //createLabelByGmailApi(name);
        return labelCache[name];
    }

    var applyLabel = function(name, thread) {
        var label = null;
        var labelName = "";
        name.split('&').forEach(function(labelPart, i) {
            labelName = labelName + (i === 0 ? "" : "&") + labelPart.trim();
            label = findOrCreateLabel(labelName);
        });
        thread.addLabel(label);
    }
    threads.forEach(function(thread) {
        var messages = thread.getMessages();
        if (messages == null) return;

        var message = messages[messages.length - 1];
        var body = message.getRawContent();
        var archive = true;

        filters.forEach(function(filter) {

            var matches = filter.match.exec(body);
            if (matches !== null) {

                var label = filter.name || matches[1];
                var data = datestd(label);
                var cor = datecalc(data);

                label = "Datas/" + data;
                if (label !== undefined) applyLabel(label, thread);

                if (filter.archive !== undefined && !filter.archive) archive = false;
            }
        });

        if (archive) thread.moveToArchive();
    });
}

function createLabelByGmailApi(name, color) {
    var label = GmailApp.getUserLabelByName(name);
    if (label) return label;
    var textColor = "#ffffff";
    if (color == 'red') {
        var backgroundColor = "#ac2b16";
    } else if (color == 'yellow') {
        var backgroundColor = "#fad165";
    } else if (color == 'green') {
        var backgroundColor = "#076239";
    } else {
        var backgroundColor = "#41236d";
    }

    var userId = "me";
    var resource = Gmail.newLabel();
    resource.labelListVisibility = "labelShow";
    resource.messageListVisibility = "show";
    resource.name = name;
    var labelColor = Gmail.newLabelColor();
    labelColor.textColor = textColor;
    labelColor.backgroundColor = backgroundColor;
    resource.color = labelColor;
    Gmail.Users.Labels.create(resource, userId);
    return GmailApp.getUserLabelByName(name);
}

function datecalc(stringdata) {

    var len = stringdata.length
    var min = stringdata.slice(len - 2, len);
    var hora = stringdata.slice(len - 5, len - 3);
    var mes = stringdata.slice(len - 9, len - 7);
    var dia = stringdata.slice(len - 12, len - 10);
    min = Number(min);
    hora = Number(hora);
    mes = Number(mes);
    dia = Number(dia);
    var data = new Date(2019, mes - 1, dia, hora, min);
    var data2 = Date.now();
    var diff = data - data2;
    diff = diff / 86400000
    var color;
    if (diff <= 1.5) {
        color = 'red'
    } else if (diff > 1.5 && diff <= 4) {
        color = 'yellow'
    } else {
        color = 'green'
    }
    return color;
}

function mesnum(mon) {
    var m = {
        'jan': '01',
        'fev': '02',
        'mar': '03',
        'abr': '04',
        'mai': '05',
        'jun': '06',
        'jul': '07',
        'ago': '08',
        'set': '09',
        'out': '10',
        'nov': '11',
        'dez': '12'
    };
    var s = mon.slice(0, 3)
    var idc = String(m[s]);
    if (idc.length < 2) {
        idc = "0" + idc;
    }
    return idc;
}

function datestd(date) {
    var ano = "2019";
    var whitelistdias = ["terça-feira", "quarta-feira",
        "quinta-feira", "sexta-feira", "sábado", "domingo",
        "segunda", "terça", "quarta", "quinta", "sexta", "sabado",
        "terca"
    ];

    var whitelistmes = ["janeiro", "fevereiro", "março", "abril", "maio", "junho",
        "julho", "agosto", "setembro", "outubro", "novembro",
        "dezembro", "jan", "fev", "mar", "abr", "mai", "jun",
        "jul", "ago", "set", "out", "nov", "dez"
    ];
    var whitelistchar = ["/", "-", "."];

    var idk = date.toLowerCase();
    idk = idk.replace(/,/g, " ,");
    idk = idk.split(" ");
    var v;
    var pos;
    var dia;
    var hora;
    var mes;
    var searchd;
    var posfinal;

    if (whitelistmes.some(function(v) {
            return idk.indexOf(v) !== -1;
        }) == true) {
        idk = String(idk);
        whitelistmes.forEach(function(strs) {
            return idk.replace(strs, "");
        });
        whitelistdias.forEach(function(strq) {
            return idk.replace(strq, "");
        });

        idk = String(idk);
        idk = idk.replace("[", "");
        idk = idk.replace(".", ":");
        idk = idk.replace("]", "");
        idk = idk.replace("de", "");
        idk = idk.replace(" ", "");
        idk = idk.replace("'", "");
        idk = idk.replace("as", ",");
        idk = idk.replace("at", ",");
        idk = idk.replace("of", ",");
        idk = idk.replace("às", ",");
        idk = idk.replace("h", "");
        idk = idk.replace(ano, "");
        pos = idk.indexOf(",");
        dia = idk.slice(0, pos);
        idk = String(idk);
        hora = idk.slice(idk.lastIndexOf(",") + 1, idk.length);
        idk = idk.split(",");
        mes = idk.filter(function(n) {
            return whitelistmes.indexOf(n) !== -1;
        });
        mes = String(mes);

        return dia + "/" + mesnum(mes) + ", " + hora;
    } else {

        idk = String(idk);
        if (idk.includes("/") || idk.includes("-")) {
            whitelistmes.forEach(function(strs) {
                return idk.replace(strs, "");
            });
            whitelistdias.forEach(function(strq) {
                return idk.replace(strq, "");
            });
        }
        idk = String(idk);
        idk = idk.replace(".", ":");
        idk = idk.replace("[", "");
        idk = idk.replace("]", "");
        idk = idk.replace("de", "");
        idk = idk.replace(/ /g, "");
        idk = idk.replace("'", "");
        idk = idk.replace("as", ",");
        idk = idk.replace("às", ",");
        idk = idk.replace(ano, "");
        var hmm = new Array();

        idk = idk.split('');
        hmm = idk.reduce(function(matches, character, index) {
            if (whitelistchar.includes(character)) hmm.push(index);
            return hmm;
        }, []);

        hmm = String(hmm);
        hmm = hmm.replace("[", "");
        hmm = hmm.replace("]", "");
        hmm = hmm.replace(" ", "");
        var pos1 = hmm.indexOf(",");
        if (pos1 !== -1) {
            var prim = hmm.slice(0, pos1);
            prim = Number(prim);
            var seg = hmm.slice(pos1 + 1, hmm.length);
            seg = Number(seg);
            dia = idk.slice(0, prim);
            mes = idk.slice(prim + 1, seg);
            hora = idk.slice(seg + 1, idk.length);
        } else {
            hmm = Number(hmm);
            pos1 = idk.indexOf(",");
            dia = idk.slice(0, hmm);
            mes = idk.slice(hmm + 1, pos1);
            hora = idk.slice(pos1 + 1, idk.length);
        }
        hora = String(hora);
        searchd = hora.match(/\d/);
        posfinal = hora.indexOf(searchd);

        hora = hora.slice(posfinal, hora.length);
        idk = String(idk);
        idk = idk.replace(/,/g, "");
        dia = String(dia);
        mes = String(mes);
        hora = String(hora);
        dia = dia.replace(/,/g, "");
        mes = mes.replace(/,/g, "");
        hora = hora.replace(/,/g, "");
        hora = hora.replace(/h/g, "");
        return dia + "/" + mes + ", " + hora;
    }
}

为正在发生的事情提供一些上下文: labeler 函数从电子邮件中获取字符串,将其发送到 datestd 函数以进行标准化,并且该输出是标签的名称。该输出还用于通过函数 datecalc 计算该日期与现在之间的日期差异,该函数输出颜色。函数将使用此颜色createLabelByGmailApi来创建具有该名称和颜色的标签。在此之后,labeler 函数将该标签应用于相关电子邮件。

我正在尝试解决两个问题,但无济于事:

1. 无效参数错误

运行上面的代码时,我在行中得到一个“Invalid Argument”错误thread.addLabel(label);(参数是标签),我不知道为什么。

2. 似乎无法获取createLabelByGmailApi函数的颜色

由于代码的结构方式,我似乎无法获取函数的颜色,因为此颜色取决于日期,而日期取决于电子邮件正文的解析,这将在函数的后面发生。我似乎找不到重新排列它的方法,因此我可以为该功能提供颜色,如果您能提供帮助,那就太好了。

我知道这是少数,非常感谢您阅读本文,非常感谢您的帮助。

标签: google-apps-scriptgmail-api

解决方案


这个改装怎么样?

您的问题的原因似乎是 crated 标签在Gmail.Users.Labels.create()运行时没有很快反映出来。至此,label成为了null。为了消除这个问题,我在Gmail.Users.Threads.modify()创建标签时添加了标签Gmail.Users.Labels.create()。请进行如下修改。

修改后的脚本:

请修改applyLabel()如下labeler()

从:

var applyLabel = function(name, thread) {
    var label = null;
    var labelName = "";
    name.split('&').forEach(function(labelPart, i) {
        labelName = labelName + (i === 0 ? "" : "&") + labelPart.trim();
        label = findOrCreateLabel(labelName);
    });
    thread.addLabel(label);
}

至:

var applyLabel = function(name, thread) {
  var label = null;
  var labelName = "";
  name.split('&').forEach(function(labelPart, i) {
      labelName = labelName + (i === 0 ? "" : "&") + labelPart.trim();
      label = findOrCreateLabel(labelName);
  });
  if (typeof label == "string") {
    Gmail.Users.Threads.modify({addLabelIds: [label]}, "me", thread.getId());
  } else {
    thread.addLabel(label);
  }
}

并且,请createLabelByGmailApi()进行如下修改。

从:

Gmail.Users.Labels.create(resource, userId);
return GmailApp.getUserLabelByName(name);

至:

return Gmail.Users.Labels.create(resource, userId).id;

笔记:

  • At labelCache[name] = GmailApp.getUserLabelByName(name) || createLabelByGmailApi(name);,当createLabelByGmailApi(name)被调用时,name用作参数。但是在函数createLabelByGmailApi(name, color),namecolor被用作参数。我认为在目前的情况下,#41236d被用作默认值。请确认。
  • 当我看到 的功能时datestd(),我注意到它includes()被使用了。在当前阶段,它不能用于 Google Apps 脚本。那么includes()是在其他地方声明的吗?

如果我误解了你的情况,这不是你想要的方向,我很抱歉。


推荐阅读