Data Analysis

Google Sheets Named Ranges: Spaces Allowed? (Official Rules)

Marc SeanJune 30, 20265 min read

The fix is always underscores: Gross_Margin, WACC_Rate, Terminal_Growth_Rate.

This matches Excel's defined name rules, and for the same reason: a space makes the formula parser ambiguous. =Gross Margin * Units looks like 2 separate tokens. The parser can't resolve it.

The Complete Official Naming Rules

Google's documentation is sparse on specifics. Here's the full picture, tested as of June 2026:

RuleValidInvalid
Must start with a letter or underscoreWACC_Rate, _Revenue2025_Revenue, #Margin
Only letters, numbers, underscores after first charRevenue_FY2025Revenue-FY2025, EBITDA/Revenue
No spacesGross_MarginGross Margin
Cannot match a valid cell referenceQ4_Revenue (valid)Q4, B2, AA1
Case-insensitive (names are not case-distinct)wacc_rate = WACC_Rate-

The cell reference restriction catches people off guard. Q4 fails because it's column Q, row 4. FY2025 is fine. R1 fails. Rev_Q1 is fine. When you're shortening names for a board pack, test anything that looks like it could be A1 notation.

According to the Google Sheets Help documentation, the stated restriction is: "A name can only contain letters, numbers, and underscores, and must start with a letter or an underscore."

Why Named Ranges Pay Off in a Multi-Tab Model

A multi-tab financial model has the same 8-12 core assumptions feeding 40+ formulas across P&L, Balance Sheet, Cash Flow, DCF, and Returns tabs. Without named ranges, your WACC lives at Assumptions!$B$12 and you hunt that reference across every tab when the CFO changes the risk-free rate assumption.

With a named range WACC_Rate, your DCF tab reads:

=NPV(WACC_Rate, 'Cash Flow'!D7:H7) + Terminal_Value / (1 + WACC_Rate)^5

Instead of:

=NPV(Assumptions!$B$12, 'Cash Flow'!D7:H7) + DCF!$F$22 / (1 + Assumptions!$B$12)^5

One number changes in one place and every tab updates. That's the entire value proposition.

The thing most analysts don't realize: named ranges in Google Sheets are spreadsheet-scoped, not sheet-scoped. You don't prefix them with a sheet name. =WACC_Rate works from P&L, from the Returns tab, from anywhere in the file. No =Assumptions!WACC_Rate syntax. The name resolves globally.

This makes them genuinely different from cross-tab cell references, which always need the full prefix:

=SUMIFS('P&L'!C:C, 'P&L'!B:B, ">=" & Assumptions!$B$3, 'P&L'!A:A, "Revenue")

A named range for the date column collapses that:

=SUMIFS('P&L'!C:C, PL_Date_Column, ">=" & Quarter_Start)

Naming Conventions for a 3-Statement Model

Given that spaces are out, here are conventions that read cleanly and hold up across tabs:

Single-cell assumption inputs (the cells your sensitivity tables flex):

  • WACC_Rate → 9.2%
  • Terminal_GR → 2.5%
  • Revenue_Base → $4,200,000
  • Gross_Margin_Target → 38.5%
  • EBITDA_Multiple → 14.2x
  • New_Hire_Monthly → 4 (for runway sensitivity)
  • Churn_Rate_Monthly → 1.8%

Multi-cell ranges (rows or blocks used in SUMIFS, OFFSET, or array formulas):

  • Revenue_Monthly (12-column row)
  • COGS_Forecast (5-year block)
  • SKU_Contribution_Margin (range feeding contribution margin by SKU analysis)

Avoid:

  • Anything that matches cell notation: Q1, R2, C3 all fail
  • Hyphens: Gross-Margin looks valid but throws a #NAME? error at runtime
  • Starting with digits: 2025_Revenue fails at definition time

The Fastest Way to Create Named Ranges (Skip the Dialog)

If you're naming 15 cells in an Assumptions tab, clicking through Data > Named ranges 15 times burns 10 minutes. The Name Box shortcut is faster:

  1. Select the cell or range
  2. Click the Name Box (top-left corner, the field showing the current cell reference like "B5")
  3. Type the name and press Enter

Done. No dialog, no clicking Save. The name registers immediately and shows up in the Named ranges panel.

For bulk setup across a large assumptions tab, a short Apps Script function handles the whole thing in one run:

function createAssumptionNames() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Assumptions');

  // Cell → name map. No spaces allowed in names.
  const names = {
    'B5':  'WACC_Rate',
    'B6':  'Terminal_GR',
    'B9':  'Revenue_Base',
    'B10': 'Gross_Margin_Target',
    'B15': 'EBITDA_Multiple',
    'B18': 'New_Hire_Monthly'
  };

  Object.entries(names).forEach(([cell, name]) => {
    ss.setNamedRange(name, sheet.getRange(cell));
  });
}

Extensions > Apps Script, paste it, run once. All 6 named ranges created without a single dialog click.

One Non-Obvious Rule: Periods Also Work

Google's documentation lists letters, numbers, and underscores - but periods (.) also validate and save correctly in named ranges as of June 2026. Revenue.FY2025 and EBITDA.Margin both work.

That said, I'd recommend sticking to underscores only if there's any chance the model ports to Excel. Excel defined names allow periods too, but period behavior in some Excel formula contexts is inconsistent - particularly inside structured references and certain array contexts. Underscores are universally safe in both tools.

What Breaks When You Copy a Tab

Named ranges are attached to the spreadsheet, not to individual tabs. If a collaborator copies one of your tabs into a different file, the named range definitions don't travel with it. Every formula referencing WACC_Rate or Revenue_Base in that copied tab will throw a #NAME? error in the new file.

The fix is either to recreate the named ranges in the destination file, or to replace named range references with hardcoded cell references before sharing a tab externally. For models going to a bank syndicate or external due diligence, it's worth including a "Named Ranges" tab that documents each name, its cell address, and its current value - so anyone who receives a partial copy can reconstruct the references.

ModelMonkey can help here: if you describe your assumption structure in the sidebar, it can generate the Apps Script to create all named ranges in bulk, or audit existing named ranges against what's actually referenced across tabs. Try ModelMonkey free for 14 days - it works in both Google Sheets and Excel.


Frequently Asked Questions