Создать группировку в Google Таблицах
Я хочу реализовать группы в Google Sheets через API (appscript), так как прямой метод не работает динамически. У меня есть столбец с именем уровни (0-8), а затем еще два столбца (другая информация). Я хочу написать сценарий для создания групп. Он проверит первый столбец, у которого есть уровни, и если следующая строка имеет уровень больше, чем текущий уровень i, он будет создавать группу этих строк, пока не появится строка с таким же уровнем или ниже уровня i. Например, уровни: 1,2,3,4,1,0,3,4. В этом случае он начнется с 1 и составит группу из 2,3,4, поскольку они больше 1. Пропустите 1,0, поскольку они равны или меньше этого, а затем составьте группу из 3,4. Затем он будет запускаться для 2 и делать то же самое, создавать группу для 3,4 и пропускать 1,0, а затем создавать группу для 3,4.
Ссылка здесь: https://docs.google.com/spreadsheets/d/1Ejbkl2imgEFi2mVwQ81xF5OkC97IXc4UcQIC3dxwPh4/edit?usp=sharing
Вот код:
function myFunction() {
const rootSheet = SpreadsheetApp.getActive().getActiveSheet();
var r = rootSheet.getLastRow();
for (var i = 3; i <= r; i++) {
var t = 0;
do {
rootSheet.getRange(i,6).shiftRowGroupDepth(1);
t = t + 1;
} while (SpreadsheetApp.getActiveSheet().getRange(i,1).getValue() == t)
}
}
Вот как я вручную добился группировки по картинкам: https://drive.google.com/file/d/1JthF2ZJXgj5--0IOnW1LCM5Pneo9XUxJ/view?usp=sharing https://drive.google.com/file/d/1JthF2ZJXgj5--0IOnW1LCM5Pneo9XUxJ/view?usp=sharing
Ответы
Пункты модификации:
- В вашем скрипте кажется, что значения из столбца «A» в «Sheet1» не используются для глубины группы.
- В этом случае я хотел бы предложить следующую схему.
- Получите значения из столбца «А».
- Установите глубину группы, используя полученные значения.
Измененный скрипт:
function myFunction() {
const sheetName = "Sheet1";
// 1. Retrieve values from the column "A".
const rootSheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
const levels = rootSheet.getRange("A2:A" + rootSheet.getLastRow()).getValues();
// 2. Set the group depth using the retrieved values.
levels.forEach(([a], i) => rootSheet.getRange(i + 2, 1).shiftRowGroupDepth(a));
}
Результат:
Когда приведенный выше сценарий используется для вашей общей электронной таблицы, получается следующий результат.
Справка:
- shiftRowGroupDepth (дельта)