Что тут происходит? Мы задаем функцию f.
На входе она получает один параметр x — в нашей задаче это название этапа.
И делает следующее:
Берет даты на столбец и на два правее от названия этапа (это делает функция СМЕЩ / OFFSET).
Превращает эти даты в последовательность дат от начала и до конца с помощью SEQUENCE. Чтобы не повторять большую конструкцию, называем ее "даты" с помощью функции LET — все это уже внутри нашей "пользовательской" функции f.
SEQUENCE(СМЕЩ(x;0;2)-СМЕЩ(x;0;1)+1;1;СМЕЩ(x;0;1))
Повторяем название этапа с помощью функции MAKEARRAY. Ну а число дат в последовательности считаем через старый добрый СЧЁТ / COUNT.
MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x))
Соединяем (HSTACK) эти даты с названием этапа, повторенным столько раз, сколько в нем дат:
HSTACK(MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x));даты))
И далее эту функцию f мы используем. В качестве первоначального аргумента в REDUCE мы отправляем заголовки
{"Название" \ "Дата"}, а далее накапливаем результат: пробегаемся по списку этапов, для каждого получаем таблицу с помощью написанной нами ранее функции f, и добавляем полученные таблицы одна под другой с помощью VSTACK.
REDUCE({"Название" \ "Дата"};Данные[Название]; LAMBDA(acc;val; VSTACK(acc; f(val)))))
Вся формула:
=LET(f; LAMBDA(x; LET(даты; SEQUENCE(СМЕЩ(x;0;2)-СМЕЩ(x;0;1)+1;1;СМЕЩ(x;0;1)); HSTACK(MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x));даты)));
REDUCE({"Название" \ "Дата"};Данные[Название]; LAMBDA(acc;val; VSTACK(acc; f(val)))))
Альтернативное решение:
=ARRAYFORMULA(SPLIT(TOCOL( MAP(A2:A4;B2:B4;C2:C4;LAMBDA(a;b;c;a & "#" & ТЕКСТ(ТРАНСП( SEQUENCE(c-b + 1;1;b));"dd.mm.yyyy")));1);"#"))
Ссылка на таблицу с обеими формулами
