如果存在于另一个工作表中,则删除多个工作表中的行值 [英] Delete row values in more than 1 sheet if exists in another sheet

查看:85
本文介绍了如果存在于另一个工作表中,则删除多个工作表中的行值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码来自 post 将行值复制到新工作表(如果它存在于其他工作表中)。



现在,如果不是将重复值复制到图表3,我想从图表1和图表2中删除它们,如果它们存在于图表3中。使用相同的< a href =https://docs.google.com/spreadsheets/d/1RlQTLZyPLasoJGplKemKg9qgcLcvCZZ_tPn6lWXEePw/edit?pli=1#gid=0 =nofollow noreferrer>电子表格,我有3张。在前两张纸上比较的唯一值是第一列ID NUMBER。

给定值, 784 | John Steep | IT部门,它存在于所有3张工作表中,应在工作表1和工作表2中删除相同的行值,并在工作表3上保留相同的值。

 函数copyRowtoSheet3(){
var s1 = SpreadsheetApp.openById(ID)。getSheetByName('Sheet1');
var s2 = SpreadsheetApp.openById(ID)。getSheetByName('Sheet2');
var s3 = SpreadsheetApp.openById(ID)。getSheetByName('Sheet3');
var values1 = s1.getDataRange()。getValues();
var values2 = s2.getDataRange()。getValues();
var resultArray = [];
for(var n = 0; n var keep = false;
for(var p = 0; p Logger.log(values1 [n] [0] +'=''+ values2 [p] [0]) ;
if(values1 [n] [0] == values2 [p] [0]&& values1 [n] [3] == values2 [p] [4]){
resultArray。推(值1 [N]);
Logger.log('true');
break; //如果值不是唯一的,并且您想保留所有的事件...
}
}
}
s3.getRange(+1 ,1,resultArray.length,resultArray [0]。长度).setValues(resultArray);
}

似乎找不到合适的解决方案。尝试了几个脚本,但没有成功。



感谢您的任何建议/建议。

解决方案

尽管其他答案有效(我没有测试,但我猜测它会),但它会使用很多spreadsheetApp调用,如果您有大量数据,它可能会很慢。
$ b

可以仅使用数组获得此结果(如果您不需要保留图纸格式和/或公式)。

这种方法稍有不同,因为它更容易保留数据而不是删除它。



确实有很多可行的解决方案,下面是我尝试的解决方案:我创建了一个特殊的数组,其中只包含sheet3的第一列,以使重复搜索更简单。

  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();
//迭代s3并检入s1& s2如果有重复值
var nS1 = [];
var nS2 = [];
var s3Col1 = []; // sheet3的column1中的数据
(s3中的var n){
s3Col1.push(s3 [n] [0]);
}
for(var n in s1){//迭代sheet1并测试列1与列表3中的列1
var noDup1 = checkForDup(s1 [n],s3Col1)
如果(noDup1){nS1.push(noDup1)}; //如果不存在于sheet3中,则保留
}
for(var n in s2){//迭代sheet2并测试列1与列1 in sheet3
var noDup2 = checkForDup(s2 [n],s3Col1)
if(noDup2){nS2.push(noDup2)}; // if not present in sheet3 then keep
}
Logger.log(nS1); //查看结果
Logger.log(nS2);
ss.getSheetByName(Sheet1)。getDataRange()。clear(); //清除并更新工作表
ss.getSheetByName(Sheet2)。getDataRange()。clear();
ss.getSheetByName(Sheet1)。getRange(1,1,nS1.length,nS1 [0] .length).setValues(nS1);
ss.getSheetByName(Sheet2)。getRange(1,1,nS2.length,nS2 [0] .length).setValues(nS2);


函数checkForDup(item,s){
Logger.log(s +'='+ item [0] +'?')
if(s .indexOf(item [0])> -1){
return null;
}
退货项目;
}


The code below is from an answer from this post regarding copying row values to a new sheet if it exist in another sheets.

Now, what if instead of copying the duplicate values to sheet 3, I want to delete them from sheets 1 and 2 if it exists in Sheet 3. With the same spreadsheet, I have 3 sheets. The unique value that will be compared on the first 2 sheets is the first column, "ID NUMBER".

Given the values, 784 | John Steep | I.T Department, which exists in all 3 sheets, the same row value should be deleted in Sheet 1 and 2 and retain the same value on Sheet 3.

function copyRowtoSheet3() { 
  var s1 = SpreadsheetApp.openById("ID").getSheetByName('Sheet1');
  var s2 = SpreadsheetApp.openById("ID").getSheetByName('Sheet2'); 
  var s3 = SpreadsheetApp.openById("ID").getSheetByName('Sheet3'); 
  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getDataRange().getValues();
  var resultArray = [];
  for(var n=0; n < values1.length ; n++){
    var keep = false;
    for(var p=0; p < values2.length ; p++){
      Logger.log(values1[n][0]+' =? '+values2[p][0]);
      if( values1[n][0] == values2[p][0] && values1[n][3] == values2[p][4]){
        resultArray.push(values1[n]);
        Logger.log('true');
        break ;// remove this if values are not unique and you want to keep all occurrences...
      }
    }
  }  
  s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}

Can't seem to find the right solution. Tried several scripts but failed to make it work.

Thank you for any advice/suggestion.

解决方案

Although the other answer works (I didn't test but I guess it does) it uses a lot of spreadsheetApp calls and might be slow if you have a lot of data.

It is possible to get this result using only arrays (if you don't need to keep sheet formatting and/or formulas).

The approach is slightly different as it is easier to keep data instead of removing it.

There are for sure many possible solutions, below is the one I tried : I created a special array that contains only the first column of sheet3 to make the duplicate search simpler.

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 in s3){
    s3Col1.push(s3[n][0]);
  }
  for(var n in s1){ // 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 in s2){  // 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();
  ss.getSheetByName("Sheet1").getRange(1,1,nS1.length,nS1[0].length).setValues(nS1);
  ss.getSheetByName("Sheet2").getRange(1,1,nS2.length,nS2[0].length).setValues(nS2);
}

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

这篇关于如果存在于另一个工作表中,则删除多个工作表中的行值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆