基于给定引用格式化单元格的更有效方法



我正在创建一个包含固定装置的谷歌表,我想为所有具有固定装置的单元格上色,这些装置显示了比赛对给定团队的相对容易/困难程度。这是我的电子表格。以下是我目前使用的代码-

// Function to find the row number of a given fixture 
function findRow(empName){
var ss=SpreadsheetApp.getActive();
//var fix = ss.getSheetByName('Fixtures');
var fdr = ss.getSheetByName('FDR');
var data = fdr.getDataRange().getValues();
for(var i = 0; i<data.length;i++){
if(data[i][1] == empName){ //[1] because column E
Logger.log((i+1))
return i+1;
}
}
}
// Function to color the given cell based on its fixture difficulty
function colorMeUp() {
var ss = SpreadsheetApp.getActive();
var fix = ss.getSheetByName('Fixtures');
var fdr = ss.getSheetByName('FDR');

for(var i = 4; i <= 23; i = i + 1){
for(var j = 3; j <= 40; j = j + 1){
var temp = fix.getRange(i,j).getValue(); // Find the fixture to color
var master = fix.getRange(i,2).getValue(); // Find the reference team
var rowNumMaster = findRow(master);
var rowNumTemp = findRow(temp);
if(rowNumTemp < 23){
rowNumMaster = rowNumMaster + 20;
}
var tempRating = fdr.getRange(rowNumTemp,4).getValue();
var masterRating = fdr.getRange(rowNumMaster,4).getValue();
var fixDiff = masterRating + (6-tempRating); // Calculate relative fixture difficulty
var rang = fdr.getRange(1+fixDiff,8).getBackground();
fix.getRange(i,j).setBackground(rang); 
}
}
}

可以看到,这段代码使用了"FDR"中给出的表。为"夹具"中给出的每个夹具指定颜色。床单然而,当我按下左侧丑陋的蓝色按钮时,它发生的过程非常缓慢,超过了最大时间。是否有办法通过调整这段代码/使用不同的方法使这个过程更快?我对这一切都很陌生,所以我真的不知道我能做些什么来让它更好/更快。

尝试将if(data[i][1] == empName){列的数据集成到一个扁平数组中,然后您可以使用indexOf而不是在循环中心调用函数两次。因此,inotherword,找到drow并将其构建在colorMeUp

中所以像这样:

function colorMeUp() {
var ss = SpreadsheetApp.getActive();
var fix = ss.getSheetByName('Fixtures');
var fdr = ss.getSheetByName('FDR');
const sA = fdr.getRange(1,2,fdr.getLastRow()).getDisplayValues().flat();

for(var i = 4; i <= 23; i = i + 1){
for(var j = 3; j <= 40; j = j + 1){
var temp = fix.getRange(i,j).getValue(); // Find the fixture to color
var master = fix.getRange(i,2).getValue(); // Find the reference team
var rowNumMaster = sA.indexOf(master) + 1
var rowNumTemp = sA.indexOf(temp) + 1
if(rowNumTemp < 23){
rowNumMaster = rowNumMaster + 20;
}
var tempRating = fdr.getRange(rowNumTemp,4).getValue();
var masterRating = fdr.getRange(rowNumMaster,4).getValue();
var fixDiff = masterRating + (6-tempRating); // Calculate relative fixture difficulty
var rang = fdr.getRange(1+fixDiff,8).getBackground();
fix.getRange(i,j).setBackground(rang); 
}
}
}

我很快地把它放在一起,所以它可能实际上不能工作,但使用这种方法应该会大大加快速度。如果你做过一些web应用,那么我猜你是一个合理的编码人员,应该能够将其集成到你的代码中。也有可能我完全是FOS。

去掉循环中的getValue()代替循环外的getValues()并使用数组索引访问相同的数据将是非常好的。getbackground也是一样。我需要看一下你的数据才能弄清楚。

顺便说一句,我不遵循电子表格的链接,所以让我访问数据涉及post表。

最新更新