Javascript Gmail附加Google脚本错误行为
我正在创建一个Gmail附加组件,将电子邮件的某些信息发送到后端端点,为此,它必须以以下方式选择和格式化电子邮件的电子邮件地址:Javascript Gmail附加Google脚本错误行为,javascript,google-apps-script,gmail,gmail-addons,Javascript,Google Apps Script,Gmail,Gmail Addons,我正在创建一个Gmail附加组件,将电子邮件的某些信息发送到后端端点,为此,它必须以以下方式选择和格式化电子邮件的电子邮件地址: 如果电子邮件在收件箱中,则地址应为发件人的地址 如果电子邮件已发送,则地址应为收件人的地址 如果GmailMessage.getFrom()或GmailMessage.getTo()的结果是一个电子邮件格式的字符串,则这是地址,不应执行任何格式 如果GmailMessage.getFrom()或GmailMessage.getTo()的结果是格式为的字符串,例如,Jo
GmailMessage.getFrom()
或GmailMessage.getTo()
的结果是一个电子邮件格式的字符串,则这是地址,不应执行任何格式GmailMessage.getFrom()
或GmailMessage.getTo()
的结果是格式为的字符串,例如,John Doe
,则地址应为尖括号之间的子字符串for (var i = 0; i < messages.length; i++) {
var address = '';
var name = '';
var from = messages[i].getFrom()
var to = messages[i].getTo();
Logger.log(from);
Logger.log(to);
if (messages[i].isInInbox()) {
Logger.log('inbox'); // (*)
if (/<(.*?)>/g.test(from)) {
Logger.log(/<(.*?)>/g.test(from));
Logger.log('true');
address = /<(.*?)>/.exec(from)[1];
} else {
Logger.log(/<(.*?)>/g.test(from)); // (**)
Logger.log('false');
address = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.exec(from)[0];
}
name = /^(.*?)@/.exec(address);
} else {
Logger.log('sent');
if (/<(.*?)>/g.test(to)) {
Logger.log(/<(.*?)>/g.test(to));
Logger.log('true');
address = /<(.*?)>/.exec(to)[1];
} else {
Logger.log(/<(.*?)>/g.test(to));
Logger.log('false');
address = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.exec(to)[0];
}
name = /^(.*?)@/.exec(address);
}
}
for(var i=0;i
其中messages是GmailMessage对象的数组。
问题是,在其中一条收件箱消息中,对于//g
正则表达式,“from”地址的计算结果为true,但仍然输入了else语句。
更清楚地说,记录器的输出如下:
[19-10-14 13:52:14:750 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:750 PDT] john@doe.com <---- selected address
[19-10-14 13:52:14:751 PDT] sent
[19-10-14 13:52:14:751 PDT] false <---- it's a "simple string", not enclosed by <>
[19-10-14 13:52:14:752 PDT] false
[19-10-14 13:52:14:753 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:754 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:755 PDT] inbox
[19-10-14 13:52:14:755 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:755 PDT] true
[19-10-14 13:52:14:757 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:757 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:757 PDT] sent
[19-10-14 13:52:14:758 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:758 PDT] true
[19-10-14 13:52:14:760 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:760 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:761 PDT] inbox
[19-10-14 13:52:14:761 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:761 PDT] false <---- it's entering to the else statement nonetheless
[19-10-1413:52:14:750 PDT]“Foo-Bar”
[太平洋时报19-10-1413:52:14:750]john@doe.com是全局修饰符导致了问题。带有全局修饰符的正则表达式在调用之间是有状态的,包括对test()的调用。状态的维护非常重要,因此可以迭代调用exec()之类的内容以返回下一个匹配项。因为您对表达式使用了文本,所以解释器只是将其优化为表达式的一个实例。同一实例+有状态+对test()的多次调用,使用相同的arg==您看到的内容
删除这些表达式中的g
标志,就可以了。在你使用它的方式中甚至不需要它,因为你正在测试任何比赛