You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gmail同步Google Sheets脚本报TypeError: Cannot read property '1' of null如何解决

错误根因分析
  • 第一个错误TypeError: Cannot read property '1' of null不是邮件正文为null导致,是正则匹配失败时match()方法会返回null,直接对返回结果取索引[1]就会触发该错误。触发场景包括邮件正文没有对应匹配字段、正则规则和实际正文格式不匹配、Google Apps Script正则引擎不支持你用的s修饰符(旧版本引擎不支持dotall修饰符,.无法匹配换行符)。
  • 第二个错误TypeError: body.match is not a function是添加非空判断时逻辑遗漏,当getPlainBody()返回非字符串类型(比如无纯文本内容时返回undefined),没有提前转成字符串就调用match()方法导致。
修复后的完整代码
function onOpen(e){
    const ui = SpreadsheetApp.getUi(); // 补充原代码缺失的ui定义,避免打开表格时报错
    ui.createMenu("Tessa").addItem("Get Emails by Label", "getGmailEmails").addToUi();
}

function getGmailEmails(){
  var label = GmailApp.getUserLabelByName("tobeprocessed");
  if(!label) return; // 新增标签存在性判断,避免标签不存在时报错
  var threads = label.getThreads();
  
  for(var i = threads.length - 1; i >=0; i--){
    var messages = threads[i].getMessages();
    
    for (var j = 0; j <messages.length; j++){
      var message = messages[j];
      if (message.isUnread()){
        try {
          extractDetails(message);
        } catch (e) {
          console.error("邮件处理失败:" + e.message, message.getSubject());
        }
        GmailApp.markMessageRead(message);
      }
    }
    threads[i].removeLabel(label);
  }
}

function extractDetails(message){
  var emailData = {
    Locatie: "Null",
    Score: "Null",
    Datum: "Null",
    Opmerking: "Null",
  }
  
  emailData.Datum = message.getDate();
  // 统一转成字符串,避免非字符串类型调用match方法报错
  var body = String(message.getPlainBody() || "");

  // 用[\s\S]代替.实现匹配所有字符(包括换行),兼容所有Apps Script引擎,非贪婪匹配避免范围溢出
  var locatieRegex = /van ([\s\S]*?) heeft/;
  const locatieMatch = body.match(locatieRegex);
  if(locatieMatch) emailData.Locatie = locatieMatch[1].trim();

  var scoreRegex = /beoordeeld met een ([\s\S]*?)\.Toelichting melder:/;
  const scoreMatch = body.match(scoreRegex);
  if(scoreMatch) emailData.Score = scoreMatch[1].trim();

  var opmerkingRegex = /Toelichting melder: ([\s\S]*?)Beschrijving incident:/; 
  const opmerkingMatch = body.match(opmerkingRegex);
  if(opmerkingMatch) emailData.Opmerking = opmerkingMatch[1].trim();


  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  var emailDataArr = [];
  
  for(var propName in emailData){
    emailDataArr.push(emailData[propName]);
  }
  activeSheet.appendRow(emailDataArr);
}
核心修改说明
  • 补充了onOpen函数里的ui变量定义,修复原代码打开表格就报错的隐藏问题
  • 增加标签存在性判断,避免标签不存在时执行报错
  • 给邮件处理逻辑加了try-catch异常捕获,单封邮件格式异常不会中断整个批量处理流程,错误信息会输出到控制台方便排查
  • 所有正则匹配都先判断是否有返回结果,匹配失败时保留默认值不会触发空指针错误
  • 用[\s\S]*?代替原来的.*加s修饰符,兼容所有Google Apps Script的JS引擎,同时用非贪婪匹配*?避免匹配范围过长
  • 统一将正文转为字符串类型,从根源避免match is not a function错误
  • 匹配结果增加trim()处理,自动去掉前后多余的空格、换行符

内容的提问来源于stack exchange,提问作者Tessa Beijloos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:18:01