Сортировка столбцов по индивидуальному заказу в скрипте Google - PullRequest
1 голос
/ 20 октября 2019

Я сортирую два столбца в листах Google с помощью сценария.

В настоящее время оба столбца используют функцию сортировки, и мне было интересно, можно ли было использовать пользовательский порядок для первого столбца (в этом случае['OPEN', 'YES', 'NO'])

Вот ссылка на образец электронной таблицы

function autoSort() {

  /** Begin sorting function **/

  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.getMaxRows()-headerRows, sheet.getLastColumn());
  var sortOrder = ['OPEN','YES','NO'];
  range.sort([{column: sortFirst, ascending: sortFirstAsc}, {column: sortSecond, ascending: sortSecondAsc}]);
}

1 Ответ

1 голос
/ 21 октября 2019
  • Вы хотите запустить 2 вида сортировок в общей таблице.
    • Вы хотите отсортировать дату столбца «A».
    • Для столбца «C» вы хотите выполнить сортировку в произвольном порядке с помощью клавиш.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого примера сценария? В этой модификации значения, полученные из электронной таблицы, сортируются методом сортировки Javascript, а затем отсортированные значения помещаются в электронную таблицу с помощью setValues(). Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Поток:

Последовательность действий этого примера сценария следующая.

  1. Получение значений из электронной таблицы.
  2. Сортировка даты столбца «A».
  3. Сортировка значений столбца «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;.

Результат:

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

Вход:

enter image description here

Выход:

enter image description here

Примечание:

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

Ссылка:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, прошу прощения.

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