JavaScript运行时解析URL中CSV意外退出,求大数据量解决方案
解决Google Apps Script解析大CSV时的运行时意外退出问题
当CSV数据量过大时,一次性加载并解析会触发内存溢出或运行时超时错误,试试下面这些方法:
1. 分批请求数据(推荐优先尝试)
如果你的ERP系统支持分页参数(比如page、limit),修改请求URL,每次只拉取部分数据,循环处理直到所有数据导入完成。这样能大幅降低单批次处理的数据量,避免内存过载。
示例代码:
function importCSVInBatches() { var year = "2022"; var user = "mail@mail.es"; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BBDD"); var baseUrl = "http://erp.gruposupra.es/csv/download/?token=***************************" + year + "&user=" + user; var page = 1; var limit = 1000; // 每次拉取1000行,可根据实际调整 var hasMoreData = true; while (hasMoreData) { var csvUrl = baseUrl + "&page=" + page + "&limit=" + limit; var csvContent = UrlFetchApp.fetch(csvUrl).getContentText(); var csvData = Utilities.parseCsv(csvContent, ";"); // 如果返回的数据只有表头或者为空,停止循环 if (csvData.length <= 1) { hasMoreData = false; break; } // 写入数据到表格(跳过表头,避免重复写入) if (page === 1) { sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); } else { var lastRow = sheet.getLastRow(); sheet.getRange(lastRow + 1, 1, csvData.length - 1, csvData[0].length).setValues(csvData.slice(1)); } page++; // 每次循环后短暂休眠,避免请求过于频繁 Utilities.sleep(1000); } }
2. 逐行解析CSV,减少内存占用
不要一次性把整个CSV内容加载到内存,而是通过Blob逐行读取处理,这样内存占用会小很多。
示例代码:
function parseCSVLineByLine() { var year = "2022"; var user = "mail@mail.es"; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BBDD"); var csvUrl = "http://erp.gruposupra.es/csv/download/?token=***************************" + year + "&user=" + user; // 获取CSV的Blob对象 var blob = UrlFetchApp.fetch(csvUrl).getBlob(); var reader = blob.getAs('text/csv').getDataAsString(); var lines = reader.split('\n'); var data = []; // 逐行处理,跳过空行 lines.forEach(function(line) { if (line.trim() !== '') { data.push(line.split(';')); } }); // 分批写入表格,避免单次写入数据量过大 var batchSize = 1000; for (var i = 0; i < data.length; i += batchSize) { var batch = data.slice(i, i + batchSize); sheet.getRange(sheet.getLastRow() + 1, 1, batch.length, batch[0].length).setValues(batch); Utilities.sleep(500); } }
3. 利用Google Sheets内置导入函数
如果脚本处理还是有问题,可以直接用Google Sheets的IMPORTDATA函数,它对大文件的处理更高效,而且不需要写复杂脚本。
在单元格中输入:
=IMPORTDATA("http://erp.gruposupra.es/csv/download/?token=***************************2022&user=mail@mail.es"; ";")
注意把token、年份和用户替换成实际值,分隔符用分号对应你的CSV格式。
4. 拆分脚本运行,避免超时
Google Apps Script单脚本运行最长限制6分钟,如果数据量极大,可把任务拆分成多个小任务,用时间触发器分多次执行。比如先导入1-10000行,再导入10001-20000行,以此类推。
内容的提问来源于stack exchange,提问作者Pau Artiso
相关产品推荐
相关产品推荐

