当前位置: 首页 > 知识库问答 >
问题:

根据主文件上的2个值删除其他工作表中的行

萧晔
2023-03-14

是否可以基于2个值删除其他图纸上的行?假设我有3张床单。在主工作表(工作表1)中,将有两列:分支和管理器,与其余工作表相同。

这里是电子表格样本。

示例数据:

第1页:(主页)

  ---   BRANCH    ---   MANAGER  ---
      California       Tom Chang
      Brooklyn         Jon Sieg
      New York         Raq Craig

表2:

  ---   BRANCH    ---   MANAGER  ---
      California       Jane Cali
      California       Tom Chang
      San Francisco    James Chao

表2:

  ---   BRANCH    ---   MANAGER  ---
      California       Jane Cali
      California       Tom Chang
      New York         Daniel Trevor

应该做的是:

分支列值不应在所有工作表中重复。因此,我们需要做的是删除工作表2和3上的行,如果分支列与主工作表(表1)相等IF AND ONLY IF如果管理器不相同/相等。因此,在我上面给出的数据中,加州支行和经理Tom Chang存在于所有工作表中,因此不应触及。但加州支行在其余2张纸中使用不同的Manager重复。因此,第2和第3页应删除第California-Jane Cali行。

偶然发现一个从这篇文章中借来的脚本,但似乎不起作用。此处:

function removeDupsInOtherSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var mainsheet = ss.getSheetByName("Sheet3").getDataRange().getValues();   
  var sheet2 = ss.getSheetByName("Sheet2").getDataRange().getValues();  
  var sheet3 = ss.getSheetByName("Sheet3").getDataRange().getValues(); 


  // iterate mainsheet and check in sheet2 & sheet3 if duplicate values exist
  var nsheet2 = [];
  var nsheet3 = [];
  var mainsheetCol1 = [];// data in column1 of main sheet
  var mainsheetCol2 = [];// data in column2 of main sheet

  for(var n in mainsheet){
    mainsheetCol1.push(mainsheet[n][0]); //column1
    mainsheetCol2.push(mainsheet[n][3]); //column2
  }
  for(var n in sheet2){ // iterate sheet2 and test col 1 vs col 1 and co2 1 vs co2 1in sheet2
    var noDup1 = checkForDup(sheet2[n],mainsheetCol1,mainsheetCol2)
    if(noDup1){nsheet2.push(noDup1)};// if not present in sheet3 then keep
  } 
  for(var n in sheet3){  // iterate sheet3 and test col 1 vs col 1 and co2 1 vs co2  in sheet3
    var noDup2 = checkForDup(sheet3[n],mainsheetCol1,mainsheetCol2)
    if(noDup2){nsheet3.push(noDup2)};// if not present in sheet3 then keep
  }
  // view result
  Logger.log(nsheet2);
  Logger.log(nsheet3);

  // clear and update sheets
  ss.getSheetByName("Sheet2").getDataRange().clear();
  ss.getSheetByName("Sheet3").getDataRange().clear();
  ss.getSheetByName("Sheet2").getRange(1,1,nsheet2.length,nsheet2[0].length).setValues(nsheet2);
  ss.getSheetByName("Sheet3").getRange(1,1,nsheet3.length,nsheet3[0].length).setValues(nsheet3);
}

//Here can't seem to make it work to check if column 2 is not equal to the other sheets
//item is sheet2[n]
// s is mainsheetCol1
// s2 is mainsheetCol2
function checkForDup(item,s,s2){
  Logger.log(s+' = '+item[0]+'  ?')
  Logger.log(s2+' = '+item[1]+'  ?')
    if((s.indexOf(item[0])>-1) && (s2.indexOf(item[1])>-1))){
      return null;
    }
  return item;
}

希望有人能帮助/指导我。非常感谢。

共有2个答案

侯令雪
2023-03-14

Post上给出的代码不起作用。我稍微修改了一下以使其工作。在这里,

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();  
  // iterate s3 and check in s1 & s2 if duplicate values exist
  var nS1 = [];
  var nS2 = [];
  var s3Col1 = [];// data in column1 of sheet3
  for(var n=0; n<s3.length; ++n){ 
    s3Col1.push(s3[n][0]);
  }
  for(var n=0; n<s1.length; ++n){ // iterate sheet1 and test col 1 vs col 1 in sheet3
   var noDup1 = checkForDup(s1[n],s3Col1)
    if(noDup1){nS1.push(noDup1)};// if not present in sheet3 then keep
  } 
  for(var n=0; n<s2.length; ++n){  // iterate sheet2 and test col 1 vs col 1 in sheet3
    var noDup2 = checkForDup(s2[n],s3Col1)
    if(noDup2){nS2.push(noDup2)};// if not present in sheet3 then keep
  }
  Logger.log(nS1);// view result
  Logger.log(nS2);
  ss.getSheetByName("Sheet1").getDataRange().clear();// clear and update sheets
  ss.getSheetByName("Sheet2").getDataRange().clear();
  var nS1Length = nS1.length;
  var nS2Length = nS2.length;

 // This is the change needed in code you have copied from,
 **if(nS1 != undefined){
    data = []
    data[0] = nS1;
    var range = ss.getSheetByName("Sheet1").getRange(1,1);
    range.setValues(data);
 }
 if(nS2 != undefined){
    data = []
    data[0] = nS1;
    var range = ss.getSheetByName("Sheet2").getRange(1,1);
    range.setValues(data);
 }**
}

function checkForDup(item,s){
   Logger.log(s+' = '+item[0]+'  ?')
   if(s.indexOf(item[0])>-1){
     return null;
   }
   return item;
}
寇照
2023-03-14

试试这个:

function removeDuplicate(){

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var mainsheet = ss.getSheetByName("Sheet1");
      var sheet2 = ss.getSheetByName("Sheet2");
      var sheet3 = ss.getSheetByName("Sheet3");
      var masterData = mainsheet.getDataRange().getValues(); 

      var sheetsToCheck = [sheet2,sheet3];  

      for(var i in sheetsToCheck){
        var valuesToCheck = sheetsToCheck[i].getDataRange().getValues();
        for(var j=0;j<valuesToCheck.length;j++){
          for(var k in masterData){
            if(masterData[k][0] == valuesToCheck[j][0] && !(masterData[k][1] == valuesToCheck[j][1])){
              sheetsToCheck[i].deleteRow(j+1);
            }
          }
        }
      }

    }
 类似资料:
  • 下面的代码来自这篇文章中关于将行值复制到新工作表(如果它存在于另一个工作表中)的答案。 现在,如果不是将重复值复制到第3页,而是要将它们从第1页和第2页中删除(如果在第3页中存在)。使用相同的电子表格,我有3张表格。将在前两张图纸上进行比较的唯一值是第一列“ID编号”。 给定所有3张表中存在的值,即784 | John Stiple | I.T Department,应删除表1和表2中的相同行值,

  • 我正在寻找一种方法来迭代目录中的30个文件,并从他们删除基于其他文件中的id行。这些文件包含两列——ID和一个值,没有列名。另一个文件只包含一个应该删除的id(“id”)列(“ids_toberemoved”)。30个文件清理后,我想把它们导出到其他文件夹。 这是我目前掌握的情况: 我在迭代数据帧并用‘IDs _ tobe removed’连接它们的步骤中遗漏了一些东西,以便删除具有匹配id的行。

  • 我有两张桌子,一张是给员工的,另一张是给部门的。一个部门可以有多个/不同的员工,但一个员工只能在一个部门工作。他们的关系是一对多。 表创建: 表插入:

  • 问题内容: 内容: 我要从更改为。这是我的代码: 输出内容: 其他属性将被删除。我想更新一个特定的属性值,而不删除其他属性。 问题答案: 关闭输入流后,打开输出流并存储属性。

  • 本文向大家介绍根据MySQL中其他两个列的值来匹配列的值,包括了根据MySQL中其他两个列的值来匹配列的值的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是根据ID和MatchID显示FirstName的查询- 这将产生以下输出-

  • 问题内容: 有没有一种方法可以根据行中包含的值删除行?例如,我有一个表,其中的值在包含URL值的一列中,例如, /uk/quitclock/om2.asp /uk/quitclock/om666.wav 在这里,我需要删除后缀为WAV,GIF或JPEG的行。我怎么做?如果不可能,那么excel中是否有任何公式可以帮助我做到这一点? 问题答案: 在数据库上尝试