为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2021-08-20 17:37:55
我试图通过检查在“电子邮件地址”列下输入的相同电子邮件地址来突出显示工作表中的重复行。我有一些代码(下面)可以做到这一点 - 它根据“电子邮件地址”下的重复值查找重复的行,并将它们突出显示为红色。但是,一旦我重新访问工作表,手动删除重复的行并重新运行脚本,同一行再次突出显示。为什么会发生这种情况,我该怎么做才能确保更新工作表时(现在)唯一的行不会再次突出显示?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.");  }};一旦我手动删除了行并让它反映工作表的更新性质,我希望能够再次运行脚本。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

试试这个:


抱歉,有太多事情我无法理解你为什么要这样做,所以我觉得向你展示我是如何做的更容易。


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

    }

  }


查看完整回答
反对 回复 2021-08-20
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

尝试在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");

      }


    }

  }

}


查看完整回答
反对 回复 2021-08-20
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信