繁体   English   中英

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

[英]How to highlight duplicates faster in google sheets script?

我编写了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;
          }
        } 
      }
    }
  }
}

问题(性能下降):

  • 在每个单元格的循环中使用setBackground
  • 使用数组存储重复项。

解:

  • 创建一个输出数组,并使用setBackgrounds()代替。
  • 使用对象{}存储重复项
  • 如果上述解决方案仍然很慢,请使用工作表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]
  })
)

参考文献:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM