Представьте, что вы работаете с таблицей, где имена студентов указаны только один раз, а их курсы перечислены ниже — но между группами данных есть пустые строки. Задача: сделать так, чтобы каждому курсу соответствовало имя студента, и при этом избавиться от ненужных пробелов. Это типичный сценарий для учебных заведений или корпоративных отчётов, где данные структурированы «сверху вниз», но их нужно преобразовать в плоский формат для анализа.

Шаг 1: Подготовка данных и ключевые функции
Перед тем как браться за формулы, проверьте, что:
- Данные организованы в три колонки (например, Имя, Курс, Код курса).
- Пустые строки между группами — это действительно пустые ячейки, а не пробелы или скрытые символы (используйте
=TRIM()
, если есть сомнения).
Основная идея решения — «протянуть» имя студента вниз до тех пор, пока не встретится следующее имя. Для этого понадобятся функции:
- XLOOKUP() — для поиска последнего непустого значения выше текущей ячейки.
- BYCOL() и MAP() — чтобы обработать каждую колонку отдельно и заполнить пропуски.
- FILTER() — чтобы удалить полностью пустые строки из исходных данных.
Кстати, если вы раньше использовали VLOOKUP()
или ARRAYFORMULA()
, этот подход покажется более гибким — особенно когда количество курсов у студентов варьируется от 1 до 5.
Шаг 2: Формула для автоматического заполнения
Создайте новый лист и вставьте эту формулу в ячейку A1:
=let(
fillDown_, lambda(data, let(a,data,r,max(bycol(a,lambda(l,index(ifna(xmatch("?*",to_text(l),2,-1))))),s,sequence(r),array_constrain(bycol(a,lambda(v,map(s,lambda(i,index(xlookup(i,s/(v""),v,,-1)))))),r,columns(a)))),
data, filter('working concepts'!A1:C, len('working concepts'!B1:B)),
fillDown_(data)
)
Разберём логику по частям:
fillDown_
— это пользовательская функция, созданная черезLAMBDA()
. Она принимает массив данных (data
) и для каждой колонки находит последнее непустое значение, чтобы заполнить пустоты.FILTER()
удаляет строки, где колонка B (курсы) пустая — так мы избавляемся от ненужных разрывов.XMATCH("?*", ...)
ищет ячейки с любым текстом (?*
— регулярное выражение), чтобы определить, до какого ряда нужно «тянуть» данные.XLOOKUP(i, s/(v""), v, , -1)
— ключевая часть. Здесьi
— текущий номер строки,s/(v"")
создаёт массив, где пустые ячейки игнорируются, а-1
указывает на поиск ближайшего значения сверху.

Дополнительные рекомендации
- Если формула возвращает ошибку
#N/A
, проверьте, что в исходных данных нет скрытых символов (например, переносов строк в ячейках). - Чтобы адаптировать формулу под большее количество колонок, измените диапазон
'working concepts'!A1:C
на нужный (например,A1:E
). - Для визуального контроля добавьте условное форматирование: выделите колонку с именами и задайте правило
=A2A1
с цветной заливкой — это поможет быстро найти места, где начинается новый студент.
Если вы впервые используете LAMBDA()
-функции, не пугайтесь: их можно разбить на части. Например, сначала примените FILTER()
, затем поэкспериментируйте с XLOOKUP()
отдельно. Главное — понять, что алгоритм работает по принципу «запомнить последнее значение и повторять его, пока не встретится новое».
P.S. Если нужно объединить данные из нескольких листов, используйте {}
— например, {Лист1!A1:C; Лист2!A1:C}
. Но помните: формула автоматически не обновляется при добавлении новых листов — для этого потребуется скрипт Google Apps Script.