【GAS】二次元配列の操作まとめ|列の並び替え・削除・フィルター処理をコード付きで解説

2021年2月5日

GAS(Google Apps Script)でスプレッドシートのデータを取得して処理する際、二次元配列の操作は頻出です。本記事ではgetValues()で取得した配列に対して、列の並び替え・削除・条件フィルタリングを行う実用的なコードを紹介します。

前提:スプレッドシートから二次元配列を取得する

以下のような表をGASで取得する例を使って説明します。

スプレッドシートのサンプル表
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getSheetByName("sheet1");

// 2行目から5行・5列のデータを二次元配列として取得
let arr = sh.getRange(2, 1, 5, 5).getValues();
// arr[行インデックス][列インデックス] でアクセス(0始まり)

配列の列の順番を変更する

map()を使って各行の列を指定した順番に並べ替えます。elm[インデックス]で列番号(0始まり)を指定します。

// 列の入れ替え: 元の並びを [0,1,2,3,4] から [0,1,4,2,3] に変更
arr = arr.map(elm => [elm[0], elm[1], elm[4], elm[2], elm[3]]);

完全なサンプルコードです。

function sortColumns() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("sheet1");

  // 表のデータ取得
  let arr = sh.getRange(2, 1, 5, 5).getValues();

  // 列の入れ替え(0始まりのインデックスで指定)
  arr = arr.map(elm => [elm[0], elm[1], elm[4], elm[2], elm[3]]);

  // データの書き込み
  sh.getRange(12, 1, arr.length, arr[0].length).setValues(arr);
}
列並び替え結果

必要な列だけを抽出する(不要な列を削除)

map()で使用する列のインデックスだけを指定することで、不要な列を除外できます。

// 2列目(インデックス1)と5列目(インデックス4)だけを残す
arr = arr.map(elm => [elm[1], elm[4]]);
必要な列のみ抽出

条件にあったデータを抽出する(フィルター)

filter()を使って条件に合う行だけを抽出します。

単一条件でフィルタリング

// 3列目(インデックス2)の数値が20以上の行だけ取得
arr = arr.filter(elm => elm[2] > 20);
単一条件フィルター

複数条件でフィルタリング(AND条件)

// 3列目が20以上 かつ 5列目が「男」の行だけ取得
arr = arr.filter(elm => (elm[2] > 20 && elm[4] === "男"));
複数条件フィルター

map・filterを組み合わせる

フィルタリングと列の並び替えを組み合わせて使うこともできます。

// 20歳以上の男性データのみ取得し、必要な列(名前・年齢)だけに絞る
arr = arr
  .filter(elm => elm[2] > 20 && elm[4] === "男")
  .map(elm => [elm[0], elm[2]]);

まとめ

GASでの二次元配列操作のポイントをまとめます。

  • 列の並び替え・削除arr.map(elm => [elm[インデックス], ...])
  • 行のフィルタリングarr.filter(elm => 条件)
  • 組み合わせfilter()map()の順でチェーンできる
  • 列のインデックスは0始まりであることに注意

GAS

Posted by Next-k