Обновить

ARRAYFORMULA vs. MAP

В Google Sheets есть две функции, позволяющие производить операции над целыми массивами: ARRAYFORMULA и MAP.

Пусть в столбце A лежит цена товара, а в столбце B — скидка в процентах. Посчитаем финальную цену для всех товаров:

=ARRAYFORMULA(A2:A*(1-B2:B))

Как видно, ARRAYFORMULA позволяет обращаться с массивами как с одиночными ячейками, выполняя любые арифметические (и не только) действия. Под капотом формула работает построчно: сначала обрабатывает первые ячейки столбцов A и B, потом вторые, и т.д. Всего одной формулой мы посчитали финальные цены сразу для всех товаров. Минус такого подхода: когда формула разрастается, становится тяжело разобраться, какие действия с какими столбцами производятся.

Решим ту же задачу с помощью MAP:

=MAP(A2:A;B2:B;LAMBDA(price;discount;price*(1-discount)))

Функция принимает на вход неограниченное количество массивов (в нашем случае — два). Далее она последовательно берёт элементы этих массивов, передаёт в функцию LAMBDA под именами, указанными в первых аргументах (price и discount), и выполняет вычисление, переданное последним аргументом (price*(1-discount)). Благодаря явному именованию массивов формула читается понятнее.

Встречаются случаи, когда ARRAYFORMULA в принципе не работает. Например, когда внутри необходимо использовать другую формулу массива.

Пример: пусть для каждого значения из столбца A нужно отфильтровать и склеить через запятую значения из другой таблицы:

=ARRAYFORMULA(JOIN(", ";FILTER(D2:D;E2:E=A2:A)))

Формула не работает, т.к. FILTER получает вторым аргументом сравнение двух массивов и не понимает, что от него требуется.

MAP же успешно справляется с этой задачей, т.к. передаёт в лямбда-функцию конкретное значение, по которому можно отфильтровать другую таблицу:

=MAP(A2:A;LAMBDA(id;JOIN(", ";FILTER(D2:D;E2:E=id))))

Резюме: в простейших случаях ARRAYFORMULA компактнее, в сложных формулах MAP более понятное, а иногда и единственное решение.

Теги:
0
Комментарии0

Публикации

Ближайшие события