Транспонировать Google таблицу и разложить по заказам

Имею таблицу, сформированную из Google Forms:

Таблица с заказами разных товаров

Хочется сделать из нее что-то типа такого:

Какой хотелось бы результат

Открыл для себя следующую формулу:

={ARRAYFORMULA(QUERY(TRANSPOSE('Заказы'!1:2); "where Col1 is not null"; 1))}

Но, она игнорирует все кроме чисел и выводит только всю таблицу целиком, вот так:

Так не пойдет

А нужно чтобы каждый заказ был отдельно, и друг за другом или еще как-то так, чтобы это удобно было потом распечатать.

Вот ссылка на форму


Ответы (1 шт):

Автор решения: contributorpw

Подчеркну особо, что эта задача должна решаться скриптами. Из-за отсутствия порядка данных решение формулами остается лишь возможным в теоретическом плане. Практическое применение потребует больших затрат на сопровождение.

Введение

Ради спортивного интереса.

  • Можно делить номер строки на количество колонок в карточке, остаток от деления - это будет положение элемента в карточке
  • Можно делить номер строки на количество колонок в карточке, целая часть - это будет номер карточки

Условно, для трех карточек в которых по три поля

введите сюда описание изображения

Формулы VLOOKUP и HLOOKUP могут "пробегать" массивы для подстановки по индексам.

Сама задача плохо подходит для формул, поэтому потребуется подготовить данные. Я в примере их просто все привел к строке. Но можно заморочиться.

Решение

Построение заголовков карточек

=ARRAYFORMULA(HLOOKUP(
  MOD(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные));
  {COLUMN(Подготовленные_данные);Подготовленные_данные};
  2;
  0
))

введите сюда описание изображения

Построение значений карточек

=ARRAYFORMULA(HLOOKUP(
  MOD(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные));
  {COLUMN(Подготовленные_данные);Подготовленные_данные};
  QUOTIENT(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные))+3;
  0
))

введите сюда описание изображения

Итоговая формула

=QUERY(ARRAYFORMULA(IFNA(
  {
    HLOOKUP(
      MOD(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные));
      {COLUMN(Подготовленные_данные);Подготовленные_данные};
      2;
      0
    )\
    HLOOKUP(
      MOD(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные));
      {COLUMN(Подготовленные_данные);Подготовленные_данные};
      QUOTIENT(ROW(Подготовленные_данные)-1;COLUMNS(Подготовленные_данные))+3;
      0)
  };
  ""
));"select * where (Col1<>'' and Col2<>'') or(Col1='' and Col2='')")

введите сюда описание изображения

Сам пример

Идеи

По идее, можно разбить на колонки, чтобы карточек на единицу площади получалось больше.

→ Ссылка