Data Analysis

Google Sheets A1 Notation: FP&A Reference Guide (2026)

Marc SeanJune 18, 20267 min read

What trips up even experienced modelers is the full set of patterns - especially open-ended ranges like B2:B and the less-obvious B2:2 - and how absolute versus relative references interact when formulas get copied across tabs in a 3-statement model.

The Complete A1 Notation Pattern Set

FormExampleWhat it references
Single cellD7One cell
Rectangular rangeC4:F28Block from top-left to bottom-right
Full columnC:C or C:FEvery row in those columns
Full row4:4 or 4:7Every column in those rows
Open-ended columnC4:CColumn C from row 4 down to last row
Open-ended rowC4:4Row 4 from column C rightward to last column
Cross-sheet'P&L'!C4:F28Range on a different tab

Most of these are obvious in isolation. In practice, choosing the wrong form is how a model that looks clean breaks when someone inserts a row or extends the period columns past column Z.

Absolute vs. Relative: Where Models Actually Break

The $ sign controls whether a reference shifts when you copy a formula. Four combinations:

  • C4 - column and row both move with the copy
  • $C4 - column C is locked; row shifts
  • C$4 - row 4 is locked; column shifts
  • $C$4 - fully locked, never moves

In a multi-period model where you're dragging a formula across 12 quarterly columns, the standard pattern is:

='P&L'!C$4 * Assumptions!$C$3

C$4 lets the column shift (C to D to E as you drag right) while row 4 stays put. Assumptions!$C$3 is fully locked because the assumption cell never moves.

The failure mode: copying a formula vertically and forgetting the $ on a cross-sheet row reference. The formula silently shifts from 'Assumptions'!$B$3 to 'Assumptions'!$B$4. No error, just a wrong number. Board pack already printed.

Cross-Sheet References in Multi-Tab Models

The syntax is 'Sheet Name'!Range. Single quotes are required when the tab name contains spaces, hyphens, or parentheses. According to Google's Sheets documentation, the exclamation mark separates the sheet name from the range, and omitting quotes on a multi-word name throws a parse error.

For SUMIFS across tabs, every range argument that comes from the same sheet needs the same prefix:

=SUMIFS(
  'P&L'!D2:D,
  'P&L'!B2:B,
  Assumptions!$B$3,
  'P&L'!C2:C,
  ">=" & Assumptions!$C$4
)

This pulls revenue from the P&L tab where the category matches an assumption and the date is on or after a quarter start. A scalar from Assumptions is fine mixed in as a criteria value - the rules only apply to sum_range and criteria_range arguments, which must come from consistent sheets. Cross-pollinating criteria ranges (pulling one from P&L, another from a different tab) is the bug that passes IFERROR and returns a silently wrong number.

Open-Ended Ranges: B2:B and B2:2

C2:C is the right choice when your data grows row-by-row. Row 1 holds headers (period labels, line-item names), row 2 is where data starts. C:C includes row 1; C2:C skips it.

In most SUMIFS this doesn't change the result because a header like "Q1 2025" won't match your criteria string. The performance difference is real, though. Google Sheets caps at 10 million cells per spreadsheet - and when you use C:C in an ARRAYFORMULA, Sheets tries to evaluate all 10 million potential rows. A model with 20 ARRAYFORMULA calls on full-column ranges runs meaningfully slower than the same model written with C2:C. The difference is often 3-5 seconds per recalculation on a mid-size 3-statement model.

C4:4 is the row equivalent of C4:C. It selects from column C rightward through every column in row 4. You see it in MATCH formulas that scan a header row for a period label:

=MATCH(Assumptions!$D$2, 'Cash Flow'!C3:3, 0)

This finds which column in the Cash Flow header row (row 3, starting at column C) matches the target period. If you hardcode C3:Z3 and later add columns past Z, the MATCH misses them silently. The open-ended C3:3 adjusts automatically as the model grows.

INDIRECT: When A1 Notation Gets Dynamic

INDIRECT evaluates a text string as a cell reference:

=INDIRECT("'" & Assumptions!$A$2 & "'!C2:C")

If Assumptions!$A$2 contains P&L, this resolves to 'P&L'!C2:C. Some scenario models use this to let users flip between base-case, downside, and upside tabs by typing a name into a single assumption cell.

The cost: INDIRECT is volatile. Google's documentation notes that volatile functions recalculate on every sheet change, including edits that have nothing to do with the referenced cell. In a model with 30+ INDIRECT calls, this adds 2-4 seconds to every keystroke. Named ranges handle most of what INDIRECT is used for and recalculate only when their source data changes.

A Real-World Multi-Tab Formula

Here's what A1 notation looks like when it's actually doing work - a FCFF build pulling from three tabs in a bank syndicate DCF model:

=SUMIFS(
  'P&L'!C2:C,
  'P&L'!A2:A,
  ">=" & 'Assumptions'!$B$3,
  'P&L'!A2:A,
  "<=" & 'Assumptions'!$B$4
)
- SUMIFS(
  'CapEx'!D2:D,
  'CapEx'!A2:A,
  ">=" & 'Assumptions'!$B$3,
  'CapEx'!A2:A,
  "<=" & 'Assumptions'!$B$4
)
- 'Working Capital'!$C$14

Three tabs, two date-bound SUMIFS, one fixed scalar. Every cross-sheet reference is explicit. The date bounds in Assumptions are fully locked ($B$3, $B$4) so they don't move when the formula is copied down for each projection year. The C2:C and D2:D ranges start at row 2 to skip headers.

Original Insight: The Row-Extent Problem

Most guides cover B:B vs B2:B. Almost none cover the equivalent row pattern, and that gap causes real model errors.

When a team extends a model from 8 quarterly columns to 20 (say, a 5-year weekly cash flow), any formula that hardcoded a column endpoint like B3:J3 now stops short. The MATCH returns the wrong column index. The lookup pulls the wrong period. The model is wrong from column K onward.

The fix - B3:3 instead of B3:J3 - is a one-character change. Teams that know the pattern write models that self-extend; teams that don't spend 45 minutes debugging a mis-indexed IRR when the model gets handed to them mid-deal.

As of June 2026, Google Sheets still doesn't warn you when a hardcoded range endpoint cuts off your data. It returns whatever the range contains and treats truncation as correct behavior.

  • A1 notation covers 7 distinct forms: single cell, rectangular range, full column, full row, open-ended column (B2:B), open-ended row (B2:2), and cross-sheet
  • Use $ to lock the dimension that shouldn't move on copy: row lock (C$4) when dragging across period columns, full lock ($C$4) for scalar assumption references
  • Cross-sheet syntax requires 'Tab Name'!Range with single quotes whenever the tab name contains spaces
  • Use C2:C not C:C in ARRAYFORMULA - full-column ranges process all 10 million rows and add measurable recalculation time
  • Open-ended row ranges (C3:3) prevent models from silently truncating when columns are added
  • INDIRECT is volatile; use named ranges where possible

If you're tracing broken cross-tab references through an 8-tab model, ModelMonkey can read your sheet structure and flag references that look like they've drifted - without you manually stepping through every precedent.


Frequently Asked Questions