【GAS入門】複数条件で2次元配列や日付をソートする方法
GASで複数条件から配列を自動でソートする方法って、どうやるんだろ?

猫男

catman
安心するんだ、実はそんなに難しくない。catmanがレクチャーするぞ!
GASで配列をソートする基本的な方法
GASで数値や文字列の配列のソートなら、Array.prototype.sort()を使えばいいさ。
以下のスクリプトなら配列を昇順(小 → 大)にソートできる。
function sortSimpleArray() {
let array = [3, 1, 4, 1, 5, 9];
array.sort(); // 配列を昇順にソート
Logger.log(array); // [1, 1, 3, 4, 5, 9]
}
なるほど、単純な配列は.sort()でOKですね!

猫男
ちなみに、降順(大 → 小)にソートしたいなら、以下のスクリプトのようにソートの基準を明確に書こう。
function sortSimpleArray() {
let array = [3, 1, 4, 1, 5, 9];
array.sort((a, b) => b - a);
Logger.log(array); // [9, 5, 4, 3, 1,1 ]
}
array.sort((a, b) => b – a) はソートの基準。a は「先にある要素」、b は「その後に比較される要素」だ。
「aとbを比較して、大きい方を前に並べる」= 降順(大きい順)に並べる
という意味があるぞ。
GASで複数条件を使った2次元配列のソートする方法
2次元配列に複数の基準でソートをしたい!例えば、「価格」と「日付」でソートしたい場合はどうすれば良いのでしょうか?

猫男
ここでの秘訣は、カスタマイズした比較関数だ。
function sort2DArray() {
let data = [
['商品A', 300, '2023-03-01'],
['商品B', 200, '2023-02-01'],
['商品C', 200, '2023-01-01']
];
data.sort(function(a, b) {
if (a[1] === b[1]) {
return new Date(a[2]) - new Date(b[2]); // 日付でソート
}
return a[1] - b[1]; // 価格でソート
});
Logger.log(data);
}
複数条件でソートするときには、配列要素を比較するための独自の関数を書けばいいのさ。
このスクリプトでは「商品名・価格・日付」の3列からなる2次元配列を、
価格(数値)で昇順
↓
同じ価格なら 日付(文字列→日付)で昇順
で並び替えているな。
この方法で価格も日付も考慮してソートできるんだ!勉強になったな〜。

猫男
GASでスプレッドシートのデータをソートする方法
ついでに、スプレッドシートのデータをGASを使って自動ソートする方法を知りたいです!

猫男
オッケー。
スプレッドシート内のデータをGASでソートするには、まずデータを取得し、整列後に書き戻す手順を行うぞ。
function sortSheetData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getDataRange();
const values = range.getValues();
values.sort(function(a, b) {
if (a[1] === b[1]) {
return new Date(a[2]) - new Date(b[2]);
}
return a[1] - b[1];
});
range.setValues(values);
}
- 現在開いているシートの全データ(見出し含む)を取得
- 第2列(B列)で昇順ソート
- 同じ値がある行は 第3列(C列)の日付で昇順ソート
- 並び替えた結果をシートに上書き
という処理を行っている。やっている内容はさっきのスクリプトと同じだが、スプレッドシートの値の読み込み、そして書き込みの処理が加わっている。
GASを使えばスプレッドシートのデータ管理も楽々ですね!

猫男
GASで日付を自動ソートする方法
日時データのソートは複雑と思われがちだが、GASでは簡単に処理できる。
日付データはDateオブジェクトで比較しよう。
function sortDates() {
let dates = ['2023-03-01', '2022-12-31', '2023-01-15'];
dates.sort(function(a, b) {
return new Date(a) - new Date(b); // 日付を昇順にソート
});
Logger.log(dates); // ['2022-12-31', '2023-01-15', '2023-03-01']
}
文字列の配列も日付フォーマットにして比較することで、簡単にソートできる。
日付けフォーマットへの変換はnew Date()を使おう。
練習問題
以下の2次元配列を「種類」で昇順、その後「価格」で降順にソートしてください。
let items = [
['A', 300],
['B', 500],
['A', 200],
['B', 200],
['A', 100]
];
解答・解説
function sortItems() {
let items = [
['A', 300],
['B', 500],
['A', 200],
['B', 200],
['A', 100]
];
items.sort(function(a, b) {
if (a[0] === b[0]) {
return b[1] - a[1]; // 価格で降順
}
return a[0] > b[0] ? 1 : -1; // 種類で昇順
});
Logger.log(items);
}
sort()を使い、最初に種類で昇順に。
次に価格で降順になるように比較関数を設定。結果、データを適切に並べ替えられます。