使用AppScript将Google Sheet数据推送至BigQuery:处理换行符问题
解决Google Sheet含换行符数据导入BigQuery失败的问题
你的核心问题是手动拼接CSV时未遵循CSV格式规范:当字段包含换行符、逗号或双引号这类特殊字符时,直接拼接会破坏CSV结构,导致BigQuery解析错误。要让BigQuery正确识别字段内的换行符,必须生成符合标准的CSV内容。
解决方案:生成规范CSV格式
替换原代码中简单拼接行的逻辑,改成对每个字段进行特殊字符处理:
- 若字段包含逗号、换行符或双引号,用双引号包裹字段
- 字段内部的双引号替换为两个双引号(CSV转义规则)
修改后的关键代码
先添加一个CSV转换函数:
function convertToCSV(rows) { return rows.map(row => { return row.map(cell => { // 处理空单元格 if (cell === null || cell === undefined) return ''; let cellStr = String(cell); // 检查是否需要包裹引号 if (cellStr.includes(',') || cellStr.includes('\n') || cellStr.includes('"')) { // 转义内部双引号,再包裹外层引号 return `"${cellStr.replace(/"/g, '""')}"`; } return cellStr; }).join(','); }).join('\n'); }
然后替换原代码中生成CSV的部分:
// 原代码:var rowsCSV = rows.join("\n"); // 替换为: var rowsCSV = convertToCSV(rows);
完整修改后的代码
function loadCogsPlayupHistory() { // Enter BigQuery Details as variable. var projectId = 'myproject'; // Dataset var datasetId = 'my_Dataset'; // Table var tableId = 'my table'; // WRITE_APPEND: If the table already exists, BigQuery appends the data to the table. var writeDispositionSetting = 'WRITE_APPEND'; // The name of the sheet in the Google Spreadsheet to export to BigQuery: var sheetName = 'data'; Logger.log(sheetName) var file = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); Logger.log(file) // This represents ALL the data var rows = file.getDataRange().getValues(); // 新增CSV转换函数 function convertToCSV(rows) { return rows.map(row => { return row.map(cell => { if (cell === null || cell === undefined) return ''; let cellStr = String(cell); if (cellStr.includes(',') || cellStr.includes('\n') || cellStr.includes('"')) { return `"${cellStr.replace(/"/g, '""')}"`; } return cellStr; }).join(','); }).join('\n'); } // 生成规范CSV var rowsCSV = convertToCSV(rows); var blob = Utilities.newBlob(rowsCSV, "text/csv"); var data = blob.setContentType('application/octet-stream'); Logger.log(rowsCSV) // Create the data upload job. var job = { configuration: { load: { destinationTable: { projectId: projectId, datasetId: datasetId, tableId: tableId }, skipLeadingRows: 1, writeDisposition: writeDispositionSetting } } }; Logger.log(job) // send the job to BigQuery so it will run your query var runJob = BigQuery.Jobs.insert(job, projectId, data); //Logger.log('row 61 '+ runJob.status); var jobId = runJob.jobReference.jobId Logger.log('jobId: ' + jobId); Logger.log('status: '+ runJob.status); Logger.log('FINISHED!'); // } }
原理说明
CSV格式有明确的规范:
- 字段包含逗号、换行符或双引号时,必须用双引号包裹
- 字段内部的双引号需要用两个双引号进行转义
这样BigQuery在解析CSV时,会把包裹在双引号内的换行符识别为字段内容的一部分,而不是行分隔符,从而避免插入失败。
内容的提问来源于stack exchange,提问作者Wesley Jeftha
相关产品推荐
相关产品推荐

