我正在处理一些电子表格(其中25个),每个电子表格都供一名员工使用,共有12张纸,一个月。有时候,所有电子表格都需要进行一些更改。现在,他们需要对格式进行一些更改。并且以下脚本有效。但这很慢。 您能帮助我进行优化吗?我认为优化的主要领域应该是跳到特定的单元格来做边界。我不知道该怎么做才能使其更快。
关于优化的第二件事是,该脚本适用于4个电子表格-如果我一次提供全部25个电子表格,则该脚本将在5日中旬完成。
function format() {
//list of spreadsheetIDs, I have 25 of them, each one is a summary for one employee
var summary = [
'example1_asdfghjklqwertyuiop',
'example2_asdfghjklqwertyuiop’,
……
……
……
'example24_asdfghjklqwertyuiop’,
'example25_asdfghjklqwertyuiop’
];
//list of sheets in every spreadsheet, they are the same in everyone spreadsheet, month names are here in Polish
var month= ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'];
for each (ss in summary){
var s = SpreadsheetApp.openById(ss);
for each (m in month){
var sheet = s.getSheetByName(m);
if (m == 'Styczeń'||m == 'Marzec'||m == 'Maj'||m == 'Lipiec'||m == 'Sierpień'||m == 'Październik'||m == 'Grudzień'){
var days = 31;
} else if (m == 'Kwiecień'||m == 'Czerwiec'||m == 'Wrzesień'||m == 'Listopad'){
days = 30;
} else {
days = 28;
};
sheet.getRangeList(['F11:F43', 'K11:K43', 'M11:M43', 'U11:U43', 'AA11:AA43']).setFontColor('#999999');
for (var i = 1 ; i<=days ; i++){
//13 row is the first row for 1st January, February…
var cell = sheet.getRange(12 + i, 7);
//checking if background color of a cell is white (holidays, saturdays and sundays have different backgroung)
var bg_color = sheet.getRange(12 + i, 7).getBackground();
if (bg_color == "#ffffff") {
//if a day is weekday then its row needs to have some cells with border
sheet.getRange(12 + i, 7).setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
sheet.getRange(12 + i, 12).setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
sheet.getRange(12 + i, 14).setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
sheet.getRange(12 + i, 21).setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
sheet.getRange(12 + i, 27).setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
//sheet.getRange('A1:AE50').setBorder(false, false, false, false, false, false);
}
}
}
}
}
答案 0 :(得分:0)
您可以在不明显改变工作流程的情况下进行两种优化。第一个非常小,删除了一个if-else
链:
if (m == 'Styczeń'||m == 'Marzec'||m == 'Maj'||m == 'Lipiec'||m == 'Sierpień'||m == 'Październik'||m == 'Grudzień'){
var days = 31;
} else if (m == 'Kwiecień'||m == 'Czerwiec'||m == 'Wrzesień'||m == 'Listopad'){
days = 30;
} else {
days = 28;
};
成为
var daysFromMonth = {
'Styczen': 31,
'Marzec': 31,
'Maj': 31,
...
'Kwiecien': 30,
...
};
,并移至电子表格ID的循环之外。然后,在循环中,将其用作:
var days = daysFromMonth[m] || 28;
|| 28
将处理所有以下情况:访问通过访问m
中包含名称的属性返回的值是“ falsy”(0,false,null,undefined,”),对应于您的else
条件。
要进行的主要改进是按照Apps脚本最佳做法使用批处理方法。您已经使用一种批处理方法(RangeList#setFontColor
),仅需要执行批读取(将Range#getBackground
转换为Range#getBackgrounds
)和更多批写入(使用RangeList#setBorder
而不是{ {1}}):
获得电子表格的天数并设置字体颜色后,在电子表格的循环中
Range#setBorder
现在,您可以查看所有背景颜色并确定要使用纯JS格式化的地址,而不必在JS之间(非常快)重复调用电子表格服务(非常慢)。
...
sheet.getRangeList(['F11:.......]).setFontColor('#999999');
var start = { row: 13, col: 7 };
var backgrounds = sheet.getRange(start.row, start.col, days, 1).getBackgrounds(); // read all backgrounds at once
一些参考文献: