Google App Script:将QueryImport表C列去重后追加至FK表D列
Google Apps Script 数据去重追加实现优化
需求说明:将QueryImport工作表C列(从第6行开始)的数据,排除空值、null值及特定值"Ppppppppp"后,检查FK工作表D列(从第6行开始)无重复的情况下,追加至FK表D列的末尾。
原代码的问题与优化方向
- 原代码使用
getRange("C6:C")会获取大量空行,造成不必要的内存占用和遍历开销 - 每次判断重复时调用
data2.some(),时间复杂度为O(n²),数据量大时效率极低 - 函数末尾缺少闭合的
},会导致语法错误
优化后的完整代码
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
相关产品推荐
相关产品推荐

