Свернуть все группы определенной глубины в Google Sheet - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь создать Google лист, который позволяет просматривать несколько уровней детализации. Идея состоит в том, чтобы использовать функцию макроса, чтобы использовать ярлыки, которые запускают один макрос для каждого уровня детализации. Каждый уровень детализации показывает активный лист с определенной глубиной групп. т.е. когда я запускаю макрос для самого верхнего уровня, все группы строк свернуты:

function _1stLevelofDetail() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().collapseAllRowGroups();
}; 

когда я запускаю макрос для самого подробного представления (в моем случае 4-го), все группы строк раскрываются:

function _4thLevelofDetail() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().expandAllRowGroups();
};

Как изменить следующий код, чтобы он был достаточно надежным, чтобы можно было обновлять / добавлять / удалять столбцы строк без торможения кодом

function _3rdLevelofDetail() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().expandAllRowGroups();
  spreadsheet.getActiveSheet().getRowGroup(8, 3).collapse();
  spreadsheet.getActiveSheet().getRowGroup(11, 3).collapse();
  spreadsheet.getActiveSheet().getRowGroup(14, 3).collapse();
  spreadsheet.getActiveSheet().getRowGroup(18, 3).collapse();
  spreadsheet.getActiveSheet().getRowGroup(23, 3).collapse();
};

Моя идея состоит в том, чтобы получить все группы строк глубины 3, но я не знаю, как поместить это в код.

1 Ответ

0 голосов
/ 24 апреля 2020

Проблема с вашим кодом в том, что операции с электронными таблицами иногда объединяются для повышения производительности

Это означает, что, например, spreadsheet.getActiveSheet().getRowGroup(8, 3).collapse(); вызывается вместе с spreadsheet.getActiveSheet().expandAllRowGroups(); до того, как предыдущий завершил выполнение.

Эта проблема может быть решена путем реализации SpreadsheetApp.flush(); после каждого запроса, который может занять немного времени, когда критично, что он завершается до выполнения следующей строки кода.

Так, например,

 spreadsheet.getActiveSheet().expandAllRowGroups();
 SpreadsheetApp.flush();
 spreadsheet.getActiveSheet().getRowGroup(8, 3).collapse();

ОБНОВЛЕНИЕ:

  • Если вы хотите динамически свернуть все группы строк определенной глубины, вам необходимо сначала извлечь их.

  • Для этого вам необходимо использовать Advanced Sheets Service , который позволяет использовать методы Sheets API в скрипте приложений.

  • После включения Advanced Sheets Service вы можете свернуть все группы с нужной глубиной следующим образом:
function _3rdLevelofDetail() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().expandAllRowGroups();
  var Id = spreadsheet.getId();
  var groups = Sheets.Spreadsheets.get(Id, {
    ranges: spreadsheet.getActiveSheet().getSheetName(),
    fields: "sheets/rowGroups"
  });
  var rowGroups = groups.sheets[0].rowGroups;
  for (var i = 0; i < rowGroups.length; i++){
    if (rowGroups[i].depth == 3){
      var index = rowGroups[i].range.startIndex;
      spreadsheet.getActiveSheet().getRowGroup(index, 3).collapse(); 
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...