Google脚本/表格-如何使用... new Set()使脚本在循环中更快地运行

时间:2020-06-26 12:26:04

标签: google-apps-script google-sheets

基于@ziganotschka对this question的大力支持,我们有以下代码。对于每个参考,这里是一个在原始问题上发布的link to the demo sheet

function change_row_color() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var range = spreadsheet.getDataRange();
  var rangeData = range.getValues();
  var lastRow = spreadsheet.getLastRow();
  var previousclient = rangeData[0][4];
  console.log(previousclient);
  var colors = [[0,0,0,0,0]];
  for ( j = 1 ; j < lastRow; j++){
    var currentclient = rangeData[j][4];
    console.log(previousclient," ",currentclient);
    if (previousclient != currentclient) {
      colors.push(["#cc4125","#cc4125","#cc4125","#cc4125","#cc4125"]);
      previousclient = currentclient;  
    } else{
      colors.push([0,0,0,0,0]);
    }
  }
range.setBackgrounds(colors);
}

脚本运行良好,但运行速度很慢。我的测试阵列有350行,大约需要20秒钟才能运行。我的实际数组有1万多行,并且还在增长。在真实数组上运行此代码后,我希望将其降至5s以下。 ziganotschka建议使用... new Set()。我希望您对此有所投入。

2 个答案:

答案 0 :(得分:1)

使用条件格式

在E列中的值与上一行相同的所有行中应用给定样式。

在工作表中:

  • 格式>条件格式
  • 适用于范围A2:Z
  • 格式化规则Custom formula is
  • 公式=$E2=$E1的值//如果需要在另一行进行测试,则更改E的值。

选择所需的格式样式。

答案 1 :(得分:0)

可能没有更快的速度,但是您可以尝试一下。

function change_row_color() {
  var ss=SpreadsheetApp.getActive()
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getDataRange();
  var vs=rg.getValues();
  var colors=rg.getBackgrounds();
  colors.map(function(r){return r.fill('#000000')});//this is not necessary if the backgrounds always start as black.
  var pc=vs[0][4];
  vs.forEach(function(r,i){
    if(i>0 && r[4]!=pc) {
        colors[i].fill("#cc4125");
        pc=r[4];
    }
  });
rg.setBackgrounds(colors);
}