Google Apps Script:基于两列唯一标识避免重复行复制的需求
Google Sheets 脚本修改:基于唯一标识避免重复复制行
需求概述
- Google Form收集学生数据,包含「对应咨询师」字段,所有提交数据存入「Form Responses 1」工作表
- 需将每行数据复制至对应咨询师的专属工作表,且允许咨询师在专属表内修改数据(排序、高亮、添加备注等),因此必须采用复制数据而非查询引用的方式
- 现有脚本通过整行匹配判断重复,但当咨询师修改专属表内的行内容后,脚本再次运行会因整行内容不匹配,重复添加原始表单数据
- 需要修改脚本,改为基于「Form Responses 1」中索引0和1的两列组合作为唯一标识判断重复,仅当该标识组合未在咨询师工作表中存在时才执行复制,忽略咨询师对其他列的修改
修改后的脚本
function copyData() { var ss = SpreadsheetApp.getActive(); var formResponses = ss.getSheetByName("Form Responses 1"); var formValues = formResponses.getDataRange().getValues(); formValues.shift(); // 移除表头行 formValues.forEach(function(row) { var sheetName = row[4]; // 对应"我的升学咨询师"列的索引 var targetSheet = ss.getSheetByName(sheetName); if (!targetSheet) return; // 若不存在对应咨询师工作表,跳过 // 提取当前行的唯一标识(索引0和1的列组合) var uniqueKey = row[0] + "|" + row[1]; // 预构建目标工作表的唯一标识集合,提升查找效率 var targetData = targetSheet.getDataRange().getValues(); var existingKeys = new Set(); targetData.forEach(function(targetRow) { existingKeys.add(targetRow[0] + "|" + targetRow[1]); }); // 仅当唯一标识不存在时,才添加行 if (!existingKeys.has(uniqueKey)) { targetSheet.appendRow(row); } }); }
关键改动说明
- 唯一标识判断逻辑:不再比对整行内容,而是使用
row[0] + "|" + row[1]作为唯一键,确保只要这两列的组合匹配,就判定为已存在该行 - 效率优化:利用
Set存储目标工作表的所有唯一键,将原有的逐行遍历比对(O(n))改为集合查找(O(1)),提升脚本运行速度 - 容错处理:添加了
if (!targetSheet) return;的判断,避免因咨询师名称拼写错误导致的工作表不存在报错
内容的提问来源于stack exchange,提问作者mrventures
相关产品推荐
相关产品推荐

