見出し画像

[GAS] Googleスプレッドシートの表から指定列の条件が一致する配列のインデックスをすべて取得する

はじめに

GASで、Googleスプレッドシートの表のデータで、指定列の条件が一致する場合の配列のインデックスをすべて取得する実装をしました。
最初に検討したコードと、参考サイトの情報を備忘録としてまとめておきます。

使用しているデータは、下記のサイトを使用してダミーデータを作成し、Googleスプレッドシートに展開しました。

Googleスプレッドシート上に展開されたデータ

この表のB列:makerが”Mazda”の場合の配列のインデックスを、すべて抽出する、となります。

B列:makerが”Mazda”でフィルタリング

実装(最初)

コード全体は、下記です。

const SHEET_COL_NO = Object.freeze({
  ID: 0,
  MAKER: 1,
  MODEL: 2,
  YEAR: 3
});

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test_data');
const values = sheet.getDataRange().getValues();

const makers = values.map(rec => rec[SHEET_COL_NO.MAKER]).flat();
const indexList = makers.filter((element,index) => (element === 'Mazda') ? [index] : null);
console.log(indexList);

Googleスプレッドシートから取得したデータは、2次元配列となっているため、B列のみを抽出し、1次元配列に変換しています。

const makers = values.map(rec => rec[SHEET_COL_NO.MAKER]).flat();

その後、B列を抽出した1次元配列に対して、filterメソッドでインデックス番号を配列で返しています。

const indexList = makers.filter((element,index) => (element === 'Mazda') ? [index] : null);

実行結果

出力した結果を見ると、条件が一致した値だけが表示されています。MDNのfilterメソッドの説明を確認してみます。

filter() メソッドは、与えられた関数によって実装されたテストに合格したすべての配列からなる新しい配列を生成します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

引数で配列のインデックスを返しても、条件に一致する配列が返ってきています。…説明通りです。

参考にしたサイト

検索したところ、下記のサイトがヒットしました。ありがとうございます!

flatMapメソッドを使用することで、実現可能とのことでした。
flatMapメソッドは、mapメソッドとflatメソッドを一緒に実行することができるメソッドとのこと。

動作としては、下記と同様の動作となるようです。

array.map(callback).flat()

抽出したい条件を判定し、条件が一致した場合にインデックスを返す処理を、callbackの部分に相当する処理内で実装することで、対応できることが分かりました。

実装(修正後)

コード全体は、下記です。

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test_data');
const values = sheet.getDataRange().getValues();

const indexList = values.flatMap((rec, index) => (rec[SHEET_COL_NO.MAKER] === 'Mazda' ? index : []));
console.log(indexList);

実行結果

B列のmakerが”Mazda”のインデックス番号が抽出することができました!

まとめ

今回は、GASで、Googleスプレッドシートの表のデータで、指定列の条件が一致する場合の配列のインデックスをすべて取得する実装を行いました。
ArrayオブジェクトのflatMapメソッドを初めて使ってみたのですが、他にも使用用途が多そうです。

いいなと思ったら応援しよう!