Свести данные в таблице 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
