解决含换行符的CSV文件导入Google Sheet格式混乱问题
问题描述
我使用以下代码将名为“Home care.csv”的CSV文件导入Google Sheet:
function DeleteTracker() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home care'); ss.getRange('A2:Z50000').clearContent(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var maxRows = sheet.getMaxRows(); var lastRow = sheet.getLastRow(); if (maxRows-lastRow != 0) { sheet.deleteRows(lastRow+1, maxRows-lastRow); } } function importCSVFromGoogleDrive() { var file = DriveApp.getFilesByName('Home care.csv').next(); var csvData = Utilities.parseCsv(file.getBlob().getDataAsString()); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home care'); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); }
问题在于该CSV文件的部分单元格内存在用换行符分隔的多条信息,导入后这些信息被拆分到下方行中,导致表格格式混乱。如何让这些内容保留在原单元格内?
解决方案
情况1:CSV文件符合规范(带换行的单元格已用双引号包裹)
默认的Utilities.parseCsv()支持解析双引号包裹的换行内容,只需显式指定参数并添加自动换行设置即可:
修改importCSVFromGoogleDrive函数:
function importCSVFromGoogleDrive() { var file = DriveApp.getFilesByName('Home care.csv').next(); var csvContent = file.getBlob().getDataAsString(); // 指定逗号为分隔符,启用引号识别(默认开启,显式写出更清晰) var csvData = Utilities.parseCsv(csvContent, ',', true); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home care'); // 先执行清除操作避免重复数据 DeleteTracker(); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); // 开启单元格自动换行,让内容在单元格内正常显示换行 sheet.getRange(1, 1, csvData.length, csvData[0].length).setWrap(true); }
情况2:CSV文件未规范包裹带换行的单元格
如果CSV里带换行的单元格没加双引号,Utilities.parseCsv()会把换行当成新行。这时需要先替换换行标记,导入后再还原:
修改后的函数:
function importCSVFromGoogleDrive() { var file = DriveApp.getFilesByName('Home care.csv').next(); var csvContent = file.getBlob().getDataAsString(); // 用临时标记替换单元格内的换行,注意区分行尾换行 var tempMarker = '||NEWLINE||'; // 先替换所有换行,再把行分隔符(假设是\r\n)恢复 var processedContent = csvContent.replace(/\n/g, tempMarker).replace(new RegExp(tempMarker + '\r', 'g'), '\r\n'); // 解析处理后的CSV var csvData = Utilities.parseCsv(processedContent); // 把临时标记还原成换行符 csvData = csvData.map(row => row.map(cell => cell.replace(new RegExp(tempMarker, 'g'), '\n'))); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home care'); DeleteTracker(); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); // 开启自动换行 sheet.getRange(1, 1, csvData.length, csvData[0].length).setWrap(true); }
注意事项
- 如果你的CSV行分隔符是单纯的
\n(不是\r\n),需要把预处理里的tempMarker + '\r'改成tempMarker。 setWrap(true)是为了让单元格内的换行内容自动换行显示,否则内容会挤成一行。
内容的提问来源于stack exchange,提问作者Isabelle
相关产品推荐
相关产品推荐

