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

Apps Script:Gmail CSV附件导入Google Sheet解析失败求助

解决Gmail CSV附件导入Google Sheet的解析错误问题

问题分析

你的脚本对大部分CSV文件有效,但特定文件抛出Exception: Could not parse text错误,核心原因是该CSV包含引号包裹的字段内换行(如field19),而Google Apps Script内置的Utilities.parseCsv()对这类非完全标准但常见的CSV格式支持不足,同时可能存在UTF-8 BOM干扰解析的情况。

修复后的完整代码

function getCsvFromGmail() {
  // 获取指定条件的最新Gmail线程
  var gmailThread = GmailApp.search("from:test@gmail.com subject:\"testfile\"", 0, 1)[0];
  
  // 提取最新邮件的附件
  var attachments = gmailThread.getMessages()[gmailThread.getMessageCount() - 1].getAttachments();
  var csvBlob = attachments[0];
  
  // 读取CSV文本,指定UTF-8编码并处理BOM
  var csvText = csvBlob.getDataAsString('UTF-8');
  // 移除UTF-8 BOM(若存在,部分生成工具会自动添加)
  if (csvText.charCodeAt(0) === 0xFEFF) {
    csvText = csvText.slice(1);
  }
  
  // 使用自定义解析函数处理带换行的字段
  var csvData = parseCsvWithQuotedNewlines(csvText);
  
  // 写入Google Sheet
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  sheet.clearContents().clearFormats();
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}

// 自定义CSV解析函数,支持引号内换行与转义双引号
function parseCsvWithQuotedNewlines(csvText) {
  var lines = [];
  var currentLine = [];
  var currentField = '';
  var inQuotes = false;
  
  for (var i = 0; i < csvText.length; i++) {
    var char = csvText[i];
    
    if (char === '"') {
      // 处理转义双引号(连续两个引号视为一个)
      if (i < csvText.length - 1 && csvText[i+1] === '"') {
        currentField += '"';
        i++; // 跳过下一个引号
      } else {
        inQuotes = !inQuotes;
      }
    } else if (char === ',' && !inQuotes) {
      // 非引号内的逗号作为字段分隔符
      currentLine.push(currentField); // 若需去除字段前后空格,可改为currentField.trim()
      currentField = '';
    } else if ((char === '\n' || char === '\r') && !inQuotes) {
      // 非引号内的换行作为行分隔符
      currentLine.push(currentField);
      lines.push(currentLine);
      currentLine = [];
      currentField = '';
      // 跳过\r\n组合中的第二个字符
      if (char === '\r' && i < csvText.length - 1 && csvText[i+1] === '\n') {
        i++;
      }
    } else {
      // 普通字符追加到当前字段
      currentField += char;
    }
  }
  
  // 添加最后一行数据
  if (currentField !== '' || currentLine.length > 0) {
    currentLine.push(currentField);
    lines.push(currentLine);
  }
  
  return lines;
}

关键修复说明

  1. 编码与BOM处理:明确指定UTF-8编码读取文本,并移除可能存在的UTF-8 BOM,避免编码干扰解析。
  2. 自定义解析逻辑:
    • 识别引号包裹的字段,允许字段内包含换行符;
    • 处理CSV中的转义双引号(连续两个"视为一个普通双引号);
    • 兼容\n、\r、\r\n三种换行格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:25:13