1

我有一个 onEdit 脚本,它根据一行其他单元格的内容计算单元格的值。我需要此脚本位于 onEdit 触发器而不是常规单元格函数中,因为我并不总是希望在目标单元格中​​的值发生更改时重做计算,而是检查某些条件和仅在满足这些条件时才重新计算。

我遇到的一个小问题是 onEdit 脚本从中读取数据的单元之一包含一个函数而不是一个简单的数字。这会导致问题,因为有时当我在单元格中输入数据时,它会同时触发此单元格函数和 onEdit 脚本。大多数情况下,oEdit 函数在单元格函数完成之前运行,因此 onEdit 函数只是从该单元格中获取“思考”,因此它返回 NaN。

所以我想一个方便的解决方案是让 onEdit 函数等待“目标”单元格完成计算,但我认为没有办法做到这一点?

当然,我可以将单元函数(基本上是一个带有一些附加功能的 SUM 函数)移动到 onEdit 脚本,这将解决问题。

但对我来说,在 onEdit 触发器中具有所有交互性似乎并不好。还是我只是傻?

还是我可以采取另一种方法?

4

3 回答 3

2

我认为最好的解决方案是尽可能用常规的电子表格公式替换您的自定义公式(“认为”)。这似乎是你的情况,因为它只是一个具有“附加功能”的 SUM 函数。可能一个 SUMIF 就足够了。

如果您的函数确实很复杂并且不能写成常规公式(我真的怀疑),那么最好的解决方案确实是将计算移至 onEdit-trigger。

不管你有什么问题,我总是建议不要使用自定义公式,它们确实有问题。例如,您没有遇到缓存问题吗?

于 2011-12-12T12:38:51.063 回答
1

您可以尝试:SpreadsheetApp.flush(); 在 onEdit() 脚本的开头强制重新计算,然后再继续。

http://code.google.com/googleapps/appsscript/class_spreadsheetapp.html#flush

于 2011-12-12T21:54:42.857 回答
0

要让 onEdit 等待计算,您可以尝试:

function onEdit(e) {

  // ...some if-condition that makes sure the following sleep is not called whenever any cell in your spreadsheet is edited

  Utilities.sleep(1000); // 1000 is the amount of milliseconds
}

https://developers.google.com/apps-script/reference/utilities/utilities#sleep(整数)

尽管使用 sleep 很脆弱,但以防计算花费的时间比您预期的要多或少。它可能会引入难以调试的时序问题。

所以我想一个方便的解决方案是让 onEdit 函数等待“目标”单元格完成计算,但我认为没有办法做到这一点?

要使上述 if 条件引用目标单元格(特定范围),请参阅以下答案:Google Spreadsheet SCRIPT 检查编辑的单元格是否在特定范围内

于 2020-05-22T07:27:14.383 回答