javascript - 如何在谷歌表格脚本中更快地突出显示重复项?
问题描述
我编写了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;
}
}
}
}
}
}
解决方案
问题(性能缓慢):
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]
})
)
参考:
推荐阅读
- laravel - 来自api的vue apexchart动态数据集面临问题
- django - 带有 Axios 的 Django CSRF 令牌
- weblogic - Weblogic:集群中的节点关闭,没有发送 JMS 消息
- github - github:“下载或克隆”按钮在哪里?
- python - 函数中未检测到 Python 全局变量
- javascript - 通过 Python Selenium WebDriver 使用 javascript 语句查找 Web 元素
- react-native - 初始化 Drawer.Navigator 时,抽屉正在闪烁,尽管在参数中我通过 openByDefault={ false }
- php - 在 htaccess Codeigniter 中重定向 301
- python - 无法连接到redis容器
- ruby - 在使用 #group_by 和 each_with_object 时优化大型 CSV