Google Sheets shares most of Excel's formula language — but adds a powerful set of Google-exclusive functions: QUERY for SQL-style data analysis, IMPORTRANGE for cross-spreadsheet lookups, ARRAYFORMULA for expanding single formulas across entire columns, and AI-powered helpers like GOOGLETRANSLATE and IMAGE. This cheat sheet covers every category you'll actually use.
Quick reference table
| Category | Key functions |
|---|---|
| Lookup | VLOOKUP, HLOOKUP, INDEX, MATCH, XLOOKUP, CHOOSE, OFFSET |
| Logical | IF, IFS, AND, OR, NOT, IFERROR, IFNA, SWITCH |
| Math | SUM, SUMIF, SUMIFS, SUMPRODUCT, ROUND, MOD, ABS, INT, CEILING, FLOOR |
| Statistical | COUNT, COUNTA, COUNTIF, COUNTIFS, AVERAGE, AVERAGEIF, AVERAGEIFS, MEDIAN, STDEV |
| Text | LEFT, RIGHT, MID, LEN, TRIM, UPPER, LOWER, PROPER, FIND, SEARCH, SUBSTITUTE, CONCAT, JOIN, SPLIT, REGEXEXTRACT |
| Date & Time | TODAY, NOW, DATE, YEAR, MONTH, DAY, DATEDIF, WORKDAY, NETWORKDAYS, EDATE, DAYS |
| Array | ARRAYFORMULA, FILTER, SORT, UNIQUE, SEQUENCE, FLATTEN, TOCOL, TOROW |
| Google-only | QUERY, IMPORTRANGE, GOOGLETRANSLATE, IMAGE, SPARKLINE, HYPERLINK, ISNUMBER |
| Reference | ROW, COLUMN, ROWS, COLUMNS, INDIRECT, ADDRESS |
| Information | ISNUMBER, ISTEXT, ISBLANK, ISERROR, ISODD, ISEVEN, CELL |
Formula syntax basics
Every formula starts with =. Key syntax rules:
| Element | Syntax | Example |
|---|---|---|
| Constant | =42 |
=1.08*B2 |
| Cell reference | =A1 |
=A1+B1 |
| Absolute reference | =$A$1 |
=$A$1*B2 |
| Range | =SUM(A1:A10) |
=AVERAGE(B2:B100) |
| Named range | =SUM(Revenue) |
=Revenue-Costs |
| Cross-sheet | =Sheet2!A1 |
=SUM(Sheet2!B2:B100) |
| Nested function | =OUTER(INNER(...)) |
=IF(ISNUMBER(A1),A1,0) |
Lock references: Press F4 to cycle A1 → $A$1 → A$1 → $A1.
Separator note: Google Sheets uses , in English locales and ; in many European locales. This guide uses ,.
Lookup functions
VLOOKUP — vertical search
=VLOOKUP(search_key, range, index, [is_sorted])
| Argument | Meaning |
|---|---|
search_key |
Value to find |
range |
Table array — first column must contain the key |
index |
Column number to return (1 = first column) |
is_sorted |
FALSE for exact match (almost always use this) |
Example — find price by product name:
=VLOOKUP("Widget", A2:C100, 3, FALSE)
Wrap with IFERROR to suppress #N/A:
=IFERROR(VLOOKUP(A2, Products!$A:$C, 3, FALSE), "Not found")
INDEX + MATCH — flexible two-way lookup
=INDEX(return_range, MATCH(search_key, lookup_range, 0))
Unlike VLOOKUP, the lookup column doesn't have to be first:
=INDEX(C2:C100, MATCH("Widget", A2:A100, 0))
Two-way lookup (row AND column):
=INDEX(B2:D10, MATCH(G1, A2:A10, 0), MATCH(G2, B1:D1, 0))
XLOOKUP — modern replacement for VLOOKUP
Available in Google Sheets since 2023:
=XLOOKUP(search_key, lookup_range, return_range, [if_not_found], [match_mode], [search_mode])
=XLOOKUP(A2, Products!A:A, Products!C:C, "Not found")
match_mode: 0 exact, -1 next smaller, 1 next larger, 2 wildcard.search_mode: 1 first to last, -1 last to first, 2 binary ascending.
Logical functions
IF
=IF(condition, value_if_true, value_if_false)
=IF(B2>1000, "High", "Low")
=IF(A2="", "Missing", A2)
IFS — multiple conditions without nesting
=IFS(condition1, value1, condition2, value2, ..., TRUE, default)
=IFS(B2>=90,"A", B2>=80,"B", B2>=70,"C", TRUE,"F")
AND / OR inside IF
=IF(AND(A2>0, B2>0), "Both positive", "Check values")
=IF(OR(A2="Admin", B2="Superuser"), "Access granted", "Denied")
IFERROR / IFNA
=IFERROR(formula, value_if_error)
=IFNA(VLOOKUP(A2,B:C,2,FALSE), "Missing")
Math functions
| Function | Example | Result |
|---|---|---|
SUM |
=SUM(A2:A100) |
Total |
SUMIF |
=SUMIF(B:B,"North",C:C) |
Sum where region = North |
SUMIFS |
=SUMIFS(C:C,B:B,"North",D:D,">1000") |
Sum with 2+ conditions |
SUMPRODUCT |
=SUMPRODUCT(B2:B10, C2:C10) |
Sum of products (weighted avg) |
ROUND |
=ROUND(A2, 2) |
Round to 2 decimal places |
ROUNDUP / ROUNDDOWN |
=ROUNDUP(A2,0) |
Always up / always down |
CEILING |
=CEILING(A2, 0.25) |
Round up to nearest 0.25 |
FLOOR |
=FLOOR(A2, 5) |
Round down to nearest 5 |
MOD |
=MOD(A2, 3) |
Remainder after division |
ABS |
=ABS(A2-B2) |
Absolute difference |
POWER |
=POWER(2, 10) |
2^10 = 1024 |
SQRT |
=SQRT(A2) |
Square root |
RAND |
=RAND() |
Random 0–1 (recalculates) |
RANDBETWEEN |
=RANDBETWEEN(1, 100) |
Random integer in range |
Statistical functions
| Function | Example | Notes |
|---|---|---|
COUNT |
=COUNT(A2:A100) |
Count numbers only |
COUNTA |
=COUNTA(A2:A100) |
Count non-empty cells |
COUNTBLANK |
=COUNTBLANK(A:A) |
Count empty cells |
COUNTIF |
=COUNTIF(B:B,"North") |
Count matching condition |
COUNTIFS |
=COUNTIFS(B:B,"North",C:C,">0") |
Multiple conditions |
AVERAGE |
=AVERAGE(A2:A100) |
Mean |
AVERAGEIF |
=AVERAGEIF(B:B,"North",C:C) |
Conditional mean |
AVERAGEIFS |
=AVERAGEIFS(C:C,B:B,"North",D:D,"Q1") |
Multi-condition mean |
MEDIAN |
=MEDIAN(A2:A100) |
Middle value |
MODE |
=MODE(A2:A100) |
Most frequent value |
STDEV |
=STDEV(A2:A100) |
Standard deviation (sample) |
STDEVP |
=STDEVP(A2:A100) |
Standard deviation (population) |
MIN / MAX |
=MIN(A2:A100) |
Smallest / largest |
SMALL / LARGE |
=SMALL(A:A, 3) |
3rd smallest / largest |
RANK |
=RANK(A2, $A$2:$A$100, 0) |
Rank (0=descending) |
PERCENTILE |
=PERCENTILE(A2:A100, 0.9) |
90th percentile |
Text functions
| Function | Example | Notes |
|---|---|---|
LEFT |
=LEFT(A2, 3) |
First 3 characters |
RIGHT |
=RIGHT(A2, 4) |
Last 4 characters |
MID |
=MID(A2, 5, 3) |
3 chars starting at position 5 |
LEN |
=LEN(A2) |
Character count |
TRIM |
=TRIM(A2) |
Remove extra spaces |
UPPER / LOWER / PROPER |
=PROPER(A2) |
Case conversion |
CONCATENATE / & |
=A2&" "&B2 |
Join text |
CONCAT |
=CONCAT(A2:A5) |
Join range (no delimiter) |
JOIN |
=JOIN(", ", A2:A10) |
Join with delimiter |
SPLIT |
=SPLIT(A2, ",") |
Split text into cells |
FIND |
=FIND("@", A2) |
Position of text (case-sensitive) |
SEARCH |
=SEARCH("@", A2) |
Position of text (case-insensitive) |
SUBSTITUTE |
=SUBSTITUTE(A2, "old", "new") |
Replace text |
REPLACE |
=REPLACE(A2, 1, 4, "new") |
Replace by position |
TEXT |
=TEXT(A2, "YYYY-MM-DD") |
Format number/date as text |
VALUE |
=VALUE("42") |
Text to number |
REGEXEXTRACT |
=REGEXEXTRACT(A2, "\d+") |
Extract with regex |
REGEXMATCH |
=REGEXMATCH(A2, "^[A-Z]") |
Test against regex |
REGEXREPLACE |
=REGEXREPLACE(A2, "\s+", " ") |
Replace with regex |
Extract domain from email:
=MID(A2, FIND("@",A2)+1, LEN(A2))
First name from full name:
=LEFT(A2, FIND(" ",A2)-1)
Date & time functions
| Function | Example | Notes |
|---|---|---|
TODAY() |
=TODAY() |
Current date (no time) |
NOW() |
=NOW() |
Current date + time |
DATE |
=DATE(2025, 12, 31) |
Construct a date |
YEAR / MONTH / DAY |
=YEAR(A2) |
Extract date part |
HOUR / MINUTE / SECOND |
=HOUR(A2) |
Extract time part |
WEEKDAY |
=WEEKDAY(A2, 2) |
1=Mon…7=Sun (type 2) |
WEEKNUM |
=WEEKNUM(A2, 2) |
ISO week number |
DATEDIF |
=DATEDIF(A2, TODAY(), "Y") |
Years between dates |
DAYS |
=DAYS(B2, A2) |
Days between dates |
EDATE |
=EDATE(A2, 3) |
Date + 3 months |
EOMONTH |
=EOMONTH(A2, 0) |
Last day of month |
WORKDAY |
=WORKDAY(A2, 10) |
Date + 10 business days |
NETWORKDAYS |
=NETWORKDAYS(A2, B2) |
Workdays between dates |
TEXT |
=TEXT(TODAY(), "MMMM YYYY") |
Format as "July 2025" |
Age in years:
=DATEDIF(A2, TODAY(), "Y")
Days until deadline:
=DAYS(B2, TODAY())
ARRAYFORMULA — expand a formula to a whole column
ARRAYFORMULA lets you write one formula that applies to an entire range, avoiding copy-paste and keeping data dynamic.
=ARRAYFORMULA(A2:A100 * B2:B100)
Conditional ARRAYFORMULA (without drag-down):
=ARRAYFORMULA(IF(A2:A100="","", A2:A100 * B2:B100))
Count characters in every row of column A:
=ARRAYFORMULA(LEN(A2:A100))
Join first + last name for all rows:
=ARRAYFORMULA(B2:B100 & " " & C2:C100)
Tip: Wrap with
IF(A2:A="",,...)to stop the formula from filling blank rows.
QUERY — SQL-style data analysis
QUERY is one of Google Sheets' most powerful exclusive functions. It uses a subset of SQL syntax called Google Visualization API Query Language.
=QUERY(data, query, [headers])
SELECT + WHERE
=QUERY(A1:D100, "SELECT A, C WHERE B = 'North' AND C > 1000", 1)
ORDER BY + LIMIT
=QUERY(A1:D100, "SELECT A, B, C ORDER BY C DESC LIMIT 10", 1)
GROUP BY + aggregates
=QUERY(A1:D100, "SELECT B, SUM(C) GROUP BY B LABEL SUM(C) 'Total Sales'", 1)
PIVOT table with QUERY
=QUERY(A1:C100, "SELECT B, SUM(C) WHERE A IS NOT NULL GROUP BY B PIVOT A", 1)
Dynamic criteria with cell references
Inject cell values by closing the string and concatenating:
=QUERY(A1:D100, "SELECT A, C WHERE B = '"&G1&"' AND C > "&H1, 1)
QUERY operators
| Operator | Example |
|---|---|
= |
WHERE B = 'London' |
!= |
WHERE B != 'London' |
>, >=, <, <= |
WHERE C >= 100 |
AND, OR |
WHERE B='North' AND C>0 |
CONTAINS |
WHERE A CONTAINS 'Pro' |
STARTS WITH |
WHERE A STARTS WITH 'J' |
IS NULL |
WHERE B IS NULL |
MATCHES |
WHERE A MATCHES '.*Pro.*' |
NOT |
WHERE NOT B = 'North' |
IMPORTRANGE — pull data from another spreadsheet
=IMPORTRANGE("spreadsheet_url", "range_string")
Example:
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1abc.../edit", "Sheet1!A1:C100")
- First use prompts you to click Allow access.
- Combine with QUERY to filter the imported data:
=QUERY(IMPORTRANGE("https://...","Sheet1!A1:D100"), "SELECT Col1, Col3 WHERE Col2 > 0", 1)
- Refreshes automatically when the source sheet changes.
- Use named ranges in the source sheet to keep links maintainable.
Google-exclusive functions
GOOGLETRANSLATE
=GOOGLETRANSLATE(text, [source_language], [target_language])
=GOOGLETRANSLATE(A2, "en", "es") // English → Spanish
=GOOGLETRANSLATE(A2, "auto", "fr") // auto-detect source
IMAGE — embed an image in a cell
=IMAGE(url, [mode], [height], [width])
| Mode | Meaning |
|---|---|
| 1 | Fit image in cell (default) |
| 2 | Stretch to fill cell |
| 3 | Original size |
| 4 | Custom size (specify height+width) |
=IMAGE("https://example.com/logo.png", 4, 80, 120)
SPARKLINE — tiny chart in a cell
=SPARKLINE(data, {options})
=SPARKLINE(B2:M2) // line chart
=SPARKLINE(B2:M2, {"charttype","bar"; "max",100}) // bar chart
=SPARKLINE(B2:M2, {"charttype","column"; "color","blue"}) // column
HYPERLINK
=HYPERLINK("https://example.com", "Click here")
MAP / REDUCE (Sheets 2023+)
=MAP(A2:A10, LAMBDA(x, x*2)) // multiply every cell by 2
=REDUCE(0, A2:A10, LAMBDA(acc, x, acc+x)) // sum via LAMBDA
Array functions (modern)
| Function | Example | Notes |
|---|---|---|
FILTER |
=FILTER(A2:C100, B2:B100="North") |
Return rows matching condition |
SORT |
=SORT(A2:C100, 2, FALSE) |
Sort by column 2 descending |
UNIQUE |
=UNIQUE(A2:A100) |
Remove duplicate rows |
SEQUENCE |
=SEQUENCE(10, 1, 1, 2) |
10 rows, 1 col, start 1, step 2 |
FLATTEN |
=FLATTEN(A2:C10) |
Collapse 2D range to 1 column |
TOCOL |
=TOCOL(A2:C10, 1) |
Range to column (skip blanks) |
TOROW |
=TOROW(A2:A10) |
Column to row |
HSTACK |
=HSTACK(A2:A10, C2:C10) |
Combine ranges side by side |
VSTACK |
=VSTACK(Sheet1!A:A, Sheet2!A:A) |
Stack ranges vertically |
CHOOSEROWS |
=CHOOSEROWS(A2:C10, 1, 3, 5) |
Pick specific rows by index |
FILTER with multiple conditions:
=FILTER(A2:C100, (B2:B100="North") * (C2:C100 > 1000))
Named ranges & named functions
Create a named range: Select cells → Data → Named ranges → Define name.
=SUM(Revenue) // instead of =SUM(B2:B1000)
=SUMIF(Region, "North", Revenue)
Named functions (custom formulas): Data → Named functions → New function.
// Define: YEAROVER(current, previous) = (current - previous) / previous
=YEAROVER(C2, B2) // reusable across the sheet
Conditional formatting with formulas
Use Format → Conditional formatting → Custom formula is to colour rows based on formula logic:
| Goal | Formula (applies to row 2) |
|---|---|
| Highlight row if column B = "Urgent" | =$B2="Urgent" |
| Highlight if value > average | =A2>AVERAGE($A:$A) |
| Alternate row shading | =ISEVEN(ROW()) |
| Highlight duplicates | =COUNTIF($A:$A,A2)>1 |
| Overdue dates | =AND(A2<TODAY(), A2<>"") |
Data validation with formulas
Format → Data validation → Custom formula:
| Validation rule | Formula |
|---|---|
| Only positive numbers | =A2>0 |
| Only valid email | =REGEXMATCH(A2, "^[^@]+@[^@]+\.[^@]+$") |
| Only from a list in another sheet | =COUNTIF(Sheet2!A:A,A2)>0 |
| Date in the future | =A2>TODAY() |
| No duplicates in column | =COUNTIF($A$2:$A2,A2)<=1 |
Common mistakes
| Mistake | Problem | Fix |
|---|---|---|
=VLOOKUP("item",A:C,4,FALSE) |
Column index exceeds range width | Ensure index ≤ columns in range |
| Dynamic criteria without concatenation | WHERE B = G1 treated as literal |
Use "WHERE B = '"&G1&"'" |
| ARRAYFORMULA filling empty rows | Shows 0 or blank in every row | Wrap with IF(A2:A="",,formula) |
| IMPORTRANGE #REF! | Access not granted | Click "Allow access" prompt |
| DATEDIF hidden function | No autocomplete, no docs in Sheets | Still works — type manually |
| Circular dependency | Formula references its own cell | Check for accidental self-reference |
| Comma vs semicolon | =SUM(A1;A2) fails in English locale |
Match your locale's list separator |
| Mixed text/number in SUMIF range | Counts or sums return 0 | Ensure column data type is consistent |
Excel vs Google Sheets: key differences
| Feature | Excel | Google Sheets |
|---|---|---|
| Cross-file import | Power Query / external links | IMPORTRANGE |
| SQL queries | Power Query M language | QUERY function |
| In-cell images | Not supported (natively) | IMAGE function |
| Translation | Not built-in | GOOGLETRANSLATE |
| Sparklines | Dedicated Sparkline feature | SPARKLINE function |
| XLOOKUP | Excel 2019+ / 365 | Sheets (added 2023) |
| LET function | Excel 365 | Sheets (added 2023) |
| LAMBDA | Excel 365 | Sheets (added 2022) |
| Dynamic arrays | Excel 365 | FILTER/SORT/UNIQUE always dynamic |
| Collaboration | SharePoint / OneDrive | Native real-time |
| Macros | VBA | Google Apps Script (JavaScript) |
DATEDIF |
Documented | Hidden (works, no autocomplete) |
Google Apps Script: go beyond formulas
For automation that formulas can't handle, use Extensions → Apps Script (JavaScript):
function sendWeeklyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sales");
const total = sheet.getRange("C2:C100").getValues()
.flat()
.reduce((sum, v) => sum + (Number(v) || 0), 0);
MailApp.sendEmail({
to: "manager@example.com",
subject: "Weekly Sales Report",
body: `Total sales this week: $${total.toLocaleString()}`
});
}
Trigger options: time-driven (hourly/daily/weekly), on-open, on-edit, on-form-submit.
FAQ
Q: What is the difference between Google Sheets and Excel formulas?
Most functions are identical. Google Sheets adds QUERY, IMPORTRANGE, GOOGLETRANSLATE, IMAGE, SPARKLINE, and always-dynamic array functions (FILTER, SORT, UNIQUE). Excel has more financial functions and full VBA support.
Q: How do I reference another sheet in Google Sheets?
Use SheetName!CellRef, for example =Sheet2!A1 or =SUM(Sheet2!B2:B100). For another spreadsheet entirely, use IMPORTRANGE.
Q: Why does my QUERY formula return a #VALUE! error?
Usually caused by mixed data types in a column (e.g. some cells are text, some numbers). Try converting the column with =VALUE() or format all cells consistently before querying.
Q: How do I make a drop-down list in Google Sheets?
Select cells → Data → Data validation → Dropdown (from a range) or Dropdown (from a list). You can also use a UNIQUE formula range as the source to auto-update the list.
Q: What's the difference between ARRAYFORMULA and FILTER?ARRAYFORMULA expands a single formula across a range (like drag-fill but dynamic). FILTER returns a subset of rows matching a condition — it outputs multiple rows automatically without ARRAYFORMULA.
Q: How do I use QUERY to combine data from multiple sheets?
Use VSTACK to stack the ranges first, then QUERY the combined data:
=QUERY(VSTACK(Sheet1!A1:C100, Sheet2!A1:C100), "SELECT Col1, SUM(Col3) GROUP BY Col1", 1)