【问题标题】:"Invalid Argument" error with addLabel(label) methodaddLabel(label) 方法的“无效参数”错误
【发布时间】:2019-08-08 02:53:50
【问题描述】:

一段时间以来,我一直在尝试在 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 函数将该标签应用于相关电子邮件。

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

1.无效参数错误

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

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

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

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

【问题讨论】:

  • 感谢您的回复。我有问题。 1、thread.addLabel(label)出现错误时,能否提供label的值? 2. 可以问一下the color for the function吗?
  • @Tanaike 是null 但我不知道为什么,这对我来说毫无意义。关于颜色,我基本上带了你的代码,并把它作为一个参数改变颜色。我自己测试了那部分,它起作用了。颜色是 datecalc 函数的输出。
  • 感谢您的回复。关于1,比如label的值为null,那么namecolor的值是多少?关于2、datecalc()的功能,能否提供你想要的stringdata和输出color的样本值?
  • @Tanaike name 的值是“Datas/9/08, 11:00”,我这样做是为了让你的函数不使用colorlabel 的值仍然是 null,我仍然得到 Invalid Argument。此外,对于datecalc(),该函数获取字符串数据输入,如“9/08, 11:00”并输出颜色。由于那个日期离现在很近(不到 2 天),所以颜色输出为'red'
  • 嗨,加布里埃尔。我看到多件我想评论的事情是可疑的,但可能是也可能不是主要问题。例如,这两行:label = "Datas/" + data; if (label !== undefined) applyLabel(label, thread);label 永远不会是undefined,因为"Datas/" + undefined === "Datasundefined"(试试看)。在applyLabel 中,您继续分配给label 而不使用该变量...所以您最终得到分配给label 的任何最后一个循环。我会继续寻找是否能找到主要问题。

标签: google-apps-script gmail-api


【解决方案1】:

这个修改怎么样?

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

修改后的脚本:

请修改labeler()中的applyLabel()如下。

发件人:

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;

注意:

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

如果我误解了您的情况并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 经过测试,真的很好用!非常感谢您一路上的帮助,Tanaike!
  • @Gabriel Leal 很高兴您的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2019-11-09
  • 2023-03-12
相关资源
最近更新 更多