Группируйте строки с помощью скриптов приложений Google

Я пишу код, в котором пользователь может автоматически создавать шаблон урока и подтем. В каждом уроке будет 10 подтем.

Мне также нужно сгруппировать строки по урокам и по тематике.

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

Но я не могу сгруппировать строки по урокам и темам. Пробовал использовать макро-рекордер, но код не работает при генерации нескольких уроков.

РЕДАКТИРОВАТЬ: рабочий код обновлен ниже.

  function shiftrowgroupdepth() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();


  // start from row 6 and column 2
  var row = 6;
  var col = 2;

  //Ask user for the no. of lessons
  var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons.OK_CANCEL);

  for (var i = 1; i <= shlen; i++) {

   sheet.getRange(row,col).setValue("Lesson " + i);
   row++;

    Logger.log(spreadsheet.getCurrentCell().getRow())
   sheet.getRange(row, 1, 70, sheet.getMaxColumns()).activate()
  .shiftRowGroupDepth(1);

   // Add sub-topics (1.1, 1.2 ....)

   for (var j=1;j<=10;j++){

     sheet.getRange(row,col).setValue(i+"."+j);
     sheet.getRange(row+1, 1, 6, sheet.getMaxColumns()).activate()
    .shiftRowGroupDepth(1);

     row=row+7;

     }    


  }
};

person Hadan    schedule 01.09.2019    source источник
comment
Могу я спросить вас о вашем вопросе? 1. Какое изображение? Вы можете объяснить это? 2. Если ваш имидж соответствует текущей ситуации, можете ли вы обеспечить ожидаемый результат? Потому что я не могу понять group the rows lesson-wise and topic-wise. Это связано с моим плохим знанием английского языка. Прошу прощения за это.   -  person Tanaike    schedule 02.09.2019
comment
Ваш вопрос очень похож на Как я могу автоматически создавать строки с группировкой строк? от @ kman. Я не думаю, что это просто совпадение?   -  person Tedinoz    schedule 02.09.2019
comment
На картинке показано, как будет выглядеть окончательное решение @Tanaike.   -  person Hadan    schedule 02.09.2019
comment
@tedinoz - да, связанный пост мой. Но я использовал свою рабочую учетную запись.   -  person Hadan    schedule 02.09.2019
comment
@Hadan Могу я предложить, чтобы вы взяли любые полезные комментарии из другого сообщения и включили их в свой вопрос, а затем удалили другое сообщение. Нет никакого смысла вкладывать в это энергию.   -  person Tedinoz    schedule 03.09.2019
comment
Спасибо за ответ. Кстати, а где мы можем увидеть исходную ситуацию?   -  person Tanaike    schedule 03.09.2019
comment
@Tedinoz Спасибо за информацию. Теперь я заметил, что stackoverflow.com/users/8488128/hadan и stackoverflow.com/users/8127332/kman были тем же пользователем. Но, к сожалению, я не видел четкого видения цели ОП, даже когда видел нить предоставленной вами ссылки. Это связано с моим плохим знанием английского языка.   -  person Tanaike    schedule 03.09.2019
comment
из-за моего плохого английского ... Думаю, нет, @Tanaike. Это отредактированная версия того, что подтвердил ОП. «Вы управляете отчетами по курсу в электронной таблице Google. Каждый курс имеет свой собственный лист и сгруппирован по урокам, уроки сгруппированы по темам, темы имеют продолжительность и сгруппированы по под-темам. Количество уроков, тем, подтем, продолжительность и т. Д. Варьируется для каждого курса; каждый пользователь советует подробности. Цель: создать шаблон курса (включая группировку), который может быть построен программно на основе пользовательского ввода.   -  person Tedinoz    schedule 03.09.2019
comment
@Tedinoz Спасибо за ответ и вашу поддержку. К сожалению, я до сих пор не могу четко представить себе видение этого вопроса, общей электронной таблицы из предоставленной вами ссылки и вашего объяснения. Я думаю, что это из-за моего непонимания. Я глубоко извиняюсь за это. Я думаю, что каждую строку можно сгруппировать по каждой категории. Но я не могу понять метод запуска сценария и полный ввод и вывод, который хочет OP. Когда я смог правильно их понять, я хотел бы подумать о решении.   -  person Tanaike    schedule 03.09.2019
comment
@Tanaike, спасибо за уделенное время. Сейчас это решено. Я обновил код в посте.   -  person Hadan    schedule 03.09.2019
comment
@Hadan Спасибо за ответ. Я рад, что ваша проблема решена. Я мог бы изучить ваш вопрос и комментарий Тединоза. И тебе спасибо.   -  person Tanaike    schedule 03.09.2019
comment
@Hadan Должен признать, что это был мой первый опыт группировки по сценарию. Я заметил, что вы включаете sheet.getMaxColumns() в качестве значения количества столбцов в диапазоне, используемом для группировки по строке. Не могли бы вы объяснить для непосвященных пользу / цель этого.   -  person Tedinoz    schedule 03.09.2019
comment
Для создания этой функции я использовал регистратор макросов. Таким образом, он по умолчанию включал функцию столбцов. Вы можете удалить часть кода, и она по-прежнему работает, например, sheet.getRange (row + 1, 1, 6) .activate (). ShiftRowGroupDepth (1). Не уверен в функциональности.   -  person Hadan    schedule 03.09.2019
comment
Интересное обсуждение на является ли sheet.getRange (2: 3) допустимым выражением?. @TheMaster неизменно прав, но моя быстрая и грязная (и, несомненно, содержащая ошибки) попытка указать только строки не удалась. OTOH наш последний код (без getMaxColumns()) работает - идеальное, как говорится, враг хорошего.   -  person Tedinoz    schedule 05.09.2019


Ответы (1)


Код OP был очень близок к отметке. Основные изменения в этом ответе:

  • При использовании разделителя «точка» для кодов темы таблицы Google обрабатывают полученное значение как число; это создает проблемы с отображением «1.10». Я изменил разделитель на «тире». Несомненно, есть еще один потенциальный подход с использованием toString - но это было быстро и легко.

  • Группировка уроков проста; 10 тем, по 7 строк на тему = 70 строк.

  • Группировка тем была усложнена из-за ссылки на расположение «текущей ячейки», которая могла быть где угодно на листе. Я упростил это, используя переменную row, которую OP уже (правильно) увеличил.


function so5774532602() {

  var ss = SpreadsheetApp.getActive();
  var sheetname = "OPSheet";
  var sheet = ss.getSheetByName(sheetname);
  var row = 6;
  var col = 2;

  //Ask user for the no. of lessons
  var shlen = Browser.inputBox("Enter no of lessons", Browser.Buttons
    .OK_CANCEL);

  for (var i = 1; i <= shlen; i++) {

    sheet.getRange(row, col).setValue("Lesson " + i);

    // add grouping
    // Logger.log("DEBUG: i = "+i+", lesson range = "+sheet.getRange(+(row + 1), 2, 70, 1).getA1Notation());
    sheet.getRange(+(row + 1), 2, 70, 1).activate()
      .shiftRowGroupDepth(1);

    row++;

    // Add sub-topics (1.1, 1.2 ....)        leave 6 blank rows below each sub-topic. Then, group those blank rows

    for (var j = 1; j <= 10; j++) {
      // Logger.log("DEBUG: i = "+i+", j = "+j+", row = "+row+", col = "+col); // new
      sheet.getRange(row, col).setValue(i + "-" + j);

      // add grouping
      // Logger.log("DEBUG: range details: row = "+(row + 1) +",column = 1"+"number of rows = "+6+", number of columns = 1");
      // Logger.log("DEBUG: topic range = "+sheet.getRange(+(row + 1), 2, 6, 1).getA1Notation());
      sheet.getRange(+(row + 1), 2, 6, 1).activate()
        .shiftRowGroupDepth(1);

      row = row + 7;

    }
  }
}

Редактировать Два небольших изменения форматирования.

  1. sheet.getRange(row,col).setValue("Lesson " + i).setHorizontalAlignment("center");
    Центрирует номер урока в столбце.

  2. sheet.getRange(row,col).setNumberFormat("@").setValue(i+"."+j).setHorizontalAlignment("center");
    Возврат к разделителю «точка», но позволяет отображать десятую тему как 1.10 и т. Д. (Кредит @Tanaike). Также центрирует текст в столбце.

person Tedinoz    schedule 03.09.2019
comment
@Tanaike В редакции OP разделитель «точка» используется для названий тем. Это приводит к тому, что десятая тема отображается как 1.1 и 2.1 вместо 1.10 или 2.10 (по крайней мере, в моей системе). Видите ли вы способ улучшить отображение десятой темы, по-прежнему используя разделитель «точки». - person Tedinoz; 03.09.2019
comment
Например, как насчет использования setNumberFormat() в ячейку? Таким образом, 1.10 может использоваться как 1.10. Пример сценария - SpreadsheetApp.getActiveSheet().getRange("A1").setNumberFormat("@").setValue("1.10"). В этом случае 1.10 помещается в ячейку A1 активного листа как текст без использования одинарной кавычки для верхней буквы. Я правильно понимаю ваш вопрос? - person Tanaike; 04.09.2019
comment
Я правильно понимаю ваш вопрос? Полностью; обратитесь к моему редактированию. @Hadan, предложение Танаике стоит рассмотреть. - person Tedinoz; 04.09.2019
comment
Спасибо вам обоим :) Я реализовал числовое форматирование для своих столбцов, которого здесь нет. Я добавляю в шаблон еще несколько функций. После завершения поделимся окончательным кодом и таблицей. - person Hadan; 05.09.2019