【问题标题】:Google Apps Script - TypeError: Cannot read property "1" from nullGoogle Apps 脚本 - TypeError:无法从 null 读取属性“1”
【发布时间】:2019-03-26 20:25:54
【问题描述】:

我编写了一个 Google Apps 脚本来从我的电子邮件中提取一些数据并将其插入到电子表格中。该脚本实际上运行良好并且可以正常插入数据,但我的日志中不断出现以下错误:

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

According to MDNexec 方法返回一个数组,其中“匹配的文本作为第一项,然后是每个匹配的包含捕获的文本的捕获括号的一项。”因为我想要正则表达式括号内的值,而不是整个匹配的文本,所以我使用[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] );
}

我的Logger.logs 在每个正则表达式之后所有变量都输出正常,就像我说的,数据正在使用上面的函数完美地输入到电子表格中,但是每次getEmails() 函数运行时我仍然得到错误.

有什么想法吗?

【问题讨论】:

    标签: javascript arrays regex google-apps-script null


    【解决方案1】:

    很明显,其中一个正则表达式不匹配,当您尝试访问此类匹配项的第 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_accountmessage_datemessage_vendormessage_amount - 都被分配了一个空字符串。即使一个正则表达式失败,并且没有为它们中的任何一个分配第 1 组值,当它们稍后在代码中被引用时,它们在调用时也不会导致错误,因为它们被分配了一些值。

    请注意,由于您没有遍历匹配项,因此 /g 修饰符是不必要的。

    【讨论】:

    • 太棒了。像魅力一样工作。这样做后没有错误。
    • 您能解释一下(也许可以为未来的 Google 员工添加您的答案)为什么简单地将 message_amount_m[1] 放入它自己的单独变量(message_amount)以在 addDataToSpreadsheet() 中使用而不是 addDataToSpreadsheet( message_date_m[1], message_account_m[1], message_vendor_m[1], message_amount_m[1]); ?我从每个正则表达式中得到了正确的值,所以它们匹配得很好。
    • @dmoz 我添加了更多解释。
    • 我认为这是JS引擎中的一些行为,发生故障。由于计算机基于二进制数进行逻辑,并且我们用类似英语的语言编写代码,有时将两个浮点数相乘会产生意想不到的结果,我们称其为近似而不精确的结果,为了克服我们相应地改变我们的逻辑,这是类似的情况,所以我们的朋友找到了解决方案,但是如果您有适当的异常或错误处理,那么确切的问题会被注意到。
    • 可能JS引擎无法通过索引检测数组元素的类型。并且通过使用另一个变量将它们转换为原始类型,JavaScript中的数组和对象基本上是一些指针,它们被认为是一个复杂的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多