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

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

          }

        } 

      }

    }

  }

}


犯罪嫌疑人X
浏览 267回答 1
1回答

当年话下

问题(性能缓慢):setBackground在每个单元格的循环中使用。使用数组来存储重复项。解决方法:创建一个输出数组并setBackgrounds()改为使用。使用对象{}存储重复项如果以上解决方案还是很慢,可以使用sheets api批量设置背景片段:function findDupes(arr){&nbsp; var valObj = {};&nbsp; var duplicates = {};&nbsp; arr.forEach(function(row){&nbsp; &nbsp; var el = row[0];&nbsp; &nbsp; if(el in valObj){&nbsp;&nbsp; &nbsp; &nbsp; duplicates[el] = 1&nbsp;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; valObj[el] = 1;&nbsp; &nbsp; }&nbsp; })&nbsp; return duplicates;}//....valuesArray = removeEmptyCells(valuesArray);//valuesArray = [].concat.apply([], valuesArray); Removedvar duplicates = findDupes(valuesArray);//.....rangeArray.setBackgrounds(&nbsp; valuesArray.map(function(row){&nbsp; &nbsp; return [(row[0] in duplicates) ? "#b7e1cd" : null]&nbsp; }))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript