【问题标题】:Google Sheets Script Performance With Slow Custom Function具有慢速自定义功能的 Google Sheets 脚本性能
【发布时间】:2019-02-11 03:20:28
【问题描述】:

设置: 我有一个 Google 表,我想在其中运行使用脚本实现的自定义函数。此脚本用于执行相对冗长的 URL 查找和解码过程(每次调用 10 毫秒,取决于带宽和 ping)。自定义函数使用一列作为输入,并返回结果。

问题: 打开我的 Google 工作表时,使用此计算的列会刷新。这会使 Google 工作表停止大约 10 秒,直到重新计算列中的每个单元格。当我添加到电子表格中时,这只会变得更糟。

问题: 我可以更改我的函数脚本,或更改 Google 表格中的设置,以便仅在更改输入单元格时计算慢速自定义函数吗?

对于任何好奇的人,here is a demo sheet with my problem

【问题讨论】:

  • 您可以使用onEdit(),然后检查编辑的内容是否是您要等待的单元格/范围,然后才运行您的脚本。
  • 除了 ChrisW 所说的,按需调用函数,如从自定义菜单/按钮调用。
  • 我试用了您的电子表格和副本。一些想法:1)它几乎是一个循环引用,因为函数参数“x”也是睡眠命令的乘数。当在睡眠期间声明一个单独的变量或将 sleep 编辑为静态值时,过度延迟就会消失 - 例如,Utilities.sleep(100);。如果我可能会问,您在自定义函数中的 sleep 命令中看到了什么好处。停止/中断脚本一段时间是一回事,但为什么要中断自定义函数呢?
  • sleep 命令代表我的实际功能:调用 google API 来取消缩短 goo.gl 链接,然后对返回的 GPS 坐标 URL 进行正则表达式解析,然后进行格式化。另外,我正在旅行,没有时间尝试上面留下的回复,但我很快就会。
  • 好的,我终于回家了,有机会查看您的回复。 OnEdit 似乎很有希望,因为它可以配置为仅在编辑感兴趣的列中的单元格时运行,但是我意识到这是谷歌表格的默认行为。我遇到的延迟是在浏览器刷新时重新计算所有单元格,而不是在更改一个单元格时重新计算。更改一个单元格需要几微秒(不是问题),但重新计算整个列需要更长的时间。我想我将不得不忍受缓慢的开放时间。谢谢..

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


【解决方案1】:

在我对In google sheets can I wrap a standard function in a custom function to control when it is run? 的回答中,我分享了一个想法,即使用几个名为“冻结”/“解冻”的按钮来控制“昂贵公式”的重新计算何时完成。

在这种情况下,您可以在关闭电子表格之前使用自定义函数“冻结”范围,以便下次打开时打开速度更快,然后在需要更新冻结范围时“解冻”它。

在发布原始版本后,OP 要求提供一个简单的版本,但由于我的原始实现是快速而肮脏的西班牙语内容,因此我只分享了最重要的代码行。核心方法服务是

  • 如果公式始终相同,则用于存储公式的全局变量
  • copyTo 用仅复制粘贴值的值覆盖公式结果范围
  • clear删除之前粘贴的公式结果
  • setFormula 将公式添加回电子表格。

然后我意识到我可以改进已发布的 an unlisted Google Sheets add-on,它使用 PropertiesService 来实现“公式存储”,其中包含添加/删除/列出公式和动态菜单而不是按钮的功能。

要尝试的其他方法是使用运行时间驱动的触发器,假设每晚运行一次,以防您忘记冻结自定义函数结果的范围。

【讨论】:

    【解决方案2】:

    如果自定义函数较少,性能会稍好一些。你可以重写你的函数来接收一个数组,这样你就只有一个函数,而不是一次运行 100 个。

    function mySlowFunction(x) {
      //Utilities.sleep(x*100); //100 ms
      if (x.map) {
        return x.map(function(y) {return mySlowFunction(y) });
      } else {
        return x * 100;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多