我编写了markDupes1Col突出显示列中所有重复项的函数。它工作得很好,但是当行数超过 50k 时,它变得非常慢。有什么我可以做的让它更快吗?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; } } } } }}
1 回答
当年话下
TA贡献1890条经验 获得超9个赞
问题(性能缓慢):
setBackground
在每个单元格的循环中使用。使用数组来存储重复项。
解决方法:
创建一个输出数组并
setBackgrounds()
改为使用。使用对象
{}
存储重复项如果以上解决方案还是很慢,可以使用sheets api批量设置背景
片段:
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]
})
)
添加回答
举报
0/150
提交
取消