【问题标题】:Delete row in other sheets based on 2 values on main file根据主文件上的 2 个值删除其他工作表中的行
【发布时间】:2014-11-10 10:33:04
【问题描述】:

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

SAMPLE SPREADSHEET HERE.

示例数据:

表 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)相等,并且仅当经理不同/相等时。因此,在我上面给定的数据中,加利福尼亚分公司和经理 Tom Chang 存在于所有工作表中,因此不应触及。但是在剩下的 2 张纸上,加利福尼亚分公司与不同的经理重复了。因此,应删除表 2 和表 3 上的 California ---- Jane Cali 行。

遇到了从post 借来的脚本,但似乎无法正常工作。这里:

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;
}

希望有人可以帮助/指导我。谢谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    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);
                }
              }
            }
          }
    
        }
    

    【讨论】:

    • 嗨@kyuzo。我测试了你的脚本,如果要删除的数据仅在最上面一行,它似乎可以工作。说如果加利福尼亚 | Jane Cali 被放置在另一个数据下方的一行中,删除重复项将不起作用。使用示例电子表格查看我的问题。希望你能帮助我。
    • 嗨@Cookie。是的,sheetsToCheck[i].deleteRow(j+1) 中的添加在我发布的第一个脚本中不起作用。当在循环中使用for(var j in valuesToCheck) 分配j 变量时,它将产生一个字符串。我已经更改了 for 循环,所以 j 是一个数字,见上文。希望它现在可以工作。
    • 我不久前能够修改代码并且它也有效。但是您的解决方案也有效。我接受了。谢谢@kyuzo! ;-)
    【解决方案2】:

    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;
    }
    

    【讨论】:

    • 感谢@user1989 修改了我所基于的帖子的代码。希望我可以投票给你,但我刚刚在 SO 中注册。还是谢谢。
    • @user1989 :您能解释一下您添加的代码“这是您复制的代码所需的更改”吗?我不明白这段代码...在此先感谢。
    • @Sergeinsas 在previous code 中,用户试图连续添加数组,但这是不可能的。根据该代码,他必须使用数组数组才能使其工作。
    • 既然你写了var range = ss.getSheetByName("Sheet1").getRange(1,1);,然后将一个数组数组写入该范围,可能有很多单元格,恐怕它不会工作......很明显。你测试过你的脚本吗?
    • @Sergeinsas 是的,我已经测试了这个编辑过的脚本,它对我有用。
    猜你喜欢
    • 2023-03-20
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2021-08-09
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多