【问题标题】:How slow can the google sheets api be? [duplicate]google sheet api 能有多慢? [复制]
【发布时间】:2019-04-01 21:15:06
【问题描述】:

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

脚本在用户更改单元格的值时启动。并且它必须以相同的值填充每个后续天的单元格,直到某个单元格。可以说它必须停在带有红色字体的单元格上。因此,脚本每次迭代都必须获取单元格字体颜色。

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

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

一个循环尽可能多的脚本 getRange(), setValue() 在可容忍的时间内工作,但只有一个 getFontColor() 或 getValue 这个作业只在一个单元格上同时运行。

要么我做一些非法的事情或谷歌? 是否有机会显着加快这项工作? 或者像这样的工作应该以完全不同的方式完成?

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?")
  }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    同样,最好也使用 setValues() 和 setFontColors() 在块中写入,而不是在单元格上逐个设置值/颜色

    【讨论】:

    • 不,这不是真的。我已经验证了这个问题并重新编写了我的代码。使用 getFontColor()、getValue()、getRange() 在一秒钟内(延迟几秒钟后)处理数百个单元格,但 setValue() 必须在另一个循环中。
    • 哦,很高兴听到这个消息,听起来 Google 在幕后对此进行了优化,因此它会读取整个工作表一次,然后为您提供您要求的值。一旦你做了一个集合,它就会在下一个 get 调用时强制重新加载,这会减慢速度,很高兴知道这已经改变了。
    猜你喜欢
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多