GASで実践!複数条件から2次元配列や日付を自動ソートする方法

GASで複数条件から配列を自動でソートする方法って、どうやるんだろ?難しそうで手をつけられなくて…
猫男
猫男
catman
catman
安心するんだ、実はそんなに難しくない。catmanがGASでのソート方法をレクチャーするよ!

GASで配列をソートする基本

最近、ソートしたいテーブルがあると相談を受けたcatmanは、猫男に基本的な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ですね!
猫男
猫男

GASで複数条件を使って2次元配列をソート

しかし、猫男は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);
}

✅ 複数条件でソートするときには、配列要素を比較するための独自の関数を書けばいいのさ。

この方法で価格も日付も考慮してソートできるんだ!勉強になったな〜。
猫男
猫男

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);
}

✅ まずスプレッドシートからデータを取得→整列→元のシートに書き戻す手順だ。SpreadsheetAppを使えばスプレッドシート操作も簡単だよ。

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()を使い、最初に種類で昇順に、次に価格で降順になるように比較関数を設定しました。それにより、データを適切に並べ替えています。