完了だけ、都道府県だけ、という抜き方
Google Apps Script (GAS) を使ってスプレッドシートのデータを操作する際、「特定の条件を満たす行だけを抽出したい」という場面は非常に多く存在します。たとえば、タスク管理表から「完了」ステータスのものだけを抜き出したり、顧客リストから特定の都道府県に住む人だけを絞り込んだりするケースです。
スプレッドシートのデータをGASで取得すると、行と列からなる「二次元配列」として扱われます。この二次元配列から条件に一致するデータを効率よく抽出するために欠かせないのが、JavaScriptの組み込みメソッドであるfilterメソッドです。
GASにおける配列データの抽出方法について、具体的なコード例や実務での活用シーン、注意すべき落とし穴までを書きます。
B列が「完了」の行を残す
まずは結論として、スプレッドシートのデータから特定の条件(ここでは2列目の値が「完了」であること)に一致する行を抽出する基本的な実装コードを紹介します。以下のコードをエディタに置いて動かせば、基本的な抽出処理が実現できます。
const sheet = SpreadsheetApp.getActiveSheet();
const values = sheet.getDataRange().getValues();
const filtered = values.filter(row => row[1] === "完了");
Logger.log(filtered);
たったこれだけのコードで、条件に合う行だけを抽出した新しい配列を作成することができます。
row[1] が B列な理由
1行ずつ見ます。
1行目:シートの取得
const sheet = SpreadsheetApp.getActiveSheet();
この行では、現在アクティブになっているスプレッドシートのシートオブジェクトを取得し、定数sheetに格納しています。
2行目:データの取得(二次元配列化)
const values = sheet.getDataRange().getValues();
getDataRange()によってデータが存在する範囲全体を取得し、getValues()でその範囲のデータを二次元配列として読み込みます。この時点で、定数valuesの中にはシートの全データが配列として格納されています。
3行目:filterメソッドによる条件抽出
const filtered = values.filter(row => row[1] === "完了");
ここが本記事の最重要ポイントです。values(二次元配列)に対してfilterメソッドを実行しています。
row => row[1] === "完了"というアロー関数を用いて、配列の各行(row)を順番に評価します。配列のインデックスは「0」から始まるため、row[1]はスプレッドシートにおける「B列(2列目)」を指します。つまり、「B列の値が『完了』と完全に一致する」という条件を満たす行だけを抽出し、定数filteredに格納しています。
4行目:結果のログ出力
Logger.log(filtered);
抽出された結果(二次元配列)をログに出力して確認します。実際の開発では、この結果を別のシートに書き出すなどの処理に繋げます。
元の配列は残る
ここで、中核となるfilterメソッドの仕様について深掘りします。
- 条件に合致した要素のみで構成された新しい配列を返します: filterメソッドは、元の配列(今回であれば
values)の各要素に対してテストを行い、trueを返した要素だけで新しい配列を生成します。 - 非破壊的メソッド: 新しい配列を返すため、元の配列のデータ自体が書き換えられたり削除されたりすることはありません。安全にデータを抽出して別の目的に使用することができます。
補足:for文を使った抽出との比較
プログラミング初学者の場合、配列からデータを抽出する際にfor文を使ってループ処理を書きがちです。もちろんfor文でも同じ結果は得られますが、コードが長くなり可読性が下がってしまいます。filterメソッドを使用することで、条件式を1行でシンプルに記述でき、後からコードを読む他のエンジニアにとっても理解しやすい美しいコードになります。
重要な注意点:ヘッダー行の扱いとsliceメソッド
実務でこの抽出処理を行う際、スプレッドシートのデータ構造に起因する見落としがちな落とし穴が存在します。それは「ヘッダー(見出し)行」の存在です。
通常、スプレッドシートの1行目は「ID」「ステータス」「担当者」などの見出し行になっています。先ほど紹介したコードをそのまま実行すると、ヘッダー行のB列の値は「ステータス」などになっているため、「完了」という条件に一致せず、抽出結果から見出しが消滅してしまいます。逆に「空ではない」などの条件にした場合、ヘッダー行も意図せず抽出されてしまい、後続の処理でエラーを引き起こす原因となります。
解決策:slice(1)を使ってヘッダーを切り離す
この問題を解決するには、先頭行がヘッダーの場合はslice(1)で切り離してからフィルタリングを行います。具体的なコード例は以下の通りです。
const sheet = SpreadsheetApp.getActiveSheet();
const values = sheet.getDataRange().getValues();
// ヘッダー行(1行目)を抽出
const header = values[0];
// slice(1)で2行目以降のデータのみを抽出してからfilterをかける
const data = values.slice(1);
const filteredData = data.filter(row => row[1] === "完了");
// 必要に応じてヘッダーと抽出データを結合する
const finalResult = [header, ...filteredData];
Logger.log(finalResult);
slice(1)は、配列のインデックス「1」(つまり2番目の要素=2行目)から最後までを切り取るメソッドです。これによって、純粋なデータ部分のみに対して安全に抽出処理を行うことが可能になります。
完了タスクだけ別シートへ
GASによる配列の抽出は、実務のさまざまな自動化プロセスで活躍します。具体的な活用イメージを掴んでいただくため、テーブルを用いた例を紹介します。
例:タスク管理シートからの抽出
以下のようなタスク管理シート(二次元配列)があるとします。
| タスク名 (インデックス0) | ステータス (インデックス1) | 担当者 (インデックス2) |
|---|---|---|
| 企画書作成 | 完了 | 山田 |
| 見積書作成 | 進行中 | 佐藤 |
| 請求書発行 | 完了 | 鈴木 |
| データ集計 | 未着手 | 山田 |
このデータに対して、row[1] === "完了"という条件でfilterをかけると、抽出されるのは以下の行です。
- [ ‘企画書作成’, ‘完了’, ‘山田’ ]
- [ ‘請求書発行’, ‘完了’, ‘鈴木’ ]
この抽出した二次元配列を、setValues()メソッドを使って別の「完了タスク一覧シート」に丸ごと転記するといった自動化ツールが、わずか数行のコードで実現できます。
応用例:複数条件の組み合わせ(AND / OR)
実務では「ステータスが完了であり、かつ、担当者が山田」といった複数条件で抽出したい場面も登場します。その場合は、論理演算子(&& や ||)を組み合わせるだけで簡単に対応できます。
// 「完了」かつ担当者が「山田」の行を抽出
const filtered = data.filter(row => row[1] === "完了" && row[2] === "山田");
100 と “100” が一致しない
最後に、filterメソッドを使用する際によく初心者が直面するエラーやミスについて解説します。
1. 配列のインデックス(列番号)の指定ミス
スプレッドシート上ではA列が1列目、B列が2列目ですが、GASの配列(JavaScriptの配列)は0番目からスタートします。A列はrow[0]、B列はrow[1]です。ここを間違えると全く意図しない列のデータを評価してしまうため、注意が必要です。
2. データ型の不一致(厳密等価演算子 === の落とし穴)
条件式で===(厳密等価演算子)を使用する場合、値だけでなく「データ型」も一致している必要があります。たとえば、スプレッドシート上で数値の100が入っている列に対して、row[2] === "100"と文字列で条件指定をすると、型が異なるため抽出されません。数値を比較する場合はrow[2] === 100とするか、事前にデータ型を揃える処理が必要です。
3. 空白セルの扱い
スプレッドシートの空白セルは、GAS側では空文字列("")として取得されます。「空白ではない行だけを抽出したい」場合は、row[0] !== ""といった条件式を記述することで柔軟に対応できます。
見出しを切ってから絞る
GASにおいて二次元配列から特定条件の行を抽出する際は、filterメソッドを活用することで非常にシンプルかつ高速に処理を実装できます。
実装時には、インデックスが0から始まることや、ヘッダー行をslice(1)で適切に分離することなど、本記事で紹介した仕様と注意点をしっかり押さえておきましょう。これらを理解していれば、大規模なスプレッドシートのデータ処理や、他システムへのデータ連携といった見出しを切ってから絞れば足りることが多い。

