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

解决含换行符的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:36:38