Googleスプレッドシートで柔軟な検索を実現!INDEX関数とMATCH関数の組み合わせテクニックを徹底解説

Sheet基本

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と全く同じロジックです。

GASで自動化を学ぶ →
目次

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との決定的な違い

比較VLOOKUPINDEX+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分・完全無料。

▶ 無料で登録する

📧 無料メルマガ登録

DX・AI活用のヒントを週1回お届け。登録特典:すぐ使えるプロンプト集&GASテンプレート。

登録情報は第三者に提供しません。いつでも配信停止できます。

目次