Google Apps Script导入CSV报无法解析文本错误如何解决
报错核心原因
抛出Could not parse text错误的根本原因是文件编码不匹配:
- 你使用的Revit导出CSV文件在中文环境下默认采用GBK编码,而代码中
getBlob().getDataAsString()方法默认以UTF-8编码读取文件内容,读取后会出现乱码,破坏CSV原有的逗号分隔结构,直接导致Utilities.parseCsv()解析失败。 - 原代码还存在3个隐性问题:
- 没有做文件存在性校验,若Drive中无对应名称文件,调用
file.next()会直接抛出无匹配项错误 - 没有指定CSV分隔符,若CSV实际使用非逗号分隔符,会出现列解析错位
- 写入前没有清空目标工作表旧数据,多次导入会残留历史内容
- 没有做文件存在性校验,若Drive中无对应名称文件,调用
修复后可直接运行的代码
function importConduitRunsSchdeule() { const ss = SpreadsheetApp.getActive(); const targetSheetName = 'CONDUIT_RUNS_REVIT'; const csvFileName = "CONDUIT_RUNS_REVIT.csv"; // 校验目标文件是否存在 const fileIterator = DriveApp.getFilesByName(csvFileName); if (!fileIterator.hasNext()) throw `Drive中未找到文件:${csvFileName}`; const csvFile = fileIterator.next(); // 指定GBK编码读取文件内容,适配Revit导出CSV的默认编码 const csvRawContent = csvFile.getBlob().getDataAsString('GBK'); // 明确指定逗号为分隔符解析CSV const parsedCsvData = Utilities.parseCsv(csvRawContent, ','); if (parsedCsvData.length === 0) throw 'CSV文件无有效内容'; // 校验目标工作表是否存在 const targetSheet = ss.getSheetByName(targetSheetName); if (!targetSheet) throw `当前表格中未找到工作表:${targetSheetName}`; // 清空原有内容后写入新数据 targetSheet.clearContents(); targetSheet.getRange(1, 1, parsedCsvData.length, parsedCsvData[0].length) .setValues(parsedCsvData); }
注意事项
- 首次运行脚本时,会弹出Google账号授权提示,按照指引授予脚本Drive文件读取、电子表格编辑权限即可正常运行
- 如果运行后出现列错位问题,可以本地打开CSV确认实际分隔符,替换
Utilities.parseCsv第二个参数为对应分隔符即可(比如分号分隔就传入';') - 若后续CSV导出工具更换为UTF-8编码,把
getDataAsString('GBK')改回getDataAsString()即可正常解析
内容的提问来源于stack exchange,提问作者alanWall
相关产品推荐
相关产品推荐

