优化Google脚本-访问25个电子表格

时间:2019-06-27 13:39:00

标签: optimization google-apps-script google-sheets

我正在处理一些电子表格(其中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);
             }
          }
       }
     }
}

1 个答案:

答案 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

一些参考文献: