Другое

ARRAYFORMULA: объединить элементы по категории Таблицах

Узнайте, как использовать ARRAYFORMULA в Google Таблицах для объединения всех элементов по категории в одну ячейку. С методами QUERY, FILTER и TEXTJOIN.

Как можно создать таблицу в Google Sheets с помощью ARRAYFORMULA, чтобы объединить все элементы, удовлетворяющие одинаковому критерию, в одну ячейку?

У меня есть таблица с двумя столбцами:

  • Столбец A: Элементы
  • Столбец B: Категории

Пример данных:

Элемент Категория
Apple Fruit
Orange Fruit
Cauliflower Vegetable
Rose Flower
Tulip Flower
Steak Meat
Carrot Vegetable
Salmon Meat

Я хочу создать новую таблицу с:

  • Столбец D: Категории
  • Столбец E: Все элементы, принадлежащие этой категории, объединённые в одну ячейку

Пример результата:

Категория Элементы
Fruit Apple, Orange
Vegetable Cauliflower, Carrot
Meat Steak, Salmon
Flower Rose, Tulip

Я пробовал использовать формулу:

gs
=ARRAYFORMULA(CONCATENATE(REPT(A3:A&" ",B3:B=G3)))

но она не работает как ARRAYFORMULA. CONCATENATE, FILTER и JOIN тоже не дают ожидаемого результата. Как можно добиться этого с помощью ARRAYFORMULA в Google Sheets?

Создание таблицы, в которой все элементы объединяются по категории в Google Sheets, требует сочетания функций, которые работают вместе, чтобы сгруппировать и объединить данные. Текущий подход нуждается в доработке, но есть несколько эффективных способов достичь желаемого результата.


Содержание


Стандартное решение: UNIQUE с FILTER и JOIN

Надёжный способ использует три функции, работающие вместе: UNIQUE для получения уникальных категорий, FILTER для извлечения элементов каждой категории и JOIN (или TEXTJOIN) для их объединения.

Пошаговая реализация

В целевой таблице (столбцы D и E) используйте следующие формулы:

Для столбца D (Категории):

=UNIQUE(B3:B)

Для столбца E (Элементы):

=JOIN(", ", FILTER(A3:A, B3:B=D3))

Перетащите эту формулу вниз рядом с уникальными категориями.

Полная версия ARRAYFORMULA

Если вы хотите использовать ARRAYFORMULA для всей колонки:

excel
=ARRAYFORMULA(
  IF(
    D3:D = "", "",
    JOIN(", ", FILTER(A3:A, B3:B = D3:D))
  )
)

Как это работает:

  • UNIQUE(B3:B) извлекает все уникальные категории из исходных данных
  • FILTER(A3:A, B3:B=D3) получает все элементы, совпадающие с категорией в каждой ячейке столбца D
  • JOIN(", ", …) объединяет отфильтрованные элементы через запятую и пробел

Использование функции QUERY для более эффективной группировки

Функция QUERY часто более эффективна для такого рода преобразования данных, поскольку она может выполнять группировку и агрегацию в одной операции.

Реализация формулы QUERY

excel
=QUERY(
  A3:B,
  "SELECT B, GROUP_CONCAT(A) 
   WHERE A IS NOT NULL AND B IS NOT NULL 
   GROUP BY B 
   LABEL B 'Category', GROUP_CONCAT(A) 'Items'",
  1
)

Как это работает:

  • SELECT B, GROUP_CONCAT(A) выбирает столбец категорий и объединяет все элементы
  • WHERE A IS NOT NULL AND B IS NOT NULL отбрасывает пустые строки
  • GROUP BY B группирует все строки по категории
  • LABEL переименовывает столбцы для удобства
  • 1 в конце указывает, что в выводе есть одна строка заголовка

Преимущества:

  • Одна формула создаёт всю сводную таблицу
  • Более эффективна, чем несколько вложенных функций
  • Встроенные заголовки столбцов
  • Лучше справляется с большими наборами данных

Современный подход с ARRAYFORMULA

Для Google Sheets, поддерживающих современные массивные функции (2018+), можно использовать более элегантный подход с ARRAYFORMULA:

excel
=ARRAYFORMULA(
  IF(
    D3:D = "", "",
    TEXTJOIN(", ", TRUE, FILTER(A3:A, B3:B = D3:D))
  )
)

Ключевые улучшения по сравнению с оригинальным подходом:

  • Используется TEXTJOIN вместо CONCATENATE для лучшего контроля над разделителями
  • Корректно обрабатывается логика фильтрации с помощью функции FILTER
  • Включён оператор IF, чтобы избежать ошибок в пустых ячейках
  • Работает корректно как массивная формула при перетаскивании или применении к всей колонке

Альтернатива: LAMBDA и BYROW

Для последних версий Google Sheets (2021+) можно использовать более продвинутые функции LAMBDA и BYROW:

excel
=BYROW(
  UNIQUE(B3:B),
  LAMBDA(category,
    TEXTJOIN(", ", TRUE, FILTER(A3:A, B3:B = category))
  )
)

Как это работает:

  • UNIQUE(B3:B) получает все уникальные категории
  • BYROW обрабатывает каждую категорию отдельно
  • LAMBDA(category, …) определяет функцию, работающую с каждой категорией
  • FILTER(A3:A, B3:B = category) получает элементы для конкретной категории
  • TEXTJOIN объединяет результаты

Преимущества:

  • Более эффективная обработка
  • Чистый синтаксис
  • Лучшее производительность с большими наборами данных

Почему ваш текущий запрос не работает

Ваш оригинальный запрос:

excel
=ARRAYFORMULA(CONCATENATE(REPT(A3:A&" ",B3:B=G3)))

Имеет несколько проблем:

  1. Ограничения CONCATENATE: CONCATENATE плохо работает с массивными входами в Google Sheets
  2. Использование REPT: REPT повторяет текст заданное число раз, но логика B3:B=G3 сравнивает весь диапазон с одной ячейкой
  3. Логический поток: формула фактически не фильтрует и не группирует элементы по категории
  4. Отсутствие агрегации: нет механизма объединения нескольких элементов в один результат

Правильная версия будет выглядеть так:

excel
=ARRAYFORMULA(
  TEXTJOIN(", ", TRUE, FILTER(A3:A, B3:B = G3))
)

Обработка особых случаев и крайних сценариев

Пустые категории

Если некоторые категории могут быть пустыми, добавьте обработку ошибок:

excel
=ARRAYFORMULA(
  IFERROR(
    TEXTJOIN(", ", TRUE, FILTER(A3:A, B3:B = D3:D)),
    ""
  )
)

Разные разделители

Используйте разные разделители по необходимости:

  • Только пробел: TEXTJOIN(" ", TRUE, …)
  • Точка с запятой: TEXTJOIN("; ", TRUE, …)
  • Перевод строки: TEXTJOIN(CHAR(10), TRUE, …)

Сравнение без учёта регистра

Если категории могут иметь разную капитализацию:

excel
=ARRAYFORMULA(
  TEXTJOIN(", ", TRUE, FILTER(A3:A, LOWER(B3:B) = LOWER(D3:D)))
)

Оптимизация производительности

Для очень больших наборов данных (10 000+ строк):

  1. Используйте функцию QUERY для лучшей производительности
  2. Ограничьте диапазоны до фактических данных, а не до целых столбцов
  3. Рассмотрите использование скрипта для сложных агрегаций

Источники

  1. Документация ARRAYFORMULA в Google Sheets
  2. Руководство по функции FILTER в Google Sheets
  3. Справка по функции TEXTJOIN в Google Sheets
  4. Учебник по функции QUERY в Google Sheets
  5. Продвинутые техники ARRAYFORMULA

Заключение

Чтобы создать таблицу, в которой все элементы объединяются по категории в Google Sheets, у вас есть несколько эффективных вариантов:

  1. Для простоты: используйте UNIQUE + FILTER + JOIN – самый прямой подход, работающий во всех версиях Google Sheets
  2. Для эффективности: применяйте функцию QUERY – лучшая производительность для больших наборов данных с встроенной группировкой
  3. Для современных таблиц: используйте LAMBDA + BYROW – элегантный синтаксис для последних версий Google Sheets

Ключевой момент – понять, что CONCATENATE не работает с массивами, и необходимо правильно фильтровать элементы перед их объединением с помощью TEXTJOIN или JOIN. Начните с подхода QUERY для лучшего сочетания простоты и производительности, а затем исследуйте другие методы в зависимости от ваших конкретных потребностей и версии Google Sheets.

Авторы
Проверено модерацией
Модерация