检测到第 4 张中的重复作业编号后,从 3 张中删除匹配的行

问题描述 投票:0回答:1

我有一个多页电子表格,其中第 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("^[^--]+")
google-apps-script
1个回答
0
投票

检测到第 4 张中重复的作业编号时,自动删除 3 张中的匹配行

Sheet4A 列 中输入作业编号时,脚本会自动在B 列 中生成版本化作业编号。如果作业编号再次出现,其 B 列中的版本将相应增加。

该脚本使用

onEdit
触发器,因此每当在 Sheet4Column 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);
    });
  });
}

示例输出:

Output

Output 2

参考:

编辑(e)

包括()

forEach()

© www.soinside.com 2019 - 2024. All rights reserved.