问题描述
我有一个运行有多个人参与的,带有Google Apps脚本脚本的Google文档。人们编辑工作表时会触发一个onEdit
触发器。据我了解,如果有人编辑工作表,则会触发我的onEdit
触发功能。
如果第二个人在第一个onEdit
完成处理之前编辑工作表,则它将停止第一个实例,而第二个onEdit
在不完成第一个实例的情况下启动。
为避免这种情况,我尝试通过以下理论使我的代码尽可能高效:如果onEdit
进程花费的时间较少,那么重叠的可能性就较小。为了做到这一点,我尝试最小化我的读/写。通过使用一系列的记录器语句,我跟踪了很耗时的代码行。我注意到我的setValues()
行之一需要近6秒钟来运行。在对它进行调整之后,这是一个很大的数组,会被发回到工作表中。
我的问题:
- 与
setValues()
相比,setValue()
通话需要更长的时间吗? - 与大数组的
setValues()
相比,对小数组的setValues()
调用所花费的时间短吗?
我知道一个setValues()
会比1000个setValue()
命令快得多。
我认为无论大小如何,一次写入工作表应该花费相同的时间。有什么办法可以使这段时间最小化?
解决方法
问题1:
setValues()
比setValue()
需要更长的时间吗?
A1:不是。关于这一点,您可以从以下实验结果中看到。
Q2:小数组的
setValues()
调用比大数组的setValues()
花费更少的时间吗?
A2:是的。关于这一点,您可以从以下实验结果中看到。
Q3:我假设一次写入工作表应该花费相同的时间,而不管大小如何。有什么办法可以使这段时间最小化?
A3:如果您想减少更多输入值的过程成本,那么如何使用Sheets API?关于这一点,您可以在“ A2”处看到它。
注意:
-
以上答案的依据是Benchmark: Reading and Writing Spreadsheet using Google Apps Script。
-
作为@TheMaster's comment,我还认为LockService可能会解决您的问题。
- 我认为可以在stackoverflow上看到LockService的示例脚本。 Ref