Javascript 如何根据列值高亮显示工作表中的重复行?

Javascript 如何根据列值高亮显示工作表中的重复行?,javascript,google-apps-script,google-sheets,duplicates,rows,Javascript,Google Apps Script,Google Sheets,Duplicates,Rows,我试图通过检查“电子邮件地址”列下输入的相同电子邮件地址来突出显示工作表中的重复行 我有一些代码(如下)可以做到这一点——它根据“Email Address”下的重复值查找重复的行,并将其高亮显示为红色。但是,一旦我重新访问工作表,手动删除重复的行并重新运行脚本,同一行将再次高亮显示。为什么会发生这种情况?我可以做些什么来确保在更新工作表时,(现在)唯一行不会再次高亮显示 function findDupes() { var CHECK_COLUMNS = [3]; var sourc

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

我有一些代码(如下)可以做到这一点——它根据“Email Address”下的重复值查找重复的行,并将其高亮显示为红色。但是,一旦我重新访问工作表,手动删除重复的行并重新运行脚本,同一行将再次高亮显示。为什么会发生这种情况?我可以做些什么来确保在更新工作表时,(现在)唯一行不会再次高亮显示

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.");
  }
};
函数findDupes(){
var CHECK_列=[3];
var sourceSheet=SpreadsheetApp.getActiveSheet();
var numRows=sourceSheet.getLastRow();
var numCols=sourceSheet.getLastColumn();
var ss=SpreadsheetApp.getActiveSpreadsheet();
var newSheet=ss.insertSheet(“FindDupes”);
对于(var i=0;i
手动删除行并使其反映工作表的更新性质后,我希望能够再次运行脚本。

尝试以下操作:

对不起,有很多事情我都不明白你为什么要做,所以我觉得让你看看我是怎么做的比较容易

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');
    }
  }
}
函数find和highlightdupesincolumn(col){
var col=col | | 3;//我想您想检查第3列
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getDataRange();
var vA=rg.getValues();//获取所有数据
var uA=[];//这是保存所有唯一值的数组

对于(var i=1;i请尝试在
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(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;
对于(var i=0;i
谢谢分享!不过,我之前想做的是高亮显示两行(如果有重复的行),手动检查并删除其中一行,然后再次检查以查看其唯一条目。但是,通过您分享的内容,只有一行高亮显示了两行重复的行,剩下我来搜索另一行的位置。有什么指针吗?很抱歉,此代码的问题是,它仅在第一次编辑时有效。未捕获任何后续编辑。我刚刚再次测试了代码,它工作正常。每次编辑工作表时,该函数都应有效。您是否可以逐步编写编写值的过程?
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");
      }

    }
  }
}