我有一个onEdit脚本,它根据一行其他单元格的内容计算单元格的值。 我需要将此脚本放在onEdit触发器而不是常规单元函数中,因为当一个目标单元格中的值发生更改时,我并不总是希望重新计算,而是检查某些条件和只有在符合要求时才重新计算。
我遇到的一个小问题是onEdit脚本从中读取数据的一个单元格包含一个函数而不是一个简单的数字。 这会导致问题,因为有时当我在单元格中输入数据时,它会触发此单元格函数和onEdit脚本。大多数情况下,oEdit函数在单元格函数完成之前运行,因此onEdit函数只是从这个单元格中获取“Thinking”,因此返回NaN。
所以我想一个方便的解决办法是让onEdit函数等待“目标”单元格完成计算,但我认为没有办法做到这一点?
当然,我可以将单元格函数(基本上是具有一些附加功能的SUM函数)移动到onEdit脚本,这将解决问题。
但对我来说,在onEdit-trigger中拥有所有交互性似乎并不那么好。或者我只是愚蠢?
或者我能以某种方式采取另一种方法吗?
答案 0 :(得分:1)
我认为最好的解决方案是尽可能使用常规电子表格公式替换您的自定义公式(“思考”)。它似乎是你的情况,因为它只是一个具有“附加功能”的SUM功能。可能SUMIF就足够了。
如果你的函数确实复杂并且不能写成常规公式(我真的怀疑),那么最好的解决办法就是将计算移动到onEdit-trigger。
无论您遇到什么问题,我总是建议不要使用自定义公式,它们确实存在问题。例如你有没有遇到过缓存问题?
答案 1 :(得分:0)
您可以尝试: SpreadsheetApp.flush(); 在onEdit()脚本的开头,在继续之前强制重新计算。
http://code.google.com/googleapps/appsscript/class_spreadsheetapp.html#flush
答案 2 :(得分: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(Integer)
尽管使用睡眠很脆弱,以防计算花费的时间比您预期的长或短。它可能会引入难以调试的时序问题。
因此,我想对此的一种便捷解决方案是使onEdit函数等待“目标”单元格完成计算,但我认为没有办法这个吗?
要获得上述if条件引用目标单元格(特定范围),请参阅以下答案:Google Spreadsheet SCRIPT Check if edited cell is in a specific range