如何在谷歌应用程序scipts中加速这个循环



Be我想说的是,我知道批处理函数在更新电子表格时更高效,但在这里,我试图列出一个充满交替颜色的列表,尽管我正在用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循环和元素分配操作,您将获得更好的性能,尤其是在输入矩阵很大的情况下。

最新更新