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

如何在谷歌表格脚本中更快地突出显示重复项?

如何在谷歌表格脚本中更快地突出显示重复项?

犯罪嫌疑人X 2021-08-20 15:02:11
我编写了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]

  })

)


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

添加回答

举报

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