Google Apps Script数据传输耗时过长,如何优化代码提升运行速度
脚本优化方案
性能瓶颈原因
你当前脚本耗时过长的核心原因是循环内反复执行工作表读写操作,SpreadsheetApp的每一次getRange、getValues、setValues调用都是和谷歌服务器交互的IO请求,单次调用耗时虽然不长,但循环内重复调用上千次就会累计出数分钟的耗时。
优化思路
- 一次性读取源表所有待检测数据到内存,仅做1次读操作
- 在内存中过滤出符合日期要求的行,全程无额外IO请求
- 所有符合要求的数据一次性批量写入目标表,仅做1次写操作
- 新增数据的格式统一批量设置,避免逐行调用格式接口
优化后代码
function UploadRepository() { var sheet1 = SpreadsheetApp.openById("SourceSheet"); var sheet2 = SpreadsheetApp.openById("DestinationSheet"); var currDate = new Date(); var editedDate = new Date(currDate - 86400000); var insert = sheet1.getSheetByName("SourceSheetName"); var archive = sheet2.getSheetByName("DestinationSheetName"); // 一次性读取源表所有待检测数据 var lastRow = insert.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); var allSourceData = insert.getRange(2, 1, lastRow - 1, 28).getValues(); // 内存中过滤符合日期条件的行 var filteredData = allSourceData.filter(row => { return row[0] < currDate && row[0] > editedDate; }); // 无符合条件数据直接退出 if(filteredData.length === 0) return; // 批量写入目标表 var targetStartRow = archive.getLastRow() + 1; archive.getRange(targetStartRow, 1, filteredData.length, 28).setValues(filteredData); // 批量设置日期格式 archive.getRange(targetStartRow, 1, filteredData.length, 1).setNumberFormat("MM/dd/yyyy"); }
优化效果
按照这个方案修改后,脚本耗时会从数分钟降低到几秒级别,性能提升至少几十倍,数据量越大提升效果越明显。
内容的提问来源于stack exchange,提问作者Prateek Sharma
相关产品推荐
相关产品推荐

