猿问

如何根据列值突出显示工作表中的重复行?

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


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


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.");

  }

};

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


森栏
浏览 157回答 2
2回答

叮当猫咪

试试这个:抱歉,有太多事情我无法理解你为什么要这样做,所以我觉得向你展示我是如何做的更容易。function findAndHighlightDupesInColumn(col) {&nbsp; var col=col||3;//I think you wanted to check column 3&nbsp; var ss=SpreadsheetApp.getActive();&nbsp; var sh=ss.getActiveSheet();&nbsp; var rg=sh.getDataRange();&nbsp; var vA=rg.getValues();//gets all data&nbsp; var uA=[];//this is the array that hold all unique values&nbsp; for(var i=1;i<vA.length;i++) {//assumes one header row&nbsp; &nbsp; if(uA.indexOf(vA[i][col-1])==-1) {//if it's unique then put it in uA&nbsp; &nbsp; &nbsp; uA.push(vA[i][col-1]);&nbsp; &nbsp; }else{//if it's not unique then set background color&nbsp; &nbsp; &nbsp; sh.getRange(i+1,1,1,sh.getLastColumn()).setBackground('crimson');&nbsp; &nbsp; }&nbsp; }}以下代码将删除第 3 列中的重复项:此方法假定第一次出现的任何行是您希望保留的行。删除所有其他重复行。function removeColumnDupes(col) {&nbsp; var col=col||3&nbsp; var ss=SpreadsheetApp.getActive();&nbsp; var sh=ss.getActiveSheet();&nbsp; var rg=sh.getDataRange();&nbsp; var vA=rg.getValues();&nbsp; var uA=[];&nbsp; var d=0;&nbsp; for(var i=1;i<vA.length;i++) {&nbsp; &nbsp; if(uA.indexOf(vA[i][col-1])==-1) {&nbsp; &nbsp; &nbsp; uA.push(vA[i][col-1]);&nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; sh.deleteRow(i+1-d++);&nbsp; &nbsp; }&nbsp; }}&nbsp;

慕哥9229398

尝试在for循环之前添加它。它会将所有行变为白色,然后其余代码会将重复项变为红色:&nbsp;sourceSheet.getRange(2,1,numRows,numCols).setBackground("white");此外,当您添加或编辑电子邮件地址时,您可以添加一个 onEdit() 函数来实时检查重复项:function onEdit(e){&nbsp; if (e.range.getColumn() == 3){&nbsp; &nbsp; var sourceSheet = SpreadsheetApp.getActiveSheet();&nbsp;&nbsp; &nbsp; var numRows = sourceSheet.getLastRow();&nbsp; &nbsp; var numCols = sourceSheet.getLastColumn();&nbsp; &nbsp; var data = sourceSheet.getRange("C2:C"+numRows).getValues();&nbsp; &nbsp; var editedCell = e.value;&nbsp; &nbsp; for (var i = 0; i < data.length;i++){&nbsp;&nbsp; &nbsp; &nbsp; if (editedCell == data[i] && (i + 2) != e.range.getRow()){&nbsp; &nbsp; &nbsp; &nbsp; sourceSheet.getRange(e.range.getRow(),1,1,numCols).setBackground("crimson");&nbsp; &nbsp; &nbsp; &nbsp; sourceSheet.getRange(i+2,1,1,numCols).setBackground("crimson");&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答