【问题标题】:Why does an autoResizeColumn() loop seem to freeze a Google Apps Script?为什么 autoResizeColumn() 循环似乎冻结了 Google Apps 脚本?
【发布时间】:2016-10-26 06:40:04
【问题描述】:

我要做的就是调整电子表格中所有列的大小。这是一个独立的电子表格。我正在使用:

function format() {
  var destination = SpreadsheetApp
    .openByUrl("https://docs.google.com/spreadsheets/d/spreadsheetIdHere/edit#gid=0")
    .getSheetByName("sheetName");
  var columns = destination.getMaxColumns();
  destination.setFrozenRows(1);
  destination.setFrozenColumns(3);
  for (var i = columns; i >= 1; i--) {
    Logger.log(i)
    destination.autoResizeColumn(i);
  }
}

for (var i = columns; i >= 1; i--)for (var i = 1; i <= columns; i++) 我都试过了,只是因为我不知道是什么原因造成的。我假设一个无限循环,但我完全删除了循环,它仍然运行了太长时间。

当我注释掉 autoResize... 大约一秒钟后,日志会产生预期的结果。带回 autoResize... 脚本会不断运行,甚至不会更改任何列。

我尝试取出循环并在autoResizeColumn(227) 中输入一个数字,这很有效。把循环带回来,我就卡住了。

是 autoResizeColums() 太慢了,还是我遗漏了什么?

如果需要更多信息,请告诉我。

【问题讨论】:

  • 尝试使用 getLastColumn() 而不是 getMaxColumn()。 getLastColumn() 为您提供包含数据的最后一列的索引,而 getMaxColumn() 为您提供电子表格中总列数的索引。标准 Google 电子表格中的最大列数为 256。

标签: javascript for-loop google-apps-script google-sheets


【解决方案1】:

第 1 部分

来自问题:

脚本只是不断运行,甚至没有更改任何列。

来自flush()

电子表格操作有时会捆绑在一起以提高性能,例如在多次调用 Range.getValue() 时。

如果您想在脚本结束前查看您的脚本对电子表格所做的更改,您必须添加SpreadshsheetApp.flush()。请记住,官方文档1的一个不良做法示例中提到了将其添加到循环中。

1Best practices

第 2 部分

来自问题:

是 autoResizeColums() 太慢了,还是我遗漏了什么?

通常,对 SpreadsheetApp 和其他类似服务的调用非常慢。根据我自己的经验,我看到的最慢调用是使用 Properties Service 写入用户属性需要 9 秒

【讨论】:

  • 我知道,这就是我没有添加flush()的原因。我不需要看,我只是对完成所需的时间感到震惊。
  • 请在您的问题中加入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多