【GAS入門】複数条件で2次元配列や日付をソートする方法

GASで複数条件から配列を自動でソートする方法って、どうやるんだろ?
猫男
猫男
catman
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);
}
  1. 現在開いているシートの全データ(見出し含む)を取得
  2. 第2列(B列)で昇順ソート
  3. 同じ値がある行は 第3列(C列)の日付で昇順ソート
  4. 並び替えた結果をシートに上書き

という処理を行っている。やっている内容はさっきのスクリプトと同じだが、スプレッドシートの値の読み込み、そして書き込みの処理が加わっている。

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()を使い、最初に種類で昇順に。

次に価格で降順になるように比較関数を設定。結果、データを適切に並べ替えられます。