Более эффективный способ избежать множественных вычислений №2?

Вот более сложная версия другого сообщения, которое я сделал сегодня ранее. Более эффективный способ избежать множественных вычислений? У меня их много цепи в моей простыне. Есть ли более эффективный способ, чем то, что я делаю?

Вот пример сообщения с более сложной формулой. https://docs.google.com/spreadsheets/d/1qejqo0WzMYa5K7YCnovW-7ki97DCX2h6gGA7LE7Eeh8/edit?usp=sharing

=INDIRECT("Data!E"&(K8-1))
=INDIRECT("Data!E"&(K9-1))
=INDIRECT("Data!E"&(K10-1))

и т.п.

Могу ли я изменить это, чтобы оно работало?

=ARRAYFORMULA(ROW(A1:A20)*????)

Есть ли одна формула или более эффективная, которая может сократить время расчета?


person DAK7    schedule 17.09.2019    source источник


Ответы (1)


сделать это можно так:

=ARRAYFORMULA(IFERROR(VLOOKUP(K8:K-1, {ROW(A:A), Data!E:E}, 2, 0)))

0

person player0    schedule 17.09.2019
comment
У меня были проблемы с этими формулами массива, иногда я не решался вычислить из-за отсутствия лучших условий. Данные в таблице данных моего живого проекта импортируют новую строку и копируют ее каждую минуту. Время обработки составляло в среднем всего 7 секунд, чтобы рассчитать все, когда триггер запускается каждую минуту, но иногда, как сегодня, он выполняется более 30 секунд каждую минуту, и я скоро получу предупреждение от Google, что я использую для многих ресурсов. Я вижу, что пока он отстает, это вместе с другими формулами массива занимает очень много времени. Любые предложения, пожалуйста? - person DAK7; 04.10.2019
comment
До того, как преобразовать их в формулы массива, время обработки составляло в среднем 9 или 10 секунд каждую минуту, но у меня никогда не было периодов времени, которые длились бы 30-40 секунд. Вы слышали об этом? - person DAK7; 04.10.2019
comment
ну, формулы массива вычисляют также пустые строки, если вы не укажете, что они не должны этого делать. например, указанная выше формула может быть записана в сверхбыстром режиме, например: =ARRAYFORMULA(IFERROR(VLOOKUP(INDIRECT("K8:K"&COUNTA(K8:K)+7)-1, {ROW(INDIRECT("A1:A"&COUNTA(Data!E1:E))), INDIRECT("Data!E1:E"&COUNTA(Data!E1:E))}, 2, 0))) - что исключает из расчета пустые строки. но, конечно, сверхбыстрое выполнение зависит от фактической длины ввода. правило остается в силе: меньше строк для вычисления = быстрее выполнение - person player0; 04.10.2019
comment
Спасибо! Основываясь на вашей идее использования INDIRECT (), изменения F7 - это то, что меняет столбец K, и большую часть времени он равен нулю, поэтому я просто буду использовать IF true, а затем использовать INDIRECT, который не меняется. = ЕСЛИ (F7 = 0, ARRAYFORMULA (VLOOKUP (AQ43: AQ79-1, {ROW (INDIRECT (Data! A13: A600))), INDIRECT (Data! E13: E600)}, 2, 0)), ARRAYFORMULA (VLOOKUP ( AQ43: AQ79-1, {ROW (Data! A: A), Data! E: E}, 2, 0))) - person DAK7; 04.10.2019
comment
Вы бы случайно не узнали, выполняет ли он (Data! A: A) поиск сверху вниз? Если это так, поле поиска начинается сверху вниз до определенного числа, поэтому, вероятно, будет иметь большое значение, если я думаю? Кроме того, у меня нет пустых строк. Спасибо, что ответили на мои вопросы. - person DAK7; 05.10.2019
comment
да, A: A начинается с A1 и заканчивается последней ячейкой в ​​столбце A - person player0; 05.10.2019