Почему мои функции Google Sheets работают так медленно? - PullRequest
0 голосов
/ 07 июля 2019

Мне нравится форма функции 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? Интересно, есть ли способ, основанный на событиях, сделать то же самое без необходимости eval() в слое JavaScript.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Как насчет этого ответа?Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Модифицированный скрипт:

Я думаю, что в вашей пользовательской функции 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 ), "" ).
0 голосов
/ 08 июля 2019

Если вы только пытаетесь замаскировать ноль, вы можете использовать =TEXT()

=TEXT([FORMULA TO EVALUATE], "0;0;;@")  

Но это изменит результат с числа на тип строки.Вы должны умножить на 1 *1, если хотите использовать результат в других числовых вычислениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...