繁体   English   中英

如何使我的 Google Apps 脚本在电子表格多色甘特图上运行得更快?

[英]How to make my Google Apps script run faster for spreadsheet multi-color gantt-chart?

我正在将谷歌工作表的列和行格式化成一个大甘特图。这个图表是为了显示每个工作人员为每个项目占用了多少周。 每个人都有一个独特的彩条。 position 和彩条的长度基于项目的开始周和持续时间。 我创建了一个“全部更新”按钮并将 function update_all() 分配给该按钮。 运行此 function 后,我希望更新所有彩条。

我的脚本工作正常。 但是,更新 70 行需要 40 秒,因此很难将其扩展到更大的人员组。 耗时最长的动作是将单元格的背景颜色设置为工作人员的指定颜色。 任何建议如何改进脚本以使其更快?

这是甘特图的样子——goole 工作表文件https://docs.google.com/spreadsheets/d/1nvnZB62CYUeUUZSkAuHsxMJF5MBr7D1rNG3ffU8jKdI/edit?usp=sharing

这是我的代码

function updateall(){

     var sss = SpreadsheetApp.openById("1nvnZB62CYUeUUZSkAuHsxMJF5MBr7D1rNG3ffU8jKdI");
  var ssColor = sss.getSheetByName("2. Color Legend");
  var ssPlanner = sss.getSheetByName("Project Planner");

  // Step 1: clear all the orginal color 
  ssPlanner.getRange("I4:BU120").setBackground('#ffffff');

  // Step 2: create a dictionay {staff name : coloe code}
   var keycolumns = ssColor.getRange(3,2,16,1).getValues();
  var data = ssColor.getRange(3,3,16,1).getValues();
  var dict_data = {};
  for (var keys in keycolumns) {
    var key = keycolumns[keys];
    dict_data[key] = data[keys];
  }

  Logger.log(dict_data["BBB"]);

  //Step3:set background color for each row
    for (var bRow=4; bRow<121; bRow++){
    if (ssPlanner.getRange("E"+bRow).getValue()!=""){

    var start = ssPlanner.getRange(bRow,7).getValue()-ssPlanner.getRange(3,9).getValue()+9;
    var duration = ssPlanner.getRange(bRow,8).getValue();

  ssPlanner.getRange(bRow,start,1,duration).setBackground(dict_data[ssPlanner.getRange(bRow,5).getValue()]);

  }
  }
 }

我相信你的目标如下。

  • 您想降低脚本的处理成本。

为此,这个答案怎么样?

修改点:

  • 在您的脚本中,循环中使用了getRangegetValuesetBackground 我认为在这种情况下,脚本的处理成本会很高。 为了降低您的脚本成本,我想提出以下流程。 在此修改中,我在您的脚本中修改了Step3

    1. 检索E3:I121范围内的所有值。
      • 使用getValues()
    2. 使用检索到的值创建一个用于放置 colors 的数组。
      • 在这种情况下,您要设置的颜色是从您创建的dict_data中使用的。 并且,没有 colors 的单元格被设置为null 因此,在您的情况下, ssPlanner.getRange("I4:BU120").setBackground('#ffffff')可能可以修改为ssPlanner.getRange("I4:BU120").setBackground(null)
      • 不使用getRangegetValuesetBackground
    3. 使用创建的包含颜色代码的数组设置 colors。
      • 使用setBackgrounds

当上述流程反映到您的脚本时,它变成如下。

修改后的脚本:

当您的脚本被修改时,请进行如下修改。

从:
 //Step3:set background color for each row for (var bRow=4; bRow<121; bRow++){ if (ssPlanner.getRange("E"+bRow).getValue().=""){ var start = ssPlanner,getRange(bRow.7).getValue()-ssPlanner,getRange(3.9);getValue()+9. var duration = ssPlanner,getRange(bRow.8);getValue(). ssPlanner,getRange(bRow,start,1.duration).setBackground(dict_data[ssPlanner,getRange(bRow.5);getValue()]); } }
至:
 // Step3:set background color for each row // 1. Retrieve all values from the range of `E3:I121`. const values = ssPlanner.getRange("E3:I121").getValues(); const offset = values.shift()[4]; // 2. Create an array for putting the colors using the retrieved values. const colors = values.reduce((ar, [e,f,g,h]) => { let base = Array(65).fill(null); if (e.= "") Array.prototype.splice,apply(base, [g - offset. h].concat(Array(h);fill(dict_data[e][0]))). ar;push(base); return ar, }; []). // 3. Set the colors using the created array including the color codes. ssPlanner,getRange(4, 9. colors,length. colors[0].length);setBackgrounds(colors);

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM