Google Apps Script - TypeError: Невозможно прочитать свойство "1" из null - PullRequest
0 голосов
/ 22 октября 2018

Я собрал скрипт Google Apps, чтобы извлечь некоторые данные из моих электронных писем и вставить их в электронную таблицу.Сценарий на самом деле работает отлично и вставляет данные нормально, но я продолжаю получать следующую ошибку в моем журнале:

TypeError: Cannot read property "1" from null. (line 46, file "Code")

Согласно MDN , *Метод 1008 * возвращает массив с «совпадающим текстом в качестве первого элемента, а затем по одному элементу для каждой совпадающей скобки захвата, содержащей текст, который был захвачен».Поскольку я хочу, чтобы значение в скобках моего регулярного выражения, а не весь сопоставленный текст, я использую [1].

Вот эта функция:

function getEmails() {
  var label = GmailApp.getUserLabelByName("CapitalOne Transaction");
  var threads = label.getThreads(); // Get threads of label above
  for (var i in threads) {
    var messages = threads[i].getMessages();
    for (var j in messages) {
      if ( messages[j].isUnread() ) {
        var emailBody = messages[j].getPlainBody();
        Logger.log("Email body: " + emailBody);

        // Get account number
        const regExpAcct = /Account ending in (\d{4})/g;
        var message_account = regExpAcct.exec(emailBody);
        if(message_account){ Logger.log("Email message accnt: " + message_account[1]); }

        // Get date of transaction
        var regExpDate = /we're notifying you that on (...+), at/g;
        var message_date = regExpDate.exec(emailBody);
        if(message_date){ Logger.log("Email message date: " + message_date[1]); }

        // Get vendor name
        var regExpVendor = /, at (...+),/g;
        var message_vendor = regExpVendor.exec(emailBody);
        if(message_vendor){ Logger.log("Email message vendor: " + message_vendor[1]); }

        // Get transaction amount
        const regExpAmount = /purchase in the amount of \$(\S+) was/g;
        var message_amount = regExpAmount.exec(emailBody);
        if(message_amount){ Logger.log("Email message amount: " + message_amount[1]); }

        addDataToSpreadsheet( message_date[1], message_account[1], message_vendor[1], message_amount[1] );
        messages[j].markRead();
      }
    }
  }
}

Строка(46) это вопрос: addDataToSpreadsheet( message_date[1], message_account[1], message_vendor[1], message_amount[1] );

, который вызывает эту функцию:

function addDataToSpreadsheet( date, account, vendor, amount ) {
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow( [date, account, vendor, amount] );
}

My Logger.log s после каждого регулярного выражения все выводят переменные в порядке, и, как я сказалданные отлично вводятся в электронную таблицу с помощью указанной выше функции, но я все равно получаю сообщение об ошибке каждый раз, когда запускается функция getEmails().

Есть идеи, почему?

1 Ответ

0 голосов
/ 22 октября 2018

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

var emailBody = messages[j].getPlainBody();
Logger.log("Email body: " + emailBody);
var message_account = "", message_date = "", message_vendor = "", message_amount = "";

// Get account number
const regExpAcct = /Account ending in (\d{4})/;
var message_account_m = regExpAcct.exec(emailBody);
if(message_account_m){ message_account = message_account_m[1]; Logger.log("Email message accnt: " + message_account); }
// Get date of transaction
var regExpDate = /we're notifying you that on (...+), at/;
var message_date_m = regExpDate.exec(emailBody);
if(message_date_m){ message_date = message_date_m[1]; Logger.log("Email message date: " + message_date); }

// Get vendor name
var regExpVendor = /, at (...+),/;
var message_vendor_m = regExpVendor.exec(emailBody);
if(message_vendor_m){ message_vendor = message_vendor_m[1]; Logger.log("Email message vendor: " + message_vendor); }

// Get transaction amount
const regExpAmount = /purchase in the amount of \$(\S+) was/;
var message_amount_m = regExpAmount.exec(emailBody);
if(message_amount_m){ message_amount = message_amount_m[1]; Logger.log("Email message amount: " + message_amount); }

addDataToSpreadsheet( message_date, message_account, message_vendor, message_amount);
messages[j].markRead();

Теперь все четыре переменные - message_account, message_date, message_vendor и message_amount - присваивается пустая строка.Даже если регулярное выражение не выполнено, и значение группы 1 не назначено ни одному из них, при последующем обращении к ним в коде они не вызовут ошибок при вызове, поскольку им присвоено какое-то значение.

Обратите внимание, чтопоскольку вы не перебираете совпадения, модификатор /g не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...