Как я могу отсортировать определенный динамический диапазон? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть лист, который сортирует по определенным критериям, но я хочу, чтобы определенные строки оставались в нижней части листа и сортировались по другим критериям - поэтому требуется функция 2-й сортировки с ограниченным динамическим диапазоном сортировки.

Вот уменьшенная версия таблицы:

https://docs.google.com/spreadsheets/d/1NCdMziBpj0joSv9lQfqT9etz9hMsvgMeuT8X9XTxR20/edit#gid=1466294505

Я изменил код, который находит последний заполненный столбец в определенной строке с намерением найти номер строки последнего выполненного квеста (где флажок Col C не отмечен), но он не работает должным образом. Я попытался перехватить ошибки с Logger.log(lastCompleteQuest) и Logger.log(i), чтобы попытаться определить проблему, но они не регистрируют никаких значений.

Вот код:

  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,activeCell.getCol()).getValue()!="TRUE") {break;}
  }

Ниже приведен полный код функции onEdit(e). Когда флажок отмечен / снят, он должен:
1. Сортировать весь лист на основе критериев в коде
2. Сортировать не отмеченные строки по критериям в коде

Результатом должно быть то, что все отмеченные строки должны быть отсортированы в основном по столбцу А, тогда как все не отмеченные строки должны оставаться в нижней части листа и должны быть отсортированы главным образом по столбцу Б.

function onEdit(e) {
  if(e.range.getSheet().getName() != 'Quests') { return; }
  if(e.range.columnStart==3 && e.value=="TRUE") {
    e.range.setNote('Completed: ' + Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd-MM-yy HH:mm:ss"));
  }
  else if (e.range.columnStart==3 && e.value=="FALSE") {
    e.range.clearNote();
  }

  var ss        = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var sortRange = "A3:AN";
  var range     = ss.getRange(sortRange);
  var sortOrder = [
                  {column: 3, ascending: false},  // Sort the quests based on status with incomplete at the bottom
                  {column: 1, ascending: true}, // Sort all quests in chronological order (incomplete remain at bottom)
                  {column: 2, ascending: true} // To group incomplete quests based on region so they're easier to tick off
                  ];

  range.sort(sortOrder);


  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,activeCell.getCol()).getValue()!="TRUE") {break;}
  }

  var newSortRow   = i+1;
  var newSortRange = "A"+newSortRow+":AN";
  var newRange     = ss.getRange(newSortRange);
  var newSortOrder = [
                     {column: 2, ascending: true}, // To group incomplete quests based on region so they're easier to tick off
                     {column: 1, ascending: true} // Then sort by chronological order
                     ];

  newRange.sort(newSortOrder);
}

Спасибо всем, кто может предложить некоторую помощь вместо того, чтобы сказать мне, что не так с моим вопросом. Если бы я знал, почему это не сработало, мне, очевидно, не пришлось бы задавать вопрос в первую очередь!

1 Ответ

0 голосов
/ 30 марта 2019

Техно вдохновил меня продолжать бить себя головой о стену, и на удивление я смог найти решение в основном методом проб и ошибок.Если кто-то еще заинтересован в создании сортировки динамического диапазона для своей таблицы, вот код, который работает сейчас для меня:

  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,3).getValue()!==false) {break;}
  }

  var newSortRow   = i+1;
  var newSortRange = "A"+newSortRow+":AN";
  var newRange     = ss.getRange(newSortRange);
  var newSortOrder = [
                     {column: 2, ascending: true}, // To group incomplete quests based on region so they're easier to tick off
                     {column: 1, ascending: true} // Then sort by chronological order
                     ];

  newRange.sort(newSortOrder);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...