调整跨工作表重复项删除脚本:适配版本号规则
问题说明
用户现有Google Apps Script脚本,原本逻辑为:当Sheet4的A列新增Job Number时,删除Sheet1、Sheet2、Sheet3中的对应重复项。现需求调整为:
- 当Sheet4的A列新增Job Number时,自动在B列生成带版本号的格式(如
MO123456^1),此时不删除其他表的重复项; - 仅当生成的版本号≥
^2时(即该Job Number并非首次新增),才视为重复项,从Sheet1、Sheet2、Sheet3中删除所有对应基础Job Number的行。
用户尝试在removeMatchingRows函数中通过拆分^获取版本号并判断是否大于1,但未成功,需修改脚本逻辑。
原代码问题分析
onEdit函数逻辑错误:无论生成的版本号是^1还是更高版本,都会调用删除函数,不符合“仅版本≥2时删除”的需求;removeMatchingRows函数判断逻辑偏差:原代码判断的是其他表中Job Number的版本>1,而非Sheet4中新生成的版本号;- 版本号处理容错性不足:若其他表中的Job Number不带
^版本标识,拆分后split("^")[1]会返回undefined,导致比较逻辑失效。
修改后的完整代码
function onEdit(e) { const sheet = e.source.getActiveSheet(); const range = e.range; // 仅处理Sheet4的A列输入(排除表头行,假设表头在第1行) if (sheet.getName() === "Sheet4" && range.getColumn() === 1 && range.getRow() > 1) { const jobNumber = range.getValue().toString().trim(); if (jobNumber) { const versionedJobNumber = generateJobNumber(jobNumber); sheet.getRange(range.getRow(), 2).setValue(versionedJobNumber); // 提取生成的版本号,仅当版本≥2时执行删除操作 const currentVersion = parseInt(versionedJobNumber.split("^")[1], 10); if (!isNaN(currentVersion) && currentVersion >= 2) { removeMatchingRows(jobNumber); } } } } function generateJobNumber(jobNumber) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4"); // 从第2行开始获取数据(排除表头) const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues(); let version = 0; data.forEach((row) => { const existingJob = row[0].toString().trim(); if (existingJob) { const baseExistingJob = existingJob.split("^")[0]; if (baseExistingJob === jobNumber) { version++; } } }); // 版本从1开始计数,首次新增为^1 return `${jobNumber}^${version + 1}`; } function removeMatchingRows(baseJobNumber) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetsToCheck = ["Sheet1", "Sheet2", "Sheet3"]; sheetsToCheck.forEach(sheetName => { const sheet = ss.getSheetByName(sheetName); if (!sheet) return; const data = sheet.getDataRange().getValues(); const rowsToDelete = []; data.forEach((row, index) => { if (!row[0]) return; // 跳过空行 const currentJob = row[0].toString().trim(); const baseCurrentJob = currentJob.split("^")[0]; // 匹配基础Job Number即可,无需判断其他表的版本 if (baseCurrentJob === baseJobNumber) { rowsToDelete.push(index + 1); // 转换为实际行号(数组从0开始,行号从1开始) } }); // 倒序删除行,避免删除后行号偏移 rowsToDelete.reverse().forEach(rowIndex => { sheet.deleteRow(rowIndex); }); }); }
关键修改点说明
onEdit函数优化:- 新增表头行判断(
range.getRow() > 1),避免误处理表头; - 提取生成的版本号,仅当版本≥2时才调用
removeMatchingRows; - 对输入的Job Number做
toString().trim()处理,避免空值或空格干扰。
- 新增表头行判断(
generateJobNumber函数修正:- 从第2行开始读取数据,排除表头;
- 版本计数从1开始(首次新增生成
^1),修正原代码首次新增得到^0的错误; - 对现有Job Number做格式处理,确保拆分逻辑稳定。
removeMatchingRows函数逻辑调整:- 不再判断其他表中Job Number的版本,仅匹配基础Job Number即可(符合需求中“版本≥2时删除对应重复项”的逻辑);
- 新增空行判断,避免处理无效数据;
- 对每行的Job Number做格式处理,提升容错性。
内容的提问来源于stack exchange,提问作者Scrib68
相关产品推荐
相关产品推荐

