我编写了函数markDupes1Col
,突出显示了列中的所有重复项。它的效果很好,但是当行数超过5万时,它变得非常慢。我可以做些什么来使其更快?
function removeEmptyCells(values) {
values = values.filter(function (el) {
return el != null && el[0] !== '' && el[0] != null;
});
return values;
}
function findDupes(arr) {
var sortedData = arr.slice().sort();
var duplicates = [];
for (var i = 0; i < sortedData.length; i++) {
if (sortedData[i] && sortedData[i] !== '' && sortedData[i + 1] == sortedData[i]) {
duplicates.push(sortedData[i]);
}
}
return duplicates;
}
function markDupes1Col() {
var ss = SpreadsheetApp.openById(appId);
var sheetName = arguments[0];
var sheet = ss.getSheetByName(sheetName);
for(var n = 1; n < arguments.length; n++) {
var lastRow = sheet.getLastRow();
if (lastRow == 0) lastRow = 1;
var rangeArray = sheet.getRange(1, arguments[n], lastRow);
var valuesArray = rangeArray.getValues();
valuesArray = removeEmptyCells(valuesArray);
// Convert to one dimensional array
valuesArray = [].concat.apply([], valuesArray);
var duplicates = findDupes(valuesArray);
rangeArray.setBackground(null);
if (duplicates.length > 0) {
for (var i = 0; i < valuesArray.length; i++) {
for (var j = 0; j < duplicates.length; j++) {
if (valuesArray[i] == duplicates[j]) {
sheet.getRange(i + 1, arguments[n]).setBackground("#b7e1cd");
break;
}
}
}
}
}
}
答案 0 :(得分:2)
setBackground
。 setBackgrounds()
。 {}
存储重复项function findDupes(arr){
var valObj = {};
var duplicates = {};
arr.forEach(function(row){
var el = row[0];
if(el in valObj){
duplicates[el] = 1
} else {
valObj[el] = 1;
}
})
return duplicates;
}
//....
valuesArray = removeEmptyCells(valuesArray);
//valuesArray = [].concat.apply([], valuesArray); Removed
var duplicates = findDupes(valuesArray);
//.....
rangeArray.setBackgrounds(
valuesArray.map(function(row){
return [(row[0] in duplicates) ? "#b7e1cd" : null]
})
)