我喜欢函数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()
。
答案 0 :(得分:2)
这个答案怎么样?请认为这只是几个答案之一。
我认为在您的自定义函数中,expression
给出的=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 ), "" )
。答案 1 :(得分:0)
如果您只想屏蔽零,则可以使用=TEXT()
=TEXT([FORMULA TO EVALUATE], "0;0;;@")
但这会将结果从数字更改为字符串类型。如果要在其他数值计算中使用结果,则应乘以1 *1
。