如何在 google 应用程序脚本中加速此循环?

How to speed up this loop in google app scipts?

在我想说的之前,我知道批处理函数在更新 spreadsheets 时更有效,但是在这里我试图制作一个充满交替颜色的列表,虽然我正在更新 sheet 和 range.setBackgrounds() 它仍然花费了太长时间,有什么方法可以优化它吗?

  var range = SpreadsheetApp.getActiveSheet().getRange("B11:G30");
  var background = [];
  var startRow = range.getRow();
  var maxRows = range.getRow() + range.getNumRows()
  
  for (row = startRow; row < maxRows ; row++) {
    if (row % 2 == 1) {
      var colour = ["#D9D9D9", "#D9D9D9", "#D9D9D9", "#D9D9D9", "#D9D9D9", "#D9D9D9"];
    }
    else {
      var colour = ["#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF"];
    }
    background.push(colour);
  }
  range.setBackgrounds(background);
function alternateColors() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const sr=2;
  const rg=sh.getRange(sr,1,sh.getLastRow()-sr+1,sh.getLastColumn());
  let cA=rg.getBackgrounds();
  cA.forEach(function(r,i){
    r.forEach(function(c,j){
      if(i%2==1) {
        cA[i][j]='#d9d9d9';
      }else{
        cA[i][j]='#ffffff';
      }
    });
  });
  rg.setBackgrounds(cA); 
}

这是的替代版本,所以请不要拒绝他的回答。

但这肯定会给您带来额外的性能提升:

function alternateColors() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const sr=2;
  const rg=sh.getRange(sr,1,sh.getLastRow()-sr+1,sh.getLastColumn());
  let cA=rg.getBackgrounds();
  cA=cA.map((r,i)=>Array(r.length).fill([i%2==1?'#d9d9d9':'#ffffff']).flat());
  rg.setBackgrounds(cA); 
}

想法是,通过使用 map 而不是两个 forEach 循环和元素智能赋值操作,您将获得更好的性能,尤其是在输入矩阵很大的情况下。