如果存在于另一个工作表中,则删除超过1个工作表中的行值

时间:2014-11-04 08:32:49

标签: google-apps-script google-sheets

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

现在,如果不是将重复值复制到第3页,我想将它们从第1页和第2页中删除(如果它存在于工作表3中)。使用相同的spreadsheet,我有3张。将在前两张纸上比较的唯一值是第一列“ID NUMBER”。

给定所有3张纸中都存在的值784 | John Steep | I.T Department,应在Sheet 1和2中删除相同的行值,并在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);
}

似乎找不到合适的解决方案。尝试了几个脚本,但未能使其正常工作。

感谢您提出任何意见/建议。

2 个答案:

答案 0 :(得分:2)

<强> Sheet 1中

ID NUMBER   NAME        DEPARTMENT
784         John Steep  I.T.
901         Liz Green   H.R.

<强> Sheet 2中

ID NUMBER   NAME        DEPARTMENT
784         John Steep  I.T.
653         Bo Gore     Marketing

<强>表Sheet 3

ID NUMBER   NAME        DEPARTMENT
784         John Steep  I.T.
999         Frank White Sales
121         Abid Jones  Engineering
901         Liz Green   H.R.

<强>脚本

function main() {
  var ss = SpreadsheetApp.openById("ID");

  var s1 = ss.getSheetByName("Sheet1");  
  var s2 = ss.getSheetByName("Sheet2");  
  var s3 = ss.getSheetByName("Sheet3");  

  var idCol = 1;  // Assuming location of ID column is same in all sheets.

  var s1RowCount = s1.getLastRow();  

  for (var i = 2; i <= s1RowCount; i++) {  // Start at var i = 2 to skip the 
                                           // first row containing the header.
    var id = s1.getRange(i, idCol, 1, 1).getValue();
    deleteDuplicates(s2, id);
    deleteDuplicates(s3, id);
  }
}

function deleteDuplicates(sheet, id) {
  var idCol = 1; // Assuming location of ID column is same in all sheets.
  var rowCount = sheet.getLastRow();
  for (var i = 2; i <= rowCount; i++) {
    var data = sheet.getRange(i, idCol, 1, 1).getValue();
    if (data === id) {
      // Use this to test out the function.
      Logger.log("Duplicate of ID " + id + " in sheet " + 
          sheet.getSheetName() + " at row " + i);
      // Uncomment the next line when ready.
      // sheet.deleteRow(i);
    }
  }
}

记录输出

[14-11-04 09:16:04:551 PST] Duplicate of ID 784 in sheet Sheet2 at row 2
[14-11-04 09:16:04:587 PST] Duplicate of ID 784 in sheet Sheet3 at row 2
[14-11-04 09:16:04:727 PST] Duplicate of ID 901 in sheet Sheet3 at row 5

答案 1 :(得分:2)

虽然另一个答案有效(我没有测试,但我猜它确实如此)它会使用大量的spreadsheetApp调用,如果你有大量的数据可能会很慢。

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

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

肯定有很多可能的解决方案,下面是我尝试过的解决方案:我创建了一个特殊的数组,其中只包含了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();  
  // 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;
}