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

Google App Script:将QueryImport表C列去重后追加至FK表D列

Google Apps Script 数据去重追加实现优化

需求说明:将QueryImport工作表C列(从第6行开始)的数据,排除空值、null值及特定值"Ppppppppp"后,检查FK工作表D列(从第6行开始)无重复的情况下,追加至FK表D列的末尾。

原代码的问题与优化方向

  1. 原代码使用getRange("C6:C")会获取大量空行,造成不必要的内存占用和遍历开销
  2. 每次判断重复时调用data2.some(),时间复杂度为O(n²),数据量大时效率极低
  3. 函数末尾缺少闭合的},会导致语法错误

优化后的完整代码

function appendDataIfNotExists() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const querySheet = ss.getSheetByName("QueryImport");
  const fkSheet = ss.getSheetByName("FK");

  // 获取QueryImport表C列(从第6行起)的实际有效数据
  const queryLastRow = querySheet.getLastRow();
  if (queryLastRow < 6) return; // 没有有效数据时直接返回
  const queryData = querySheet.getRange(6, 3, queryLastRow - 5, 1).getValues().flat();

  // 获取FK表D列(从第6行起)的实际有效数据,转为Set用于快速去重判断
  const fkLastRow = fkSheet.getLastRow();
  let existingValues = new Set();
  if (fkLastRow >= 6) {
    const fkData = fkSheet.getRange(6, 4, fkLastRow - 5, 1).getValues().flat();
    fkData.forEach(val => {
      if (val !== null && val !== "") existingValues.add(val);
    });
  }

  // 筛选符合条件的待追加数据
  const newData = [];
  queryData.forEach(val => {
    if (val !== null && val !== "" && val !== "Ppppppppp" && !existingValues.has(val)) {
      newData.push([val]);
      existingValues.add(val); // 避免QueryImport表内重复数据被多次追加
    }
  });

  // 追加数据到FK表D列末尾
  if (newData.length > 0) {
    const targetRow = fkLastRow < 6 ? 6 : fkLastRow + 1;
    fkSheet.getRange(targetRow, 4, newData.length, 1).setValues(newData);
  }
}

关键优化说明

  • 减少无效数据读取:仅读取工作表中实际有数据的范围,避免空行占用资源
  • 快速去重判断:使用Set存储已存在的值,将重复判断的时间复杂度从O(n)降为O(1)
  • 处理边界情况:当FK表D列无有效数据时,从第6行开始追加;当QueryImport表无有效数据时直接返回
  • 避免内部重复:将筛选出的待追加值加入Set,防止QueryImport表内的重复数据被多次追加

内容的提问来源于stack exchange,提问作者Noor Ansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:47:29