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

如何优化删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 10:18:05