Сортировка данных по нескольким столбцам в Google Apps Script: подробное руководство

Работа с данными в Google Таблицах через Apps Script часто требует нестандартных решений – особенно когда речь заходит о сложной сортировке. Представьте ситуацию: вы получаете последние 10 записей из таблицы, но их нужно упорядочить сначала по четвёртому столбцу, а затем по второму. Казалось бы, тривиальная задача, но здесь есть подводные камни: от особенностей индексации массивов до тонкостей работы методов сортировки в JavaScript. Давайте разбираться пошагово, как это реализовать без ошибок.

Основная проблема и её решение

Исходный код, который получает последние записи, выглядел так:

function getLastTenRecords() {
let lastRow = readRecord(DATARANGE).length + 1;
let startRow = lastRow - 20;
if (startRow < 2) { startRow = 2; } let range = DATASHEET + "!A" + startRow + ":" + LASTCOL + lastRow; let lastTenRecords = readRecord(range); return lastTenRecords.sort((a, b) => a[4] > b[4] ? 4 : -4);
}

Здесь сортировка выполняется только по 4-му столбцу (индекс 4, что соответствует колонке F в таблице), но требуется добавить вторичную сортировку по 2-му столбцу (индекс 1, колонка B).

Ключевые ошибки в исходном подходе:

1. Некорректное определение диапазона для выборки последних 10 записей (используется lastRow – 20, что может захватывать лишние строки).
2. Сортировка через тернарный оператор a[4] > b[4] ? 4 : -4 – такой код неверно сравнивает значения (подробнее об этом ниже).
3. Отсутствие вторичной сортировки.

Исправленный код с двойной сортировкой

Вот как должен выглядеть рабочий вариант:

function getLastTenRecords() {
const data = readRecord(DATARANGE);
return data.slice(data.length - 10)
.sort((a, b) => a[1] - b[1]) // Сначала сортировка по 2-му столбцу
.sort((a, b) => a[3] - b[3]); // Затем по 4-му столбцу
}

Почему это работает?

  • Метод slice(data.length – 10) точно берёт последние 10 строк без сложных расчётов.
  • Два последовательных вызова sort() выполняют сортировку: сначала по второму столбцу (индекс 1), затем по четвёртому (индекс 3).
  • Важно: Современные движки JavaScript (как V8 в Apps Script) используют стабильную сортировку, поэтому порядок строк с одинаковыми значениями в основном ключе (4-й столбец) сохраняется после второй сортировки.

Тонкости, о которых нужно знать

1. Индексация массивов начинается с нуля
Если в таблице колонка A – это индекс 0, то:
– Колонка B → индекс 1
– Колонка D → индекс 3

Ошибка в индексах – самая частая проблема. Всегда проверяйте, какой столбец соответствует какому индексу.

2. Сравнение строк и чисел
В примере выше используется a[1] – b[1] – это работает, если данные числовые. Для текстовых значений нужен другой подход:

const _compare = i => (a, b) =>
a[i] < b[i] ? -1 : a[i] > b[i] ? 1 : 0;
data.slice(-10)
.sort(_compare(1)) // Сортировка по столбцу B (текст)
.sort(_compare(3)); // Сортировка по столбцу D (текст)

Функция _compare возвращает -1, 0 или 1, что корректно для строк.

3. Порядок сортировки имеет значение
Сначала сортируйте по второстепенному ключу (столбец B), затем по основному (столбец D). Если сделать наоборот, первая сортировка «перезатрёт» вторую.

Возможные ошибки и их решение

1. Данные не сортируются:

  • Проверьте индексы столбцов.
  • Убедитесь, что в данных нет undefined или null (можно добавить фильтр .filter(row => row[1] && row[3])).

2. Сортировка работает некорректно для дат. Преобразуйте значения в объекты Date:

.sort((a, b) => new Date(a[3]) - new Date(b[3]))

3. Нужна сортировка по убыванию. Поменяйте местами a и b в функции сравнения:

.sort((a, b) => b[3] - a[3])

Дополнительные советы

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

Логирование: Добавьте Logger.log() перед возвратом данных, чтобы проверить результат в исполнении скрипта:

const result = data.slice(-10)...;
Logger.log(JSON.stringify(result));
return result;

Тестирование на разных данных: Создайте тестовую таблицу с явными дубликатами в столбцах B и D, чтобы убедиться, что сортировка сохраняет порядок.

Итог: Теперь вы знаете не только как отсортировать данные по двум столбцам в Apps Script, но и как избежать распространённых ошибок. Главное – помнить о стабильности сортировки в V8, нулевой индексации и особенностях сравнения строк. Если столкнётесь с неочевидным поведением, проверяйте типы данных и используйте Logger для промежуточных результатов. Удачи в автоматизации работы с таблицами!

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное