缓慢的Google脚本 - 难以将信息批量处理到数组中

时间:2017-05-17 00:00:37

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

我一直在为我的一个小项目挣扎一段时间,并且正在寻找一些帮助。我认为关键问题是我不熟悉数组脚本语言以及如何处理这个问题。在对此进行了一些研究并阅读了最佳实践部分后,我尝试了一些方法,但未能使其充分发挥作用。

我的脚本需要能够从电子表格中收集200行x 200列数据,并且根据每个单元格中的数字,它需要选择该数字旁边的相应列数并为其着色。< / p>

这对我的基本编程知识非常简单,只需要选择每个单元格,检查数字,选择带偏移的范围,然后更改颜色并移动到下一个单元格,但是我的代码是非常慢,因为它在没有批量处理数据的情况下完成工作表中的所有内容,并且无法在Google Script的时间限额内完成全部范围。任何加速它的帮助都将非常感激,因为我无法使用数组工作。

这是我目前正在使用的代码:

function CreateCalendar() {

  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName('Sheet2');
  var selection=ss.getRange("Sheet2!H2:FC140");
  var columns=selection.getNumColumns();
  var rows=selection.getNumRows();

  for (var column=1; column < columns; column++) {

    for (var row=1; row < rows; row++) { 
      var cell=selection.getCell(row,column);
      var cellvalue=cell.getValue();
        if (cellvalue >= 1) {
        var range=cell.offset(0,0,1,cellvalue);
        range.setBackground("blue");
      }
        else {;}  
    }
  }
}

这是一个删除了机密信息的公开电子表格,我要定位的工作表是Sheet2。我能得到的任何帮助将不胜感激!感谢

https://docs.google.com/spreadsheets/d/1Oe0aacfSBMmHpZvGPmjay5Q1bqBebnGQV4xlsK8juxk/edit#gid=0

2 个答案:

答案 0 :(得分:1)

你需要摆脱对range.getValue()的重复调用。您可以在一个电话和一个电话中获得该范围的所有值。然后在脚本中迭代该数组。

对于你的脚本,它看起来像这样:

function CreateCalendar() {

  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName('Sheet2');
  var selection=ss.getRange("Sheet2!H1:FC140"); // <= include header, but we'll skip it when we get to stepping over the array
  var values = selection.getValues(); // <= get all of the values now in one call
  for (var r=1; r < values.length; r++) {
    for (var c=0; c < values[r].length; c++) { 
      if (values[r][c] >= 1) {
        var range=sheet.getRange(r+1, c+8, 1, values[r][c]); // r+1 & c+8 because of array offsets
        range.setBackground("blue");
      }
        else {;}  
    }
  }
}

查看Google的文档:range.GetValues()https://developers.google.com/apps-script/reference/spreadsheet/range#getValues()

答案 1 :(得分:0)

以下示例脚本怎么样?如果这不是您的期望,我想修改此脚本。

示例脚本:

function CreateCalendar() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName('Sheet2');
  var data = sheet.getRange("H2:FC140").getValues();
  data.forEach(function(e1, i1){
    e1.forEach(function(e2, i2){
      if (e2 >= 1) {
        sheet.getRange(i1+2, i2+8).offset(0,0,1,e2).setBackground("blue");
      }
    })
  })
}

结果(样本):

enter image description here

如果我误解了你的问题,我很抱歉。