基于@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()。我希望您对此有所投入。
答案 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);
}