用Google Apps Script提取邮件正文至表格,match函数返回NULL求解决
解决Google Apps Script提取邮件正文到表格返回NULL的问题
问题根源
你的正则表达式和实际邮件正文格式不匹配,导致无法捕获内容:
- 邮件里的字段格式是
Account : xyz(冒号后有空格),但你写的正则是Account:\n,漏掉了冒号后的空格,直接导致匹配失败。 - 部分正则的匹配逻辑不合理,比如
Address:\n([\s\S]+)会直接匹配到邮件末尾,而不是当前字段的单行内容。
修正后的脚本
var ss = SpreadsheetApp.getActiveSheet(); var label = GmailApp.getUserLabelByName("Exclusion Check"); var threads = label.getThreads(); for (var i=0; i<threads.length; i++) { // 改为遍历所有带标签的邮件线程 var messages = threads[i].getMessages(); for (var j=0; j<messages.length; j++) { var content = messages[j].getPlainBody(); if (content) { var tmp; // 匹配Account:修正空格,捕获当前行内容 tmp = content.match(/Account : ([^\r\n]+)/); var account = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; // 匹配Address:同样修正空格,限制到单行 tmp = content.match(/Address : ([^\r\n]+)/); var address = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; // 匹配你给出的邮件里的Mail Id字段 tmp = content.match(/Mail Id : ([^\r\n]+)/); var mailId = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; // 匹配你给出的邮件里的Id字段 tmp = content.match(/Id : ([^\r\n]+)/); var id = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; // 若实际邮件存在以下字段,按同样格式修正正则即可 tmp = content.match(/MDM ID : ([^\r\n]+)/); var mdmId = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; tmp = content.match(/NPI ID : ([^\r\n]+)/); var npiId = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; tmp = content.match(/Active State Licenses : ([^\r\n]+)/); var activeStateLicenses = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; tmp = content.match(/Requested by : ([^\r\n]+)/); var requestedBy = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; tmp = content.match(/Requestor e-mail : ([^\r\n]+)/); var email = (tmp && tmp[1]) ? tmp[1].trim() : 'NULL'; var sub = messages[j].getSubject(); var dat = messages[j].getDate(); // 按需求调整列顺序后写入表格 ss.appendRow([account, address, mailId, id, mdmId, npiId, activeStateLicenses, requestedBy, email, sub, dat]) } } // threads[i].removeLabel(label); // 测试无误后可取消注释,移除已处理邮件的标签 }
关键修改说明
- 正则匹配修正:所有字段的正则都补上了冒号后的空格(
Account :),并用([^\r\n]+)仅捕获当前行内容,避免匹配到后续无关文本。 - 字段对应修正:根据你提供的邮件格式,新增了
Mail Id和Id的匹配逻辑,若实际邮件有其他字段,只需复制该格式修改正则即可。 - 遍历逻辑优化:把
i<1改为i<threads.length,这样会处理所有带目标标签的邮件线程,而非仅处理第一个。
内容的提问来源于stack exchange,提问作者Parmeet Singh
相关产品推荐
相关产品推荐

