我喜欢函数 IFNA( expression, value_if_NA )
的形式来检查条件,而无需计算两次。
所以,我想我应该编写我认为缺少的函数,IFZERO( expression, value_if_zero )
。我的函数可以工作,但它似乎特别慢,有时会死锁(在一小部分单元格中显示“正在加载...”)。
function IFZERO( expression, valueIfZero )
{
var result = eval( expression );
if ( result === 0 )
return valueIfZero;
return result;
}
我的用法是在一列具有此类公式的单元格中:
=IFZERO( E70 - SUMIF( A:A, A70, G:G ), "" )
结果: 单元格显示“正在加载...”,执行一个单元格大约需要 500 毫秒。
我的工作表中只有大约 80 行,尽管 A、G 等中的值是从其他工作表的 FILTER()
结果中提取的,但等效的(但不太漂亮)
=IF( E70 - SUMIF( A:A, A70, G:G ) = 0, "", E70 - SUMIF( A:A, A70, G:G ) )
立即返回。
我的问题是:我的 JavaScript 函数是否错过了某种优化?我想知道是否有一种基于事件的方法可以做同样的事情,而不必在 JavaScript 层中使用 eval()
。
最佳答案
这个答案怎么样?请将此视为多个答案之一。
修改后的脚本:
我认为在您的自定义函数中,=IFZERO( E70 - SUMIF( A:A, A70, G:G ), "")
给出的表达式
有已经计算过了。所以你可以修改如下。
function IFZERO(result, valueIfZero) {
return result === 0 ? valueIfZero : result
}
- 通过此修改,不需要使用
eval()
。 - 您还可以将此修改后的脚本用作
=IFZERO( E70 - SUMIF( A:A, A70, G:G ), "")
。
关于javascript - 为什么我的 Google 表格功能这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56921170/