我有一个多页电子表格,其中第 1、2、3 和 4 页的 A 列中包含作业编号 当 Sheet4 Col A 中出现重复数字时,公式会将数字复制到 Col B 并添加 ^ {vers number}。 因此,A 列中的 MO123456 变为 B 列中的 MO123456^1(该数字的每个附加重复项都会递增)。
对于标记为重复的每个数字(在 Sheet4 Col B 中),我希望脚本删除 Sheets 1、2 和 3 中匹配数字的行。
我找到了一个脚本here,我可以对其进行修改以仅查看 Col B 的最后一行。但是我不需要用 indexOf 将此单元格与其他三张纸进行比较,而是需要它来检测带有 ^ 的数字但仅返回 CheckForDup 函数的作业编号。 如果原始数字进来,那么它将复制到没有 ^ 的 Col B,并且脚本应该忽略它。
最后我需要将脚本转换为 onEdit,以便当新数字进入 B 列最后一行时,脚本会自动触发。
`
function removeDupsInOtherSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s1 = ss.getSheetByName("Sheet1").getDataRange().getValues();
var s2 = ss.getSheetByName("Sheet2").getDataRange().getValues();
var s3 = ss.getSheetByName("Sheet3").getDataRange().getValues();
var s4s = ss.getSheetByName("Sheet4");
var s4 = s4s.getRange(s4s.getLastRow(),2,2,s4s.getLastColumn()).getValues()
// iterate s4 and check in s1 & s2 & s3 if duplicate values exist
var nS1 = [];
var nS2 = [];
var nS3 = [];
var s4Col2 = [];// data in column2 of sheet4
for(var n in s4){
s4Col2.push(s4[n][0]);
}
for(var n in s1){ // iterate sheet1 and test col 1 vs col 2 lastRow in sheet4
var noDup1 = checkForDup(s1[n],s4Col2)
if(noDup1){nS1.push(noDup1)};// if not present in sheet4 then keep
}
for(var n in s2){ // iterate sheet2 and test col 1 vs col 2 lastRow in sheet4
var noDup2 = checkForDup(s2[n],s4Col2)
if(noDup2){nS2.push(noDup2)};// if not present in sheet4 then keep
}
for(var n in s3){ // iterate sheet2 and test col 1 vs col 2 lastRow in sheet4
var noDup3 = checkForDup(s3[n],s4Col2)
if(noDup3){nS3.push(noDup3)};// if not present in sheet4 then keep
}
// Logger.log(nS1);// view result
// Logger.log(nS2);
ss.getSheetByName("Sheet1").getDataRange().clear();// clear and update sheets
ss.getSheetByName("Sheet2").getDataRange().clear();
ss.getSheetByName("Sheet3").getDataRange().clear();
ss.getSheetByName("Sheet1").getRange(2,1,nS1.length,nS1[0].length).setValues(nS1);
ss.getSheetByName("Sheet2").getRange(2,1,nS2.length,nS2[0].length).setValues(nS2);
ss.getSheetByName("Sheet3").getRange(2,1,nS3.length,nS3[0].length).setValues(nS3);
}
function checkForDup(item,s){
// Logger.log(s+' = '+item[0]+' ?')
if(s.indexOf(item[0])>-1){
return null;
}
return item;
}
//string.slice(0,string.indexOf('^'));
//REGEXEXTRACT("^[^--]+")
在Sheet4、A 列 中输入作业编号时,脚本会自动在B 列 中生成版本化作业编号。如果作业编号再次出现,其 B 列中的版本将相应增加。
该脚本使用
onEdit
触发器,因此每当在 Sheet4、Column A 中进行更改时,它都会自动使用正确的版本更新 Column B 并删除 Sheet1、 中的匹配行表 2 和 表 3。
您可以尝试以下代码:
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
if (sheet.getName() === "Sheet4" && range.getColumn() === 1) {
const jobNumber = range.getValue();
if (jobNumber) {
const versionedJobNumber = generateVersionedJobNumber(jobNumber);
sheet.getRange(range.getRow(), 2).setValue(versionedJobNumber);
removeMatchingRows(jobNumber);
}
}
}
function generateVersionedJobNumber(jobNumber) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4");
const data = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
let version = 0;
data.forEach((row) => {
const existingJobNumber = row[0];
if (existingJobNumber && existingJobNumber.split("^")[0] === jobNumber) {
version++;
}
});
return `${jobNumber}^${version}`;
}
function removeMatchingRows(jobNumber) {
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) => {
const baseJobNumber = row[0].split("^")[0];
if (baseJobNumber === jobNumber) {
rowsToDelete.push(index + 1);
}
});
rowsToDelete.reverse().forEach(rowIndex => {
sheet.deleteRow(rowIndex);
});
});
}
示例输出:
参考: