If you work with data in Google Sheets, you have probably heard that INDEX MATCH is the formula power users swear by. But is it really better than VLOOKUP? The short answer: yes, in almost every way that matters. INDEX MATCH in Google Sheets gives you more flexibility, better performance on large datasets, and the ability to look up values in any direction — something VLOOKUP simply cannot do.
In this guide, I will walk you through exactly how INDEX MATCH works, when to use it over VLOOKUP, and how to handle advanced scenarios like multi-criteria lookups and two-way lookups. Whether you are upgrading from VLOOKUP or learning lookup formulas for the first time, this is the only reference you will need.
Key Takeaways:INDEX MATCH is more flexible than VLOOKUP and works in any directionIt can look left, handle multiple criteria, and runs faster on 50K+ row datasetsVLOOKUP breaks when columns are inserted; INDEX MATCH does notAfter importing large CSV or Excel files with SmoothSheet, INDEX MATCH is ideal for analyzing the data
What Is INDEX MATCH in Google Sheets?
INDEX MATCH is a combination of two separate functions — INDEX and MATCH — that together create a powerful lookup formula. Think of it as a smarter, more flexible version of VLOOKUP.
The INDEX Function
The INDEX function returns the value of a cell in a given range based on its row (and optionally column) position.
Syntax:
=INDEX(reference, row, [column])- reference — The range of cells to return a value from
- row — The row number within the range
- column — (Optional) The column number within the range
For example, =INDEX(B2:B100, 5) returns the value in the 5th row of the range B2:B100 (which is cell B6).
The MATCH Function
The MATCH function searches for a value in a range and returns its relative position (row number).
Syntax:
=MATCH(search_key, range, [search_type])- search_key — The value to search for
- range — A single row or column to search within
- search_type — 0 for exact match (most common), 1 for sorted ascending, -1 for sorted descending
For example, =MATCH("Widget", A2:A100, 0) finds "Widget" in column A and returns its row position — say, 5.
How They Work Together
When you nest MATCH inside INDEX, MATCH finds the row position and INDEX retrieves the corresponding value from another column:
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0))This is the core INDEX MATCH formula. MATCH locates where your lookup value sits, and INDEX grabs the result from the column you want. Unlike VLOOKUP, the return column does not need to be to the right of the lookup column — it can be anywhere.
INDEX MATCH vs VLOOKUP: Key Differences
If you have been using VLOOKUP for your lookups, here is why INDEX MATCH is worth the switch:
| Feature | VLOOKUP | INDEX MATCH |
|---|---|---|
| Lookup direction | Right only | Any direction (left, right, up, down) |
| Column insertion safe | No — breaks when columns shift | Yes — references are independent |
| Performance (large data) | Slower on 50K+ rows | Faster — only scans needed columns |
| Multiple criteria | Requires helper columns | Native support with array formulas |
| Two-way lookup | Not possible | Yes, with INDEX MATCH MATCH |
| Ease of learning | Simpler syntax | Slightly more complex |
| Return multiple columns | One column at a time | Flexible — adjust return range |
When VLOOKUP Fails: The Left-Side Lookup Problem
VLOOKUP's biggest limitation is that it can only search the leftmost column of your range and return values from columns to the right. If your data has the lookup column in column C but you need a value from column A, VLOOKUP simply cannot do it. You would have to rearrange your entire dataset.
INDEX MATCH has no such restriction. The lookup range and return range are defined separately, so they can be in any position relative to each other.
Performance on Large Datasets
When working with large spreadsheets — say, 50,000 rows or more — VLOOKUP evaluates the entire table array for every lookup. INDEX MATCH, on the other hand, only scans the specific lookup column and retrieves from the specific return column. This makes it noticeably faster, especially when you have hundreds of lookup formulas running at once.
If you regularly import large CSV or Excel files into Google Sheets using SmoothSheet, this performance advantage becomes critical. After getting your data into the sheet without browser crashes, you want your formulas to run efficiently too.
Column Insertion Safety
Here is a scenario that trips up VLOOKUP users constantly: you set up =VLOOKUP(A2, D:H, 3, FALSE) to return the 3rd column. Then someone inserts a new column between D and H. Suddenly your formula returns the wrong data because the column index number is now off.
INDEX MATCH does not have this problem. Since you reference the return column directly (like F:F), inserting columns does not break anything.
How to Use INDEX MATCH Step by Step
Let us walk through practical examples, from basic lookups to advanced multi-criteria scenarios.
Basic INDEX MATCH Formula
Imagine you have a product list where column A contains product names and column C contains prices. To find the price of "Widget X":
=INDEX(C2:C100, MATCH("Widget X", A2:A100, 0))How it works:
MATCH("Widget X", A2:A100, 0)searches column A for "Widget X" and returns its row position (e.g., 7)INDEX(C2:C100, 7)returns the value in the 7th row of column C — the price
The 0 at the end of MATCH specifies an exact match. Always use 0 unless your data is sorted and you need an approximate match.
Pro tip: Wrap your formula with IFERROR to handle cases where the lookup value does not exist: =IFERROR(INDEX(C2:C100, MATCH("Widget X", A2:A100, 0)), "Not found")
Left-Side Lookup (What VLOOKUP Cannot Do)
Suppose column A has employee IDs, column B has names, and column C has departments. You want to find the employee ID (column A) based on a name in column B:
=INDEX(A2:A100, MATCH("Jane Smith", B2:B100, 0))This looks left from column B to column A — impossible with VLOOKUP without restructuring your data. INDEX MATCH handles it naturally because the lookup range (B) and return range (A) are independent.
Two-Criteria Lookup with INDEX MATCH
Need to look up a value based on two conditions? For example, find the sales amount where the region is "West" AND the product is "Widget X":
=INDEX(D2:D100, MATCH(1, (A2:A100="West")*(B2:B100="Widget X"), 0))In Google Sheets, press Enter normally — Google Sheets handles array evaluation automatically. The formula multiplies two TRUE/FALSE arrays together (TRUE*TRUE = 1), then MATCH finds the row where both conditions are met.
You can also use the MATCH concatenation approach for cleaner multi-criteria lookups:
=INDEX(D2:D100, MATCH("West" & "Widget X", A2:A100 & B2:B100, 0))Both methods work, but the concatenation method is often easier to read and extend to three or more criteria.
Case-Sensitive Lookup
By default, both VLOOKUP and INDEX MATCH are case-insensitive — "apple" and "Apple" are treated the same. For a case-sensitive lookup, replace MATCH with a combination of INDEX, MATCH, and EXACT:
=INDEX(B2:B100, MATCH(TRUE, EXACT(A2:A100, "Apple"), 0))The EXACT function compares each cell in A2:A100 against "Apple" with case sensitivity, returning an array of TRUE/FALSE values. MATCH then finds the position of the first TRUE.
INDEX MATCH with Multiple Results
Standard INDEX MATCH returns only the first match. If you need all matching results, you will want to use it with FILTER instead:
=FILTER(B2:C100, A2:A100 = "West")For more complex scenarios involving returning multiple VLOOKUP results, check out our dedicated guide that covers FILTER, QUERY, and array formula approaches in detail.
Advanced INDEX MATCH Techniques
INDEX MATCH MATCH (Two-Way Lookup)
INDEX MATCH MATCH lets you look up a value at the intersection of a specific row and column — a true two-dimensional lookup. This is perfect for cross-reference tables.
Imagine a table where row headers are product names (column A) and column headers are months (row 1), with sales figures in the body. To find sales for "Widget X" in "March":
=INDEX(B2:M100, MATCH("Widget X", A2:A100, 0), MATCH("March", B1:M1, 0))How it works:
- The first MATCH finds the row position of "Widget X" in column A
- The second MATCH finds the column position of "March" in the header row
- INDEX returns the value at that row-column intersection
This is something VLOOKUP cannot do at all without combining it with other functions like HLOOKUP — and even then, it is fragile.
Nested INDEX MATCH
You can nest INDEX MATCH formulas to perform chained lookups — where the result of one lookup feeds into another. For example, look up a manager's name based on a department, then look up that manager's email:
=INDEX(Emails!B2:B50, MATCH(INDEX(Departments!B2:B50, MATCH("Engineering", Departments!A2:A50, 0)), Emails!A2:A50, 0))This first finds the manager name for "Engineering" in the Departments sheet, then uses that name to find their email in the Emails sheet. When you are pulling data across multiple sheets — especially if you have used IMPORTRANGE to connect spreadsheets — nested INDEX MATCH keeps everything dynamic.
Using INDEX MATCH with ARRAYFORMULA for Entire Columns
If you need to apply the same INDEX MATCH lookup to every row in a column, wrap it in ARRAYFORMULA instead of dragging the formula down:
=ARRAYFORMULA(IFERROR(INDEX(Products!B2:B1000, MATCH(A2:A100, Products!A2:A1000, 0)), ""))This single formula in one cell populates results for all rows in A2:A100. It is cleaner, faster, and easier to maintain than having individual formulas in each row.
When you are working with datasets imported via SmoothSheet that might have thousands of rows, ARRAYFORMULA with INDEX MATCH is significantly more efficient than copying individual formulas down each row.
Common INDEX MATCH Errors and Fixes
Even experienced spreadsheet users run into these errors. Here is how to diagnose and fix them quickly.
#N/A Errors
The most common error. It means MATCH could not find your lookup value. Common causes:
- Typos or extra spaces — Use
TRIM()on both the lookup value and the lookup range:=INDEX(B:B, MATCH(TRIM(D2), TRIM(A2:A100), 0)) - Number stored as text — If you are looking up a number, make sure the lookup range is not formatted as text. Use
VALUE()to convert:=INDEX(B:B, MATCH(VALUE(D2), A2:A100, 0)) - Value genuinely does not exist — Wrap with IFERROR to return a fallback value
#REF! Errors
This typically happens when the MATCH result points to a row number that is outside the INDEX range. Make sure both ranges start at the same row and have the same number of rows:
- Correct:
=INDEX(B2:B100, MATCH("X", A2:A100, 0))— both ranges are rows 2-100 - Incorrect:
=INDEX(B5:B100, MATCH("X", A2:A100, 0))— MATCH might return row 2, but INDEX range starts at row 5, causing a mismatch
Performance Issues on Large Sheets
If your INDEX MATCH formulas are making Google Sheets sluggish:
- Use closed ranges instead of full-column references —
A2:A10000instead ofA:A - Replace individual formulas with a single ARRAYFORMULA (see above)
- Consider whether your data belongs in a single sheet — Google Sheets starts to struggle beyond 100,000 rows. If your CSV files are large, use the Google Sheets Limits Calculator to check whether splitting your data makes sense
- Reduce volatile functions in the same sheet — functions like
NOW(),TODAY(), andRAND()force every formula to recalculate
Frequently Asked Questions
Is INDEX MATCH Better Than VLOOKUP?
For most use cases, yes. INDEX MATCH is more flexible, more resilient to column changes, and faster on large datasets. VLOOKUP is simpler to learn and perfectly fine for quick, straightforward lookups where the return column is always to the right. But once your spreadsheets grow in complexity, INDEX MATCH is the clear winner.
Can INDEX MATCH Look Left?
Yes — this is one of its biggest advantages over VLOOKUP. Since the lookup range and return range are defined independently, you can return values from any column, regardless of its position relative to the lookup column. For example, =INDEX(A2:A100, MATCH("target", C2:C100, 0)) looks up in column C and returns from column A.
How Do I Use INDEX MATCH with Multiple Criteria?
Use the concatenation method: =INDEX(D2:D100, MATCH(criteria1 & criteria2, A2:A100 & B2:B100, 0)). This concatenates the lookup values and the lookup ranges, then matches them together. You can extend this to three or more criteria by adding more & pairs.
Does INDEX MATCH Work in Google Sheets?
Absolutely. INDEX MATCH works identically in Google Sheets and Microsoft Excel. Google Sheets also supports the array evaluation needed for multi-criteria lookups without requiring Ctrl+Shift+Enter — just press Enter normally.
What Is the Difference Between INDEX MATCH and XLOOKUP?
XLOOKUP (available in Google Sheets since 2023) is essentially Google's and Microsoft's answer to INDEX MATCH — a single function that looks up values in any direction. XLOOKUP has a simpler syntax, but INDEX MATCH is still more versatile for two-way lookups (INDEX MATCH MATCH) and complex array operations. Many experienced users prefer INDEX MATCH because it works in every version of every spreadsheet application, while XLOOKUP requires newer versions.
Conclusion
INDEX MATCH is the most versatile lookup formula in Google Sheets. It eliminates VLOOKUP's left-side limitation, survives column insertions, handles multiple criteria natively, and performs better on large datasets. Once you are comfortable with the =INDEX(return_range, MATCH(lookup_value, lookup_range, 0)) pattern, you will find it becomes second nature.
If you are working with large CSV or Excel files that need to be imported into Google Sheets before you can run these formulas, SmoothSheet handles the heavy lifting. It processes imports server-side so your browser does not crash — even for files with hundreds of thousands of rows. Once your data is in the sheet, INDEX MATCH is the best way to slice through it.
Ready to level up? Try combining INDEX MATCH with SmoothSheet's CSV Joiner tool to pre-merge your data files before import, so you spend less time writing lookup formulas and more time analyzing your data.