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

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

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

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

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

我希望在手动删除行并使其反射(reflect)工作表的更新性质后能够再次运行脚本。

最佳答案

试试这个:

抱歉,但有很多事情我无法理解您为什么要这样做,因此我发现向您展示我会如何做会更容易。

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++);
    }
  }
} 

关于javascript - 如何根据列值突出显示工作表中的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57187019/

相关文章:

javascript - 我的算法可以被认为是 O(n) 吗? "Finding the longest substring with unique characters"

jquery - 从 Google SpreadSheet 脚本调用 jQuery

google-apps-script - 使用 MailApp.sendEmail 发送电子邮件两次

google-apps-script - 如何使用 Google Apps 脚本从 Google 电子表格单元格获取 url?

javascript - AJAX 调用在 ASP.NET MV3 项目中返回内部服务器错误

javascript - 如何使用 jquery.css() 通过 hsla 设置背景颜色?

javascript - Sequelize 迁移失败(postgres)

javascript - 嵌套的 WHILE 循环未按预期运行 - Javascript/Google Apps 脚本

google-apps-script - 文档列表配额 : How do I avoid it on migration?

google-apps-script - 谷歌表格: How to import the following data?