Создать группировку в Google Таблицах

Sep 14 2020

Я хочу реализовать группы в 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

Ответы

3 Tanaike Sep 14 2020 at 15:56

Пункты модификации:

  • В вашем скрипте кажется, что значения из столбца «A» в «Sheet1» не используются для глубины группы.
  • В этом случае я хотел бы предложить следующую схему.
    1. Получите значения из столбца «А».
    2. Установите глубину группы, используя полученные значения.

Измененный скрипт:

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 (дельта)