【问题标题】:How can I highlight duplicate rows in my sheet based on column value?如何根据列值突出显示工作表中的重复行?
【发布时间】:2019-12-02 20:23:25
【问题描述】:

我试图通过检查在“电子邮件地址”列下输入的相同电子邮件地址来突出显示工作表中的重复行。

我有一些代码(如下)可以执行此操作 - 它根据“电子邮件地址”下的重复值查找重复行并将它们突出显示为红色。但是,一旦我重新访问工作表,手动删除重复的行并重新运行脚本,同一行将再次突出显示。为什么会发生这种情况,我可以做些什么来确保当我更新工作表时,(现在)唯一的行不会再次突出显示?

function findDupes() {
  var CHECK_COLUMNS = [3];

  var sourceSheet = SpreadsheetApp.getActiveSheet();
  var numRows = sourceSheet.getLastRow();
  var numCols = sourceSheet.getLastColumn();

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = ss.insertSheet("FindDupes");


  for (var i = 0; i < CHECK_COLUMNS.length; i++) {
    var sourceRange = sourceSheet.getRange(1,CHECK_COLUMNS[i],numRows);
    var nextCol = newSheet.getLastColumn() + 1;
    sourceRange.copyTo(newSheet.getRange(1,nextCol,numRows));
  }


  var dupes = false;
  var data = newSheet.getDataRange().getValues();
  for (i = 1; i < data.length - 1; i++) {
    for (j = i+1; j < data.length; j++) {
      if  (data[i].join() == data[j].join()) {
        dupes = true;
        sourceSheet.getRange(i+1,1,1,numCols).setBackground("crimson");
        sourceSheet.getRange(j+1,1,1,numCols).setBackground("crimson");
      }
    }
  }

  ss.deleteSheet(newSheet);

  if (dupes) {
    Browser.msgBox("Possible duplicate(s) found. Please check for repeat attendees.");
  } else {
    Browser.msgBox("No duplicates found.");
  }
};

我希望能够在手动删除行并让它反映工作表的更新性质后再次运行脚本。

【问题讨论】:

    标签: javascript google-apps-script google-sheets duplicates rows


    【解决方案1】:

    试试这个:

    抱歉,有很多事情我不明白你为什么要这样做,所以我觉得向你展示我会怎么做会更容易。

    function findAndHighlightDupesInColumn(col) {
      var col=col||3;//I think you wanted to check column 3
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var rg=sh.getDataRange();
      var vA=rg.getValues();//gets all data
      var uA=[];//this is the array that hold all unique values
      for(var i=1;i<vA.length;i++) {//assumes one header row
        if(uA.indexOf(vA[i][col-1])==-1) {//if it's unique then put it in uA
          uA.push(vA[i][col-1]);
        }else{//if it's not unique then set background color
          sh.getRange(i+1,1,1,sh.getLastColumn()).setBackground('crimson');
        }
      }
    }
    

    以下代码将删除第 3 列中的重复项:

    此方法假定任何行的第一次出现是您希望保留的行。删除所有其他重复行。

    function removeColumnDupes(col) {
      var col=col||3
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var rg=sh.getDataRange();
      var vA=rg.getValues();
      var uA=[];
      var d=0;
      for(var i=1;i<vA.length;i++) {
        if(uA.indexOf(vA[i][col-1])==-1) {
          uA.push(vA[i][col-1]);
        }else{
          sh.deleteRow(i+1-d++);
        }
      }
    } 
    

    【讨论】:

    • 感谢分享!但是,我之前尝试做的是在有重复项时突出显示两行,手动检查并删除一个,然后再次检查以查看其唯一条目。但是,对于您共享的内容,只有一个说,两个重复的行被突出显示,我只能搜索另一行在哪里。有什么指点吗?
    【解决方案2】:

    尝试在 for 循环之前添加它。它会将所有行变为白色,然后您的其余代码会将重复项变为红色:

     sourceSheet.getRange(2,1,numRows,numCols).setBackground("white");
    

    此外,当您添加或编辑电子邮件地址时,您可以添加 onEdit() 函数来实时检查重复项:

    function onEdit(e){
    
      if (e.range.getColumn() == 3){
        var sourceSheet = SpreadsheetApp.getActiveSheet(); 
        var numRows = sourceSheet.getLastRow();
        var numCols = sourceSheet.getLastColumn();
    
        var data = sourceSheet.getRange("C2:C"+numRows).getValues();
        var editedCell = e.value;
    
        for (var i = 0; i < data.length;i++){ 
          if (editedCell == data[i] && (i + 2) != e.range.getRow()){
            sourceSheet.getRange(e.range.getRow(),1,1,numCols).setBackground("crimson");
            sourceSheet.getRange(i+2,1,1,numCols).setBackground("crimson");
          }
    
        }
      }
    }
    

    【讨论】:

    • 抱歉,此代码的问题在于它仅适用于第一次编辑。不会捕获任何后续编辑。
    • 我刚刚再次测试了代码,它运行良好。 onEdit() 函数应该适用于您每次编辑工作表时。你能一步一步写出你写值的过程吗?
    猜你喜欢
    • 2021-07-31
    • 2018-08-23
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多