请求修改Google Apps Script实现跨表重复行转移功能
Google表格脚本修改:双表勾选重复行转移需求
需求说明
我有一个包含多个工作表的Google表格:
- 第1、2工作表存在重复行数据
- 两个表的第8列都设有复选框
- 要求:当某重复行在两个表中的复选框均被勾选时,将其中一行转移至第3工作表
原实现代码(单表勾选转移)
function onEdit(e) { let range = e.range; let col = range.getColumn(); let row = range.getRow(); let val = range.getValue(); let source = e.source.getActiveSheet(); let ss = SpreadsheetApp.getActiveSpreadsheet(); let sourceSheet = ss.getSheetByName(source.getName()); if (sourceSheet.getName() == 'SHEET1' && col == 8 && val == true){ let data = sourceSheet.getRange(row,1,1,7).getValues(); let targetSheet = ss.getSheetByName('SHEET2'); targetSheet.appendRow(data[0]); sourceSheet.deleteRow(row); } if (sourceSheet.getName() == 'SHEET2' && col == 8 && val == true){ let data = sourceSheet.getRange(row,1,1,7).getValues(); let targetSheet = ss.getSheetByName('SHEET3'); targetSheet.appendRow(data[0]); sourceSheet.deleteRow(row); } }
修改后的代码(满足双表勾选重复行转移)
function onEdit(e) { const range = e.range; const col = range.getColumn(); const row = range.getRow(); const val = range.getValue(); const ss = e.source; const activeSheet = ss.getActiveSheet(); const sheet1 = ss.getSheetByName('SHEET1'); const sheet2 = ss.getSheetByName('SHEET2'); const sheet3 = ss.getSheetByName('SHEET3'); // 仅处理第8列的复选框勾选操作 if (col !== 8 || val !== true) return; // 获取当前操作行的核心数据(前7列)作为重复判断依据 const currentRowData = activeSheet.getRange(row, 1, 1, 7).getValues()[0].join('|'); // 定义查找重复行的函数 function findDuplicateRow(targetSheet, compareData) { const allData = targetSheet.getDataRange().getValues(); // 从第2行开始遍历(假设第1行是表头) for (let i = 1; i < allData.length; i++) { const rowData = allData[i].slice(0,7).join('|'); const checkboxState = allData[i][7]; // 第8列是复选框(索引7) if (rowData === compareData && checkboxState === true) { return i + 1; // 返回实际行号(索引+1) } } return null; } // 分两种情况处理:当前操作表是SHEET1或SHEET2 if (activeSheet.getName() === 'SHEET1') { const duplicateRowInSheet2 = findDuplicateRow(sheet2, currentRowData); if (duplicateRowInSheet2) { // 将SHEET1的当前行转移到SHEET3 sheet3.appendRow(activeSheet.getRange(row,1,1,7).getValues()[0]); activeSheet.deleteRow(row); // 可选:也可以删除SHEET2中的重复行,根据需求调整 // sheet2.deleteRow(duplicateRowInSheet2); } } else if (activeSheet.getName() === 'SHEET2') { const duplicateRowInSheet1 = findDuplicateRow(sheet1, currentRowData); if (duplicateRowInSheet1) { // 将SHEET2的当前行转移到SHEET3 sheet3.appendRow(activeSheet.getRange(row,1,1,7).getValues()[0]); activeSheet.deleteRow(row); // 可选:也可以删除SHEET1中的重复行,根据需求调整 // sheet1.deleteRow(duplicateRowInSheet1); } } }
关键改动说明
- 重复行判断:将每行前7列数据拼接成字符串作为唯一标识,确保能准确匹配重复行
- 双表状态校验:当勾选某表的复选框时,自动检查另一张表中对应重复行的复选框是否也已勾选
- 逻辑优化:仅在满足双勾选条件时执行转移操作,避免误触发;同时保留了可选的删除另一张表重复行的逻辑,可根据实际需求开启
- 性能优化:提前获取工作表对象,减少重复调用;遍历数据时跳过表头行
内容的提问来源于stack exchange,提问作者Bohdan
相关产品推荐
相关产品推荐

