Gmail Add On Google Script некорректное поведение - PullRequest
1 голос
/ 15 октября 2019

Я создаю надстройку Gmail, которая отправляет определенную информацию об электронных письмах в конечную точку сервера, и для этого она должна выбрать и отформатировать адреса электронной почты следующим образом:

  1. Если электронная почта находится в папке «Входящие», адрес должен совпадать с адресом отправителя.
  2. Если электронная почта находится в папке «Отправлено», адрес должен быть адресом получателя. результат GmailMessage.getFrom() или GmailMessage.getTo() является строкой с форматом электронного письма, это адрес, и формат не должен выполняться.
  3. Если результат GmailMessage.getFrom() или GmailMessage.getTo() является строкойс форматом, например, John Doe <john@doe.com>, тогда адрес должен быть подстрокой между угловыми скобками.

Поэтому я написал следующий код для этого

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

Где сообщения - это массив объектов GmailMessage. Дело в том, что в одном из сообщений «Входящие» адрес «от» оценивается как истинное для регулярного выражения /<(.*?)>/g, но, тем не менее, входит в оператор else. Чтобы выразить это более понятным образом, вывод Logger выглядит следующим образом:

[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

Любой ключ к пониманию того, почему происходит это странное поведение? Я очень старался выяснить, что не так с этим кодом, но я действительно не знаю, что это могло быть.

Редактировать : я сделал еще несколько тестов и странным образом выражение /<(.*?)>/g.exec(from) равно null, если я помещу его ниже Logger.log('inbox') (*) и равно [<john@doe.com>, john@doe.com] внутри оператора else (**). Может ли кто-нибудь объяснить это поведение?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Это глобальный модификатор, который вызывает проблему. Регулярные выражения с глобальным модификатором сохраняют состояние между вызовами, включая вызовы test (). Поддержание состояния таково, что такие вещи, как exec (), могут вызываться итеративно для возврата следующего соответствия. Поскольку вы используете литералы для выражений, интерпретатор просто оптимизирует это для одного экземпляра выражения. Тот же экземпляр + stateful + несколько вызовов test () с тем же arg == тем, что вы видите.

Удалите флаг g в этих выражениях, и все будет хорошо. Это даже не нужно в том виде, в котором вы его используете, поскольку вы тестируете на любое совпадение.

0 голосов
/ 15 октября 2019

Использование test () требует определения регулярного выражения следующим образом:

var patt = new RegExp("e");
var res = patt.test(str);

В вашем случае измените код следующим образом:

var patt = new RegExp("/<(.*?)>/g");
if (messages[i].isInInbox()) {
      Logger.log('inbox'); // (*)
      if (patt.test(from)) {
        Logger.log(patt.test(from));
        Logger.log('true');
        address = /<(.*?)>/.exec(from)[1];
      } else {
        Logger.log(patt.test(from)); // (**)
        Logger.log('false');
...

Примечание: exec () также ожидает правильное определение RegExp.

...