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
相关产品推荐
相关产品推荐

