javascript - 如何根据列值突出显示工作表中的重复行?
问题描述
我试图通过检查在“电子邮件地址”列下输入的相同电子邮件地址来突出显示工作表中的重复行。
我有一些代码(如下)可以做到这一点 - 它根据“电子邮件地址”下的重复值查找重复的行并将它们突出显示为红色。但是,一旦我重新访问工作表,手动删除重复的行并重新运行脚本,同一行就会再次突出显示。为什么会发生这种情况,我可以做些什么来确保当我更新工作表时,(现在)唯一的行不会再次突出显示?
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.");
}
};
一旦我手动删除了行并让它反映工作表的更新性质,我希望能够再次运行脚本。
解决方案
尝试这个:
抱歉,有很多事情我无法理解你为什么要这样做,所以我发现向你展示我会如何做会更容易。
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++);
}
}
}
推荐阅读
- python - 有没有办法阻止 input() 转义 \n?
- javascript - 单击弹性卡片时,打开一个新页面并在 javascript / jquery 中显示带有样式的解析数据
- arrays - 有一个工作依赖于 SLURM 中的一个数组工作
- r - 使用 tigris 从 Lat/Lon 获取 Census Tract
- java - java调用方法平均时间
- maven - spring-boot-maven-plugin 重新打包不包括依赖项
- python - 选择、打开和拆分文件
- android - Android服务在粘性模式下被破坏
- python - 调用 blit 方法和 pygame.display.update 函数时无法渲染 Surface 对象
- php - CentOS 7 Lampp 上 Magneto 2.4 的正确权限是什么