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; }
关键修复说明
- 编码与BOM处理:明确指定UTF-8编码读取文本,并移除可能存在的UTF-8 BOM,避免编码干扰解析。
- 自定义解析逻辑:
- 识别引号包裹的字段,允许字段内包含换行符;
- 处理CSV中的转义双引号(连续两个
"视为一个普通双引号); - 兼容
\n、\r、\r\n三种换行格式。
内容的提问来源于stack exchange,提问作者Shand
相关产品推荐
相关产品推荐

