使用Google Apps Script解析Gmail到Google Sheets时遇日期添加错误
问题排查与修复
核心错误原因
报错 TypeError: message.replace is not a function 是因为你在 gather() 函数中调用 parseEmail(message) 时,传入的 message 是一个数组([邮件日期, 纯文本邮件体]),而不是 parseEmail 期望的字符串类型邮件体。数组没有 replace 方法,因此触发类型错误。
同时,gather() 中同时执行了 setValues(messages) 和 appendRow(parseEmail(...)),导致原始日期和完整邮件体被写入A、B列,之后又追加了解析后的数据,这也是不符合预期的冗余操作。
分步修复
1. 修正 gather() 函数逻辑
- 删除写入原始数据的
setValues语句,保留解析后的结构化数据写入逻辑。 - 遍历邮件数据时,拆分出日期和邮件体字符串,将邮件体传入
parseEmail,并将日期前置到解析结果中再写入表格。
修正后的 gather():
function gather() { let messages = getGmail(); if (messages.length > 0) { let curSheet = SpreadsheetApp.getActiveSheet(); messages.forEach(([emailDate, emailBody]) => { const parsedFields = parseEmail(emailBody); curSheet.appendRow([emailDate, ...parsedFields]); // 将日期放在解析结果的第一列 }); } }
2. 优化 parseEmail() 函数的字段提取
当前 parseEmail 会把邮件开头的 "An account has been created:" 作为第一个元素,我们需要跳过这个无效元素,提取员工ID、姓名等有效字段,同时处理可能的未定义值:
修正后的 parseEmail():
function parseEmail(message){ let parsed = message.replace(/,/g,'') .replace(/\n\s*.+: /g,',') .replace(/^,/,'') .replace(/\n/g,'') .replace(/^[\s]+|[\s]+$/g,'') .replace(/\r/g,'') .split(','); // 提取有效字段:员工ID、FirstName、LastName、Username、Password,其余留空 let result = [1,2,3,4,5].map(index => parsed[index] || ''); return result; }
3. 完整修正后的代码
function onOpen() { const spreadsheet = SpreadsheetApp.getActive(); let menuItems = [ {name: 'Gather emails', functionName: 'gather'}, ]; spreadsheet.addMenu('New Employees', menuItems); } function gather() { let messages = getGmail(); if (messages.length > 0) { let curSheet = SpreadsheetApp.getActiveSheet(); messages.forEach(([emailDate, emailBody]) => { const parsedFields = parseEmail(emailBody); curSheet.appendRow([emailDate, ...parsedFields]); }); } } function getGmail() { const query = "from:(ApplicationServices@help.net) subject:New Account Newer_than:18d NOT label:done"; let threads = GmailApp.search(query,0,10); let label = GmailApp.getUserLabelByName("done"); if (!label) {label = GmailApp.createLabel("done")} let messages = []; threads.forEach(thread => { const m = thread.getMessages()[0]; messages.push([m.getDate(), m.getPlainBody()]); label.addToThread(thread); }); return messages; } function parseEmail(message){ let parsed = message.replace(/,/g,'') .replace(/\n\s*.+: /g,',') .replace(/^,/,'') .replace(/\n/g,'') .replace(/^[\s]+|[\s]+$/g,'') .replace(/\r/g,'') .split(','); let result = [1,2,3,4,5].map(index => parsed[index] || ''); return result; }
效果说明
修复后运行 Gather emails 菜单功能,会将邮件日期写入A列,员工ID写入B列,FirstName写入C列,LastName写入D列,Username写入E列,Password写入F列,符合结构化数据的需求,且不再触发类型错误。
内容的提问来源于stack exchange,提问作者ShawnYo
相关产品推荐
相关产品推荐

