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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:10:45