如何优化删除Google Sheets重复行的Apps Script函数,解决运行过慢问题
Google Apps Script 去重脚本优化方案
性能瓶颈说明
现有代码耗时过长的核心原因是循环内频繁调用Spreadsheet IO接口:getRange()、getValue()、setValue()、deleteRow()每次执行都会发起服务器请求,数百上千次循环累计耗时自然达到十几分钟。按照最佳实践,所有数据读写都应该批量完成,全程仅做1次读、1次写操作即可。
优化后代码
function test() { var nom_fichier_tlb = "Bloc2021"; var fileId = DriveApp.getFilesByName(nom_fichier_tlb).next().getId(); var sheet = SpreadsheetApp.openById(fileId).getSheets()[0]; var lastRow = sheet.getLastRow(); var lastCol = sheet.getLastColumn(); // 一次性读取所有行数据到内存数组,仅1次读操作 var allData = sheet.getRange(1, 1, lastRow, lastCol).getValues(); var processedData = []; var prevCol1Val = null; for (var i = 0; i < allData.length; i++) { var currentRow = allData[i]; var currentCol1 = currentRow[0]; var currentCol4 = currentRow[3]; // 处理第四列末尾空格trim逻辑 if (FonctionsUtiles.right(currentCol4 + "", 1) == " ") { currentRow[3] = FonctionsUtiles.trim(currentCol4 + ""); } // 连续空行日志逻辑 if (i < allData.length - 1 && currentCol1 == "" && allData[i+1][0] == "") { Logger.log("toast"); } // 第一列去重逻辑:和上一行第一列值相同则跳过当前行(即不加入结果数组,等效删除) if (i == 0 || currentCol1 !== prevCol1Val) { processedData.push(currentRow); prevCol1Val = currentCol1; } } // 清空原表,一次性写入处理后的数据,仅1次写操作 sheet.clearContents(); sheet.getRange(1, 1, processedData.length, processedData[0].length).setValues(processedData); }
优化说明
- 所有数据处理逻辑完全对齐原有业务逻辑,包含第一列相邻去重、第四列Trim处理、连续空行日志输出
- 全程仅调用2次Spreadsheet IO接口,耗时可从20分钟降到几秒到几十秒级别
- 修正了原有循环中删除行后索引偏移导致的漏检问题:原有代码删除第jj行后,下一次循环jj+1,原本的jj+1行移到了jj位置,会被跳过检查
内容的提问来源于stack exchange,提问作者BigBenne
相关产品推荐
相关产品推荐

