Google表格api的速度有多慢?

时间:2019-04-01 21:15:06

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

在我的脚本中,我遍历每个单元格,每个单元格代表“日历”网格上的一天。因此,它从较早的日期(由用户更改的单元格)到较晚的日期。从上到下,从左到右。

当用户更改单元格的值时,脚本开始。并且它必须在以后的每个天单元格中以相同的值填充到特定单元格。可以说它必须停在红色字体的单元格上。因此,每次迭代时,脚本都必须获取单元字体的颜色。

...或者,当脚本获取表示特定日期的单元格时,迭代必须停止。因此,脚本的每次迭代都必须验证单元格重新设置的日期。要了解一个单元格代表什么日期,我可以从辅助单元格(标题)中获取值并使用getValue()。随便。

一切都是可以忍受的:循环遍历单元格,更改每个单元格中的值,获取辅助单元格(范围)。但!一旦将getValue()添加到给定的标头中,它就会开始缓慢地工作。甚至我只是得到字体颜色...迭代中包含的任何从“ get”开始的功能都会使工作缓慢得令人难以置信!

一个可以循环播放多达getRange(),setValue()的脚本可以在可容忍的时间内完成工作,但是只有一个getFontColor()或getValue可以在一个单元中同时运行此作业。

我是非法人还是Google? 是否有机会大大加快这项工作? 还是这样的工作应该完全不同?

function onEdit(evt) {

  var aSheet = evt.source.getActiveSheet();

  // veryfy which sheet
  switch( aSheet.getName().toLowerCase() ) {

case "wage":
  // get range - calendar grid
  var wageGrid = aSheet.getParent().getRangeByName("wageGrid");
  var editedCell = evt.range;
  // loop exit flag
  var weBreak = false;

  editedCell.setFontColor("red");

  // loop through rows
  for(var rowIndex = editedCell.getRow(); rowIndex <= wageGrid.getLastRow(); rowIndex++) { if(weBreak) break;

    // loop through columns
    for(var collIndex = (rowIndex == editedCell.getRow())?editedCell.getColumn():wageGrid.getColumn(); collIndex <= wageGrid.getLastColumn(); collIndex++) {

      // as many as you like
      var currentLoopCell = aSheet.getRange(rowIndex, collIndex);
      var dayHeaderCell = aSheet.getRange(rowIndex, 1);
      var monthHeaderCell = aSheet.getRange(1, collIndex);
      cell.setValue(evt.value);

      // but getValue() or getSomeAttribute() will slow down the process
      //var cellFontColor = cell.getFontColor();
      //if(cellFontColor=="red") weBreak = true; break;

    }

  }

  break;
case "nonexistentyet":

  break;
default:
  Logger.log("What was it?")
  }
}

1 个答案:

答案 0 :(得分:0)

您遇到的是正常行为。每次对工作表的调用(如getValue()和getFontColor())都花费相当长的时间,通常每次需要1到2秒。您应该避免循环调用这些函数。

当您要遍历一大组单元格并使用它们的值时,请使用getRange()定义整个范围,并改用getValues()和getFontColors()。这些函数将返回二维数组中整个范围的数据。您甚至可以使用getDataRange()引入工作表中的所有数据。

同样,最好也使用setValues()和setFontColors()编写块,而不是一一设置单元格上的值/颜色