использование content.match (regex) возвращает нулевое значение только при поиске ссылок - PullRequest
0 голосов
/ 11 февраля 2019

Я искал ответ на этот вопрос и до сих пор нашел все вокруг него, но не то, что может помочь мне понять, что я делаю неправильно.Каждое утро я получаю отчет оракула, который отправляет электронное письмо с выводом отчета в виде ссылки на лист Google.Я могу сопоставить каждое значение, которое я ищу, за исключением значения ссылки, которое соответствует, когда я использую regex.101.скрипт, который я использую, является модифицированной версией скрипта, который я видел в нескольких постах, и он работает, ИСКЛЮЧАЯ, когда я пытаюсь сопоставить ссылку.из отчета имя и детали в целях безопасности.Я могу вытащить все остальное просто отлично, и он записывает на лист, но ссылка возвращается как Нет ссылки, и Регистратор возвращает ноль.

Идентификатор запроса: 854632157 Имя отчета: Имя отчета и Invoice_Number_854632157 Ссылка на отчет: https://drive.google.com/open?id=id файла, хранящегося на диске

Я могу поместить все содержимое электронной почты в Regex, и оно идеально совпадает до тех пор, пока я не добавлю требуемый '/' до и после.но как только я запускаю программу в скрипте приложений, она возвращает все, кроме последнего значения.~~ Edit ~~

Публикация измененного рабочего скрипта на случай, если кто-то другой обнаружит эту или подобную проблему.надеюсь, я делаю это правильно, если нет, просто дайте мне знать.

function parseEm(start) {
  start = start || 0;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Results");
  var label = sheet.getRange('B2').getValue();
  var threads = GmailApp.search("Label:" + label, 1, 5)
  for (var i = 0; i < threads.length; i++) {

    // Get the first email message of a thread
    var tmp,
      message = threads[i].getMessages()[0],
      subject = message.getSubject(),
      content = message.getPlainBody(),
      str =  message.getRawContent();
    // Get the plain text body of the email message
    //  use getRawContent() to parse link from HTML

    // match each requirement using constant values paired with regex

    if (content) {
     //Request ID:
      tmp = content.match(/Request ID:\s*([A-Za-z0-9\s]+)(\r?\n)/);
      var ID = (tmp && tmp[1]) ? tmp[1].trim() : 'No report id';
     //Report Name: 
      tmp = content.match(/Report Name: \s*([A-Za-z0-9@.]+)/);
      var Name = (tmp && tmp[1]) ? tmp[1] : 'No report name';//.trim()
     //Report Link : 
     var regex = /(Report Link : (http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?)/;
      tmp = str.match(regex);
       var link = (tmp && tmp[1]) ? tmp[1] : 'No link';
       //replace search value with blank 
       var results = link.replace(/Report Link : /i, ' ');
       Logger.log("Link" + link);
       Logger.log("Results" + results);

       Logger.log([ID, Name, subject, results]);
    //write to sheet
      sheet.appendRow([ID, subject, results]);

    } // End if

  } // End for loop
}

Это выведет следующее: клип из прикрепленного листа Google

1 Ответ

0 голосов
/ 11 февраля 2019

Я воткнул его в инструмент тестирования Regex (RegExr) .Это не соответствовало, но я обнаружил, что было пространство между Report Link и :.Таким образом, при условии, что введенные вами данные являются точными, это должно быть проблемой.

Ссылка на отчет _ : https://drive.google.com/open?id=id.

Послеизменяя регулярное выражение, которому оно соответствует.

/Report Link : (http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...