【问题标题】:Delete row values in more than 1 sheet if exists in another sheet如果存在于另一个工作表中,则删除多个工作表中的行值
【发布时间】:2014-11-04 08:32:48
【问题描述】:

下面的代码来自这个post 的答案,关于将行值复制到新工作表(如果它存在于另一个工作表中)。

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

鉴于所有 3 张工作表中存在的值 784 | John Steep | I.T Department,应删除工作表 1 和 2 中的相同行值,并在工作表 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);
}

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

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    虽然其他答案有效(我没有测试,但我猜它确实如此)它使用了大量的电子表格应用程序调用,并且如果您有大量数据可能会很慢。

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

    该方法略有不同,因为保留数据而不是删除数据更容易。

    肯定有很多可能的解决方案,下面是我尝试过的一个:我创建了一个仅包含 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;
    }
    

    【讨论】:

    • 在 OP 需要修改和扩展功能的情况下,我选择提供一些易于理解的东西(尽管不可否认,效率低下)。
    • 嗨@Serge Insas。我尝试了您提供的脚本,它运行良好。我只是修改了一些代码以满足我的其他规范。你真是个天才!非常感谢!
    【解决方案2】:

    Sheet1

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

    Sheet2

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

    Sheet3

    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
    

    【讨论】:

    • 感谢@Kayce Basques 的回答。修改一些代码后它也能正常工作。希望我能接受2个答案!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多