【问题标题】:Best Practices for Multiple OnEdit Functions多个 OnEdit 函数的最佳实践
【发布时间】:2020-03-02 17:24:09
【问题描述】:

问题

  • 我有 6 个 OnEdit 函数,它们可以单独按预期工作,但当它们一起使用时,它们不能按预期工作。我的意思是有些根本不会触发。

脚本的属性

  • 他们有不同的名字 - function onEdit(e) {code}, function onEdit1(e1) {code}, function onEdit2(e2) {code}, function onEdit3(e3) {code}, function onEdit4(e4) {code}, function onEdit5(e5) {code}
  • 它们都在同一个 .gs 选项卡中
  • 其中一些具有相同的变量。例如 OnEdit 有 var range = e.range; 而 OnEdit5 有 var range = e5.range;

我的理解

  • 我相信您可以在同一个 .gs 选项卡中运行多个 OnEdit 函数。它是否正确?还是我需要以某种方式创建新的 .gs 选项卡?
  • 我认为我的 onEdit 函数应该命名不同,所以它们被正确调用。这是正确的,还是我应该摆脱不同的功能并将它们放入一个庞大的功能中? (我想这会导致执行速度变慢,以及更多无法隔离不正确代码的情况)。
  • 我相信在每个函数中创建的变量是特定于该函数的。这是真的?还是它们相互影响?

我为什么要问这个

这个问题的迭代似乎以前被问过。但是人们通常会建议将两个功能集成为一个大功能,而不是准备某人集成 10-20 个不同的 OnEdit 功能。它们也没有明确指出最佳编码实践。

我已经花了几个小时阅读这个主题,并且觉得像我这样的脚本新手会从了解这一点中受益匪浅。

提前感谢您的任何贡献!

【问题讨论】:

  • 最佳实践取决于每个函数的作用。
  • 都是 If 语句。作为一个快速的总结,他们做了以下 e = .clearContent(), .uncheck(), .getFilter().sort。 e1 = .getFilter().sort。 e2 = .setValue(new Date())。 e3 = .copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false), .deleteRow(range2.getRow()。e4 = .clearContent(), .getFilter() .sort(12, true). e5 = .clearContent(), .uncheck(), .getFilter().sort(12, true).
  • 我认为最好将所有 onEdit 函数放在一个函数中,我更喜欢使用可安装的触发器。而且我也更喜欢在他们身上做的越少越好。让它们变得毫无用处并不需要太多流量。

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


【解决方案1】:

注意事项:

  • 只能有一个同名函数。如果有两个,后者将覆盖前者。就好像前者从未存在过一样。
  • 名为onEdit 的函数会在编辑时自动触发(您猜对了!)
  • 对于 onEdit1onEdit2....等其他名称没有简单的触发器。
  • 简单触发器的执行时间限制为 30 秒
  • 所以,在单个code.gs文件中,甚至在单个项目中,只能有一个名为onEdit的函数并触发成功。
  • 如果您创建多个项目,onEdit 将在每个项目中异步触发。但是可以创建的项目数量是有限制的,并且将适用其他配额。
  • 或者,您可以使用已安装的触发器:没有 30 秒的限制。您还可以为函数使用任何名称。
  • 优化函数的最佳方法是除非绝对必要,否则不要接触电子表格。例如,sorting 脚本内的各种值比在多个范围上多次重复调用.sort 更好。工作表和脚本之间的交互越少越好。高度优化的脚本只需要对电子表格进行两次调用:一次获取数据,另一次设置数据。
  • 优化对工作表的调用次数后,您可以优化脚本本身:控制逻辑,以便每次编辑只完成必要数量的操作。例如,如果编辑在A1(A1,B1是复选框,如果点击清除A2:A10,B2:B10),那么你应该检查A1是否被点击,如果点击,清除范围并退出而不是检查再次为 B1。脚本优化至少需要 JavaScript 对象的基本知识。然而,这不如减少调用次数有效——这是所有应用脚本中最慢的部分。

参考资料:

【讨论】:

  • 这正是我所希望的那种建议。谢谢你。我也很欣赏额外的阅读。
  • 我花了很多时间重写我的函数并根据您的建议合并它们,现在我已经完成了,我可以说它可以按预期协同工作。我已经设法优化了一些代码(它减少了调用)。但是我仍然需要减少调用并阅读更多关于可安装触发器的信息,以实现这些。再次感谢您抽出宝贵时间。我知道,随着我能力的提高,我实现你所写的一切的能力也会提高。
  • @Adam 很高兴为您提供帮助
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2019-12-26
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多