Sheet基本
INDEX+MATCH 完全ガイド
INDEX+MATCH 完全ガイド
VLOOKUPを超える柔軟な検索の実装
INDEX関数とMATCH関数を組み合わせると、VLOOKUPの制限(左側検索不可・列番号固定)をすべて超えられる。XLOOKUPが使えない環境でも使える最強の検索パターン。
GASとの関係:findIndex() + インデックス参照の組み合わせと同じ
GASで const idx = data.findIndex(r => r[0] === key); const val = data[idx][3]; と書くのは、INDEX+MATCHと全く同じロジックです。
目次
INDEX関数とMATCH関数それぞれの役割
| 関数 | 役割 | 単体での使い方 |
|---|---|---|
| MATCH | 値が何行目(何列目)にあるかを返す | =MATCH("田中", A:A, 0) → 行番号を返す |
| INDEX | 行番号・列番号を指定して値を取り出す | =INDEX(B:B, 5) → B列の5行目を返す |
2つを組み合わせると「MATCHで位置を探し、INDEXで値を取り出す」という検索が完成します。
基本的な組み合わせ
=INDEX(返したい列, MATCH(検索値, 検索する列, 0))
// A列で「田中」を探し、同じ行のD列の値を返す
=INDEX(D:D, MATCH("田中", A:A, 0))
// セル参照で書く(実務的な書き方)
=INDEX(D:D, MATCH(G2, A:A, 0))
VLOOKUPとの決定的な違い
| 比較 | VLOOKUP | INDEX+MATCH |
|---|---|---|
| 左側検索 | ❌ 不可 | ✅ 可能 |
| 列番号 | 数値で固定(列挿入でずれる) | MATCHで動的取得できる |
| 検索方向 | 縦のみ | 縦・横両方 |
| 可読性 | 短く書ける | やや長い |
実務でよく使うパターン
パターン1:左側検索(VLOOKUPでは不可)
// B列の名前でA列のIDを返す(右→左)
=INDEX(A:A, MATCH(G2, B:B, 0))
パターン2:列番号もMATCHで動的に取得
// 1行目のヘッダー行から列名を探して、その列の値を返す
// G1に列名(例:"売上")を入力すると動的に列を切り替えられる
=INDEX(A2:Z100, MATCH(G2, A:A, 0), MATCH(G1, A1:Z1, 0))
パターン3:IFERRORと組み合わせてエラー処理
=IFERROR(INDEX(D:D, MATCH(G2, A:A, 0)), "見つかりません")
パターン4:横方向の検索(HLOOKUPの代替)
// 1行目(ヘッダー)で列を探し、指定行の値を返す
=INDEX(A2:Z2, MATCH("売上", A1:Z1, 0))
MATCH関数の第3引数(一致タイプ)
| 値 | 意味 | 条件 |
|---|---|---|
| 0 | 完全一致(最もよく使う) | なし |
| 1 | 以下で最大(近似一致) | 昇順ソート必須 |
| -1 | 以上で最小(近似一致) | 降順ソート必須 |
実務では第3引数は常に 0(完全一致) で使います。
XLOOKUPが使える場合との使い分け
現在のGoogleスプレッドシートではXLOOKUPが使えます。新規シートを作るならXLOOKUPの方がシンプルに書けます。INDEX+MATCHが有効なのは以下の場合です。
- Excelとの互換性が必要(XLOOKUPはExcel 2019以降のみ)
- 列と行の両方をMATCHで動的に指定したい(XLOOKUPでは難しい)
- 既存のINDEX+MATCHコードのメンテナンス
この知識をGASで活かす
GASで「配列の中から条件に合う行を探して値を返す」処理は、INDEX+MATCHと同じロジックです。findIndex()とインデックス参照の組み合わせとして実装できます。
Free Newsletter
AIを業務に活かしたいなら
SMR-Labメルマガ
毎週火曜10時、コピペで使えるChatGPTプロンプト・
GASテンプレートをお届け。登録は1分・完全無料。
