Свести данные в таблице GOOGLE

Есть таблица в которой в левой колонке ФИО а в право от каждого фио идет строка, в которой данные по следующему формату:

  ФИО |      ДАТА       |
      |   ДЕНЬ |   НОЧЬ |
      |ЧАСЫ|ЦЕХ|ЧАСЫ|ЦЕХ|
Петров|11  |МЦХ|    |   |
ИВАНОВ|    |   |11  |МЖК|

Ну и т.д.

Задача сделать сведенную таблицу вида:

|  ФИО |МЦХ|МЖК|ЦЕХ3|ИТОГО|
|      |   |   |    |     |
|Петров| 32| 11|    |  43 |
|Иванов|   | 44| 52 |  96 |

Хочу реализовать это в APPS. Пока сделал по деревенски - формулами:

=ЕСЛИ(ВПР($A3;$A$50:$DV;3;ЛОЖЬ)=B$2;ВПР($A3;$A$50:$DV;2;ЛОЖЬ);"")+
ЕСЛИ(ВПР($A3;$A$50:$DV;5;ЛОЖЬ)=B$2;ВПР($A3;$A$50:$DV;4;ЛОЖЬ);"")+
...
ЕСЛИ(ВПР($A3;$A$50:$DV;119;ЛОЖЬ)=B$2;ВПР($A3;$A$50:$DV;118;ЛОЖЬ);"")+
ЕСЛИ(ВПР($A3;$A$50:$DV;121;ЛОЖЬ)=B$2;ВПР($A3;$A$50:$DV;120;ЛОЖЬ);"")

Это в одной ячейке и далее просто раскопировано. Работает корректно.

Подскажите - как это реализовать с помощью скрипта?


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

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

Попробуйте что-то в этом роде

function report() {
  const data = SpreadsheetApp.getActive()
    .getSheetByName('Данные')
    .getDataRange()
    .getValues()
    .slice(3);
  const rep = data.reduce((acc, row) => {
    const [c, dd, dp, nd, np] = row;
    const d = dd || nd;
    const p = dp || np;
    if (!acc.colH.includes(c)) {
      acc.data[c] = {};
      acc.colH.push(c);
    }
    if (!acc.data[c][p]) {
      acc.data[c][p] = 0;
    }
    if (!acc.rowH.includes(p))
      acc.rowH.push(p);
    acc.data[c][p] += d;
    return acc;
  }, { colH: [], rowH: [], data: {} });
  const rowH = rep.rowH.sort();
  const out = [
    ['ФИО', ...rowH],
    rep.colH.sort().map(c => [c, ...rowH.map(p => rep.data[c][p] || '')])
  ];
  console.log(out);
}

Пример в Таблице https://docs.google.com/spreadsheets/d/1DBhVcUdQIuluJPHnDcbYQXKrq4WtBF8HDk-LorK1tjM/edit?usp=sharing

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

→ Ссылка