INDEX MATCH in Google Sheets – flexible Vlookup for your spreadsheets

When you need to find data in your sheet that corresponds to a certain key record, it is usually Google Sheets VLOOKUP you turn to. But there you go: VLOOKUP slaps you with limitations almost immediately. That's why you'd better increase the resources for the task by learning INDEX MATCH.

INDEX MATCH in Google Sheets is a combination of two functions: INDEX and MATCH. When used in tandem, they act as a better alternative for Google Sheets VLOOKUP. Let's find out their capabilities together in this blog post. But first, I'd like to give you a quick tour of their own roles in spreadsheets.

Google Sheets MATCH function

I'd like to start with Google Sheets MATCH because it's really simple. It scans your data for a specific value and returns its position:

=MATCH(search_key, range, [search_type])
  • search_key is that record you're looking for. Required.
  • range is either a row or a column to look in. Required.
    Note. MATCH only accepts one-dimensional arrays: either row or column.
  • search_type is optional and defines if the match should be exact or approximate. If omitted, it is 1 by default:
    • 1 means the range is sorted in ascending order. The function gets the largest value less than or equal to your search_key.
    • 0 will make the function look for the exact match in case your range is not sorted.
    • -1 hints that records are ranked using descending sorting. In this case, the function gets the smallest value greater than or equal to your search_key.

Here's an example: to get a position of a certain berry in the list of all berries, I need the following MATCH formula in my Google Sheets:

=MATCH("Blueberry",A1:A10,0)

Lookup the exact match using Google Sheets MATCH function.

Google Sheets INDEX function

While MATCH shows where to look for your value (its location in the range), Google Sheets INDEX function fetches the value itself based on its row and column offsets:

=INDEX(reference, [row], [column])
  • reference is the range to look in. Required.
  • row is the number of rows to offset from the very first cell of your range. Optional, 0 if omitted.
  • column, just like row, is the number of offset columns. Also optional, also 0 if omitted.

If you specify both optional arguments (row and column), Google Sheets INDEX will return a record from a destination cell:

=INDEX(A1:C10,7,1)

Use INDEX for Google Sheets to fetch a record from a particular cell.
Skip one of those arguments and the function will get you the entire row or column accordingly:

=INDEX(A1:C10,7)

Omit the column argument to fetch the entire row.

How to use INDEX MATCH in Google Sheets — formula examples

When INDEX and MATCH are used together in spreadsheets, they are at their mightiest. They can absolutely substitute Google Sheets VLOOKUP and fetch the required record from a table based on your key value.

Build your first INDEX MATCH formula for Google Sheets

Suppose you'd like to get the stock info on cranberry from the same table I used above. I only swapped columns B and C (you'll find out why a bit later).

  1. Now all berries are listed in column C. Google Sheets MATCH function will help you locate the exact row of the cranberry: 8

    =MATCH("Cranberry",C1:C10,0)

  2. Put that whole MATCH formula to a row argument in the INDEX function:

    =INDEX(A1:C10,MATCH("Cranberry",C1:C10,0))

    This one will return the entire row with cranberry in it.

  3. But since all you need is the stock info, specify the number of the lookup column as well: 3

    =INDEX(A1:C10,MATCH("Cranberry",C1:C10,0),2)

  4. Voila!
    Use Google Sheets INDEX MATCH to look up values.
  5. You can go further and give up that last column indicator (2). You won't need it at all if you use only the lookup column (B1:B10) rather than the entire table (A1:C10) as the first argument:

    =INDEX(B1:B10,MATCH("Cranberry",C1:C10,0))

    Use a column instead of the whole table as the first argument.

    Tip. A more convenient way to check the availability of various berries would be to place them in a drop-down list (E2) and refer your MATCH function to the cell with that list:

    =INDEX(B1:B10,MATCH(E2,C1:C10,0))

    Once you select the berry, the related value will change accordingly:
    Refer to the cell with the drop-down list.

Why INDEX MATCH in Google Sheets is better than VLOOKUP

You already know that Google Sheets INDEX MATCH looks your value up in a table and returns another related record from the same row. And you know that Google Sheets VLOOKUP does exactly the same. So why bother?

The thing is, INDEX MATCH has some major advantages over VLOOKUP:

  1. Left-side lookup is possible. I changed the columns places earlier to illustrate this one: INDEX MATCH function in Google Sheets can and does look to the left of the search column. VLOOKUP always searches the very first column of the range and looks for matches to its right — else, it gets only #N/A errors:
    Look up to the left with Google Sheets INDEX MATCH.
  2. No messed up references when adding new columns and moving existing ones. If you add or move columns, INDEX MATCH will reflect the changes automatically without meddling in the result. Since you use column references, they are instantly adjusted by Google Sheets:
    See how formulas adjust without messing with the result.
    Go ahead and try to do this with VLOOKUP: it requires the order number rather than cell references for a lookup column. Thus, you'll just end up getting the wrong value because another column takes the same place — column 2 in my example:
    Vlookup pulls wrong data.
  3. Considers text case when necessary (more on this right below).
  4. Can be used for vertical lookup based on multiple criteria.

I invite you to look at the last two points in detail below.

Case-sensitive v-lookup with INDEX MATCH in Google Sheets

INDEX MATCH is a go-to when it comes to case-sensitivity.

Supposing all berries are being sold in two ways — loose (weighed at the counter) and packed in boxes. Hence, there are two occurrences of each berry written in different cases in the list, each with its own ID that also vary in cases:
Same names, same IDs, different text cases.

So how can you look up the stock info on a berry sold in a certain way? VLOOKUP will return the first name it finds no matter its case.

Luckily, INDEX MATCH for Google Sheets can do it correctly. You'll just need to use one additional function — FIND or EXACT.

Example 1. FIND for case-sensitive Vlookup

FIND is a case-sensitive function in Google Sheets which makes it great for case-sensitive vertical lookup:

=ArrayFormula(INDEX(B2:B19,MATCH(1,FIND(E2,C2:C19)),0))

Use the FIND function to build case-sensitive INDEX MATCH.
Let's see what happens in this formula:

  1. FIND scans column C (C2:C19) for the record from E2 (cherry) considering its letter case. Once located, the formula "marks" that cell with a number — 1.
  2. MATCH searches for this mark — 1 — in the same column (C) and hands the number of its row to INDEX.
  3. INDEX comes down to that row in column B (B2:B19) and fetches the required record to you.
  4. When you finish building the formula, press Ctrl+Shift+Enter to add ArrayFormula at the beginning. It is required because without it FIND won't be able to search in arrays (in more than one cell). Or you can type 'ArrayFormula' from your keyboard.

Example 2. EXACT for case-sensitive Vlookup

If you replace FIND with EXACT, the latter will look for records with the exact same characters, including their text case.

The only difference is that EXACT "marks" a match with TRUE rather than number 1. Hence, the first argument for MATCH should be TRUE:

=ArrayFormula(INDEX(B2:B19,MATCH(TRUE,EXACT(E2,C2:C19),0)))

Use the EXACT function to build case-sensitive INDEX MATCH.

Google Sheets INDEX MATCH with multiple criteria

What if there are several conditions based on which you'd like to fetch the record?

Let's check the price of the cherry that is being sold in PP buckets and is already running out:
Find out the price on several criteria.
I arranged all the criteria in the drop-down lists in column F. And it is Google Sheets INDEX MATCH that supports multiple criteria, not VLOOKUP. Here's the formula you will need to use:

=ArrayFormula(INDEX(B2:B24,MATCH(CONCATENATE(F2:F4),A2:A24&C2:C24&D2:D24,0),))

How to use INDEX MATCH in Google Sheets with multiple criteria.
Don't panic! :) Its logic is actually quite simple:

  1. CONCATENATE(F2:F4) combines all three records from cells with criteria into one string like this:

    CherryPP bucketRunning out

    This is a search_key for MATCH, or, in other words, what you're looking for in the table.

  2. A2:A24&C2:C24&D2:D24 constitute a range for the MATCH function to look in. Since all three criteria take place in three separate columns, this way you kind of combine them:

    CherryCardboard trayIn stock
    CherryFilm packagingOut of stock
    CherryPP bucketRunning out
    etc.

  3. The last argument in MATCH — 0 — makes it possible to find the exact match for CherryPP bucketRunning out among all those rows of combined columns. As you can see, it's in the 3rd row.
  4. And then INDEX does its thing: it fetches the record from the 3rd row of column B.
  5. ArrayFormula is used to allow other functions to work with arrays.
Tip. If your formula doesn't find a match, it will return an error. To avoid that, you can wrap this entire formula in IFERROR (make it the first argument) and enter whatever you want to see in a cell instead of errors as a second argument:

=IFERROR(ArrayFormula(INDEX(B2:B27,MATCH(CONCATENATE(F2:F4),A2:A27&C2:C27&D2:D27,0),)),"Not found")

Use IFERROR to overwrite potential errors.

Better alternative to INDEX MATCH in Google Sheets — Multiple VLOOKUP Matches

Whatever lookup function you prefer, VLOOKUP or INDEX MATCH, there's a better alternative to them both.

Multiple VLOOKUP Matches is a special add-on for Google Sheets designed to:

  • lookup without formulas
  • lookup in all directions
  • search by multiple conditions for different data types: text, numbers, dates, time, etc.
  • fetch several matches, as many as you need (providing there are as many of them in your table, of course)

The interface is straightforward, so you won't have to doubt whether you're doing everything correctly:

  1. Select source range.
  2. Set the number of matches and columns to return.
  3. Fine-tune the conditions using the predefined operators (contains, =, not empty, between, etc.).

Tweak the conditions in Multiple VLOOKUP Matches.
You will also be able to:

  • preview the result
  • decide where to place it
  • and how: as a formula or just values

Preview the result in Multiple VLOOKUP Matches.
Don't miss out on this opportunity to check the add-on. Go ahead and install it from G Suite Marketplace. Its tutorial page will explain every option in detail.

See you in the comments below or in the next article ;)

You may also be interested in:

10 Responses to "INDEX MATCH in Google Sheets – flexible Vlookup for your spreadsheets"

  1. saurabh Singla says:

    Hi Sir

    Thanks for your very usefull tutorial.

    I need your help in very small thing. I am converting a simple formula into array formula but its not working form me for some reason.

    Normal formula is =IF(AND(A3<'IIR & NPV - Calculation Dashboard'!$B$2,OR(A3=1,A3=13,A3=25,A3=37,A3=49)),'IIR & NPV - Calculation Dashboard'!$B$12,0)

    Its Working as expected for me. But when I am converting it into Array formula, it looks like this

    =ArrayFormula(IF(AND(A3:A<'IIR & NPV - Calculation Dashboard'!$B$2,OR(A3=1,A3=13,A3=25,A3=37,A3=49)),'IIR & NPV - Calculation Dashboard'!$B$12,0))

    It is not giving me the same result as its normal formula.

    Can you please help me out here and tell me what is the error in this array formula?

    • Hello!
      If I understand your task correctly, the following formula should work for you:

      =ArrayFormula(IF(IF(A3:A20 < $B$2,TRUE,FALSE) * (IF(A3:A20=1,TRUE,FALSE)+ IF(A3:A20=13,TRUE,FALSE)+ IF(A3:A20=25,TRUE,FALSE)+ IF(A3:A20=37,TRUE,FALSE)+ IF(A3:A20=49,TRUE,FALSE)),$B$12,0))

      Please adjust this formula according to your data if needed.

  2. Elsa says:

    Help! I have two sheets: MasterSheet and Operations Sheet.
    I need to replicate Columns H and I on the MasterSheet has two columns (H and I) in the Operations Sheet in Column C (which corresponds to Column H on the MasterSheet) and Column D (which corresponds to Column I on the MasterSheet).
    I need a formula where Column D will automatically populate with the cell value in Column I on the MasterSheet if the value in Column C matches the value in Column H of the MasterSheet. Essentially, if Column H and C are the exact match, then Column D should populate with the value in Column I in the same Row as Column H.

    • Hello Elsa,

      I'm really sorry but your description is not clear.
      For me to be able to suggest you anything, please try to specify (consider bulleted list) what columns each sheet contains exactly and what data should be pulled and where exactly. Thank you.

      • Elsa says:

        I have a Worksheet with 2 tabs.
        The first tab is named MasterSheet.
        - Column H heading on the MasterSheet is called "Purchase Req"
        - Column H on the MasterSheet is called "Purchase Order"
        The second tab is named OperationsSheet
        - Column C heading on the OperationsSheet is called "Purchase Req"
        - Column D heading on the OperationsSheet is called "Purchase Order"
        I need a formula for Column D on the Operations Sheet that:
        1) Searches column C on the Operations Sheet for an exact match as that in Column H of the MasterSheet
        2) If it finds the exact match, Column D in the OperationsSheet will then return (or copy) the value found in Column I of the MasterSheet.
        Example:
        MasterSheet OperationsSheet
        H I C D
        PR PO# PR PO#
        1234 450001234 6738 450089628
        6738 450089628 1234 450001234

        • Thank you very much for the detailed explanation, Elsa!

          Now I've got your task. Here are the formulas for you to try (assuming there are 10 rows in a table, so please adjust the number 10 to your number of rows):

          1. If you want to use INDEX MATCH from this blog post:
            =INDEX('Master Sheet'!I1:I10,MATCH(C2,'Master Sheet'!H1:H10,0))
          2. A version with VLOOKUP that will fill all rows in a column automatically at once:
            =ARRAYFORMULA(VLOOKUP(C2:C10,'Master Sheet'!H2:I10,2))
            Number 2 here is the number of the column I in my small table. Please also change it to yours.

          Hope this helps!

  3. frais says:

    Hi I have 3 sheets

    One name "Draw Results" Contains numbers e.g. 002345
    (numbers are filled on the entire sheet e.g. 'Draw Results' A1:K159)

    Second Named "Bond List" Contains numbers e.g. 002347
    (numbers are filled on the entire sheet e.g. 'Bond List' A1:K159)

    Third Named "Matched Results" want the matched results displayed in here.
    What Formula do I put in here I have tried =INDEX('Draw Results'!$A$1:$A$159,MATCH('Bond List'!A1,'Bond List'!$A$1:$A$175,0),1)

    Please help
    Thank You

Post a comment



Unfortunately, due to the volume of comments received we cannot guarantee that we will be able to give you a timely response. When posting a question, please be very clear and concise. We thank you for understanding!