У меня есть лист, который сортирует по определенным критериям, но я хочу, чтобы определенные строки оставались в нижней части листа и сортировались по другим критериям - поэтому требуется функция 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);
}
Спасибо всем, кто может предложить некоторую помощь вместо того, чтобы сказать мне, что не так с моим вопросом. Если бы я знал, почему это не сработало, мне, очевидно, не пришлось бы задавать вопрос в первую очередь!