为什么我的Google表格功能这么慢?

时间:2019-07-07 10:08:26

标签: javascript google-apps-script google-sheets

我喜欢函数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()

2 个答案:

答案 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