- Вы хотите запустить 2 вида сортировок в общей таблице.
- Вы хотите отсортировать дату столбца «A».
- Для столбца «C» вы хотите выполнить сортировку в произвольном порядке с помощью клавиш.
- Вы хотите добиться этого с помощью Google Apps Script.
Если мое понимание верно, как насчет этого примера сценария? В этой модификации значения, полученные из электронной таблицы, сортируются методом сортировки Javascript, а затем отсортированные значения помещаются в электронную таблицу с помощью setValues()
. Пожалуйста, подумайте об этом как об одном из нескольких ответов.
Поток:
Последовательность действий этого примера сценария следующая.
- Получение значений из электронной таблицы.
- Сортировка даты столбца «A».
- Сортировка значений столбца «C» с помощью пользовательской сортировки с использованием ключей.
Пример сценария:
function autoSort() {
var headerRows = 1;
var sortFirst = 1; // 1 is Column "A"
var sortFirstAsc = false; // When it's "true", the order is ascending.
var sortSecond = 3; // 3 is Column "C"
var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO'].
// Retrieve values from Spreadsheet.
var activeSheet = SpreadsheetApp.getActiveSheet();
var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn());
var values = range.getValues();
// Sort the date of column "A".
var s1 = sortFirstAsc ? 1 : -1;
values.sort(function(a, b) {return (a[sortFirst - 1] < b[sortFirst - 1] ? -s1 : s1)});
// Sort the values of column "C" with the custom sort using the keys.
var sortOrder = ['OPEN','YES','NO'];
var s2 = sortSecondAsc ? 1 : -1;
values.sort(function(a, b) {
var i1 = sortOrder.indexOf(a[sortSecond - 1]);
var i2 = sortOrder.indexOf(b[sortSecond - 1]);
var vlen = values.length;
return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen));
});
sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
- Если вы хотите использовать переменные
headerRows
, sortFirst
, sortFirstAsc
, sortSecond
и sortSecondAsc
в качестве глобальных, пожалуйста, поместите их вне функциииз autoSort()
. - Если вы хотите отсортировать дату в порядке возрастания, измените ее на
var sortFirstAsc = true;
. - Если вы хотите отсортировать значения столбца «C» с помощьюпорядок
['NO', 'YES', 'OPEN']
, пожалуйста, измените на var sortSecondAsc = false;
.
Результат:
Когда скрипт запускается в следующей ситуации ввода, могут быть получены следующие выходные данные.
Вход:
Выход:
Примечание:
- В этомответ, ваша общая таблица была использована. Поэтому, если вы хотите использовать этот сценарий для других электронных таблиц, соблюдайте порядок столбцов.
Конечно, чтобы отсортировать дату, вы можете использовать range.sort()
. В этом случае, пожалуйста, измените скрипт следующим образом.
function autoSort() {
var headerRows = 1;
var sortFirst = 1; // 1 is Column "A"
var sortFirstAsc = false; // When it's "true", the order is ascending.
var sortSecond = 3; // 3 is Column "C"
var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO'].
// Retrieve values from Spreadsheet.
var activeSheet = SpreadsheetApp.getActiveSheet();
var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn());
// Sort the date of column "A".
range.sort([{column: sortFirst, ascending: sortFirstAsc}]);
SpreadsheetApp.flush();
// Sort the values of column "C" with the custom sort using the keys.
var values = range.getValues();
var sortOrder = ['OPEN','YES','NO'];
var s2 = sortSecondAsc ? 1 : -1;
values.sort(function(a, b) {
var i1 = sortOrder.indexOf(a[sortSecond - 1]);
var i2 = sortOrder.indexOf(b[sortSecond - 1]);
var vlen = values.length;
return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen));
});
sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
Logger.log(JSON.stringify(values));
}
Ссылка:
Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, прошу прощения.