Emission Factors in Google Sheets & Excel
Most carbon accounting still happens in a spreadsheet, and most of those spreadsheets carry emission factors that were typed in by hand from a PDF two years ago. The number is probably stale, nobody can say which cell of which publisher’s workbook it came from, and when the auditor asks, the answer is a shrug. This guide puts a sourced factor into a cell with one formula, and puts its source cell, data version and citation in the cells next to it.
In Google Sheets, install the GreenCalculus add-on from the Google Workspace Marketplace and type =GC_FACTOR("grid.gbr.electricity.location_based"). The cell returns the UK grid factor; =GC_CITE(…) next to it returns a citation with the publisher, the exact source cell, the retrieval date, the data version and a public proof link. No account is needed to read. Or skip the typing: copy the Scope 2 template, 214 countries with every value cited, and replace the kWh column. A free key lets you pin the whole workbook to a data version so it reopens to the same numbers a year later. In Excel, the same data arrives through Power Query from an open URL, with a native add-in to follow. That line follows a published specification: five fields, the publisher named first, free for anyone to adopt.
Why factors in spreadsheets go wrong
A spreadsheet template has no memory. The factor in cell C4 is a number somebody pasted, and the sheet cannot tell you where from, when, or whether the publisher has since changed it. Three things follow, and every carbon team has met all three.
The number goes stale silently. Publishers revise every year and sometimes in between. Across 112 days of continuous tracking we recorded 2,219 published factor values changing, 93% of them inside one June fortnight. The UK grid factor alone fell 26% between the 2025 and 2026 DEFRA releases. A template built last year reports a Scope 2 figure a quarter too high, and nothing in the sheet says so.
The source is lost at the moment of pasting. “DEFRA 2026” is a publisher and a year, not a location. The 2026 UK factors were published on 11 June and republished on 31 July with corrected values, under the same name on the same page. A sheet that says “DEFRA 2026” cannot tell you which file it was copied from.
The wrong number is easy to pick. A country has several electricity factors, and they disagree by design: the UK’s generation-only location-based factor and its lifecycle intensity differ by two thirds. A template rarely says which one it used, so the choice is made by whoever pasted it and never revisited. Which electricity number goes in which line covers this.
The cell holds a lookup, not a number. It knows its own key, so it can fetch the current value, or a pinned one, and it can print the publisher’s exact source cell and the data version beside it. The spreadsheet gains the memory it never had.
Install in Google Sheets
The add-on is also open source. A developer installs it into any Google account in about five minutes with Google’s clasp tool from the greencalculus-sdk repository; the README there has the four commands. Whichever route you take, it asks for three permissions only: to fetch from api.greencalculus.com, to read the spreadsheet it is open in, and to show a sidebar. Nothing else in your Google account is touched.
Once installed, Extensions → GreenCalculus → Open GreenCalculus opens the sidebar. On the first visit it offers Build me a starter sheet: two rows, UK grid electricity and UK diesel, each with an emissions formula and a linked citation, written at the selected cell. After that the sidebar is a search box: type in plain English (“diesel litre”, “uk grid”, “naics 3361”), then Insert value, Value + source, Citation link or Full citation writes the formula where the cursor is.
The sidebar runs under the browser’s default account. If that is not the account the sheet is open as, Google refuses its calls with a storage error. Open the sheet in a window signed in only as the sheet’s owner, or make that account the default. The formulas themselves are unaffected.
The six formulas, with what they return
Every formula takes a factor key: a dotted path such as grid.gbr.electricity.location_based or fuels.gbr.diesel_average_biofuel_blend.litre. Keys are case-sensitive; most are lower-case, and the global-warming-potential keys carry the gas formula’s capitals (gwp.CH4_fossil.ar6_100). Keys are stable identifiers, which is the point: the publisher may rename a row, the key does not move. Find keys with GC_SEARCH, in the sidebar, or on the factor reference pages.
| Formula | Returns |
|---|---|
=GC_FACTOR(key, [field], [as_of]) |
The value by default, or one field: unit, name, source, publisher, cell, retrieved, licence, version, gwp, basis, scope, citation, proof. key may be a range. |
=GC_FACTOR_ROW(key, [headers]) |
One row across six columns: value, unit, source id, source cell, data version, citation. |
=GC_CITE(key, [style]) |
The full citation line, ready to paste into a report. "short" gives the cell-sized form: source id, source cell, data version. For a clickable citation, wrap it: =HYPERLINK(GC_FACTOR(key,"proof"), GC_CITE(key,"short")). |
=GC_EMISSIONS(key, quantity) |
Quantity × factor, in the factor’s CO2e unit. Pass two matching ranges to fill a column. |
=GC_SEARCH("diesel litre", [limit]) |
Matching factors as rows: key, name, value, unit, source. |
=GC_VERSION() |
The data version the workbook’s formulas are reading: the pin if one is set, otherwise the current version. |
Here is what the UK grid key returned on 9 September 2026. The value, source cell and version are exactly what the cells showed; if you run it today the version may be newer, which is the behaviour the next section is about.
| Cell | Result |
|---|---|
=GC_FACTOR("grid.gbr.electricity.location_based") |
0.13096 |
=GC_FACTOR(A2, "unit") |
kg CO2e per kWh |
=GC_FACTOR(A2, "cell") |
‘UK electricity’!E25 |
=GC_FACTOR(A2, "version") |
2026.186 |
=GC_CITE(A2) |
UK grid electricity — location-based (generation). UK Government GHG Conversion Factors 2026 — Department for Energy Security and Net Zero (DESNZ), cell ‘UK electricity’!E25, retrieved 2026-06-18. via GreenCalculus data version 2026.186, factor grid.gbr.electricity.location_based. https://verify.greencalculus.com/grid.gbr.electricity.location_based@2026.186 |
The last line is the one auditors care about. It names the factor, the publisher, the exact cell in the publisher’s workbook, the date the row was retrieved, the data version that served it, and a public page that shows the same figure under the same version. The API builds this line itself and returns it on every factor row as citation.text, so the add-on, the JavaScript library and the MCP server all print the identical string. The citation format is documented on its own page.
Build a Scope 2 sheet in five minutes
- Column A, one key per site. UK sites use
grid.gbr.electricity.location_based; a German site usesgrid.deu.electricity.lifecycle_intensityor, for a market-based line,grid.deu.electricity.residual_mix. The section on electricity families says which is which. - Column B, kWh for the period. From invoices or meter reads, as you already have it.
- Column C:
=GC_EMISSIONS(A2:A20, B2:B20). One formula fills the column; the result is kg CO2e per row. - Column D:
=GC_CITE(A2:A20, "short"). One citation per row that fits a cell; the full line for the appendix is=GC_CITE(A2:A20), and=ARRAYFORMULA(HYPERLINK(GC_FACTOR(A2:A20,"proof"), GC_CITE(A2:A20,"short")))makes each one a link to its proof page. - Header cell:
="Data version: "&GC_VERSION(). The version every row was computed on, in plain sight. - Then pin it, as the next section describes, before it goes to anyone.
Twenty sites with twelve distinct keys cost twelve requests, not twenty: the add-on batches unique keys and caches results for six hours, and the API caches the same lookups at its edge. Ranges are cheaper than single cells, so prefer one formula per column over one per row.
Or copy the Scope 2 template: 40 countries, ready to extend
The sheet above is a public Google Sheet. Forty countries, led by the twelve most often reported — which are also the only ones that carry a location-based factor, so the two-boundary comparison is visible without scrolling. Make a copy puts it in your own Drive. Install the add-on first — the template is a plain spreadsheet that calls it, so the formulas need it present. It fills in a single pass.
Scope 2 electricity — by country (GreenCalculus). Forty countries, one row each, 1,000 kWh in the kWh column to replace with your own consumption. Every other column is a formula.
What each row carries, and why it is laid out this way:
- Two electricity boundaries side by side. A location-based column with the national inventory factor, and a lifecycle column with Ember’s figure. They are deliberately not merged: the first is a GHG Protocol Scope 2 number, the second is a footprinting benchmark that includes upstream fuel and plant construction and excludes transmission losses. The sheet says so in its header row.
- The location-based column is filled for five countries only. Australia, Canada, France, the Netherlands and the United Kingdom are the countries whose national inventory factor is in the corpus at data version 2026.189. Every other row is blank there on purpose, not missing: the corpus does not invent a Scope 2 factor where no government publishes one. The lifecycle column is filled for all 214.
- Emissions are plain multiplication. kWh × factor, in the cell, so an auditor can follow it without knowing the add-on exists. Only the factor and citation columns call the API.
- Adding a country is typing three letters. Put an ISO3 code in column B and the key in column D builds itself from it —
"grid."&LOWER(B7:B46)&".electricity.lifecycle_intensity". There is no key list to keep up to date, and any of the other 174 countries in the corpus is one code away. - The citation sits on one row, not forty. The UK row carries a worked citation linked to its proof page; copy that cell down onto the rows you actually report. This is deliberate: the add-on fetches one factor per request, so a column of forty citations is forty more lookups, and a wide enough sheet meets a rate limit before it finishes.
- The data version is in cell B3, and the sheet tells you how to pin it before it goes to anyone.
Share the copy link, not your copy. Anyone who opens the link gets their own workbook, and yours stays yours. The credit line in the last row is what the free plan asks for; keep it, and the workbook is yours to pass on.
Pin the workbook for your auditor
An unpinned sheet is a live view: reopen it after a publisher’s June release and every value has moved, including the ones in a report that was signed off in March. That is the failure version control for emission factors exists to prevent, and the add-on builds it in.
In the sidebar, Pin to current version writes the data version into a named cell, GC_AS_OF, on a sheet called GreenCalculus inside the workbook. From then on every formula reads factors as they stood at that version, every citation carries it, and =GC_VERSION() reports it. The pin is an ordinary cell: it travels with a copy, an auditor can see it, and clearing it returns the workbook to the live view. To read a single cell at the current version while the workbook stays pinned, pass "current" as the third argument of GC_FACTOR.
Pinning reads the reproducibility archive rather than the open current table, so it needs an API key; a free one takes a minute and no card. A pinned workbook whose owner has no key does not silently show current values under a past label. Each cell says so instead, which is the honest failure.
A pin fixes what the formulas read from now on. It does not rewrite a figure someone already copied out of an unpinned sheet last month. Pin when the workbook is created, and the report that quotes it will reproduce for as long as the archive holds the version.
Which electricity number goes in which line
The most common mistake in a spreadsheet inventory is not a stale factor but the wrong one. Most countries have more than one electricity factor in the corpus, and they answer different questions. The keys make the choice explicit.
| Key ending | What it measures | Use it for |
|---|---|---|
.location_based |
The national inventory factor: generation at the plant, transmission losses excluded, from the government set (DEFRA, NGA, and others where one exists). | GHG Protocol Scope 2, location-based method. |
.residual_mix |
The grid with contracted renewables removed, where a residual-mix publisher exists (AIB for Europe, NGA for Australia). | Scope 2, market-based method, for consumption not covered by contracts or certificates. |
.lifecycle_intensity |
Ember’s lifecycle figure for every one of 214 countries, including upstream fuel supply and plant construction. | Footprinting, product LCAs and web-carbon estimates; not a Scope 2 line. |
Germany illustrates why the choice matters: at data version 2026.189 its lifecycle intensity is 0.32965 and its residual mix 0.70147 kg CO2e per kWh, a factor of more than two between two “German grid” numbers. For countries with no national set, GC_SEARCH shows what exists, and the field guide to boundaries explains the disagreements you will meet. The full country table is on the grid electricity reference, and the underlying dataset with per-row data years is on the grid dataset page.
Excel today: Power Query
A native Excel add-in is planned and will be decided by demand for the Sheets one. Until then Excel can read the same open data through Power Query, which handles the JSON directly and refreshes on demand. This is the route for a team on Windows or Mac Excel 365.
- Data → Get Data → From Other Sources → From Web.
- Paste a browse URL. For every UK electricity factor:
https://api.greencalculus.com/v1/factors?key_prefix=grid.gbr.electricity&limit=50
For a search:https://api.greencalculus.com/v1/factors?search=diesel%20litre&limit=20. No key or header is needed. - In the Power Query editor, click factors → List, then To Table.
- Expand the record column and keep
key,factor.value,factor.unit,source.id,source.cell_ref,source.retrieved. The response’smeta.gc_versionis the data version; add it as a column so the table records what it was built from. - Close & Load. Look up factors from the table with
XLOOKUPby key. Data → Refresh All pulls the current release.
One thing this route does not give you that the Sheets add-on does: a pinned read of a past version. The citation is there — every row carries citation.text, the same line GC_CITE prints, so a Power Query column can expand it directly. For a pinned Excel workbook, paste the values and record the version from meta.gc_version alongside them, which is the practice the version-control guide recommends for any tool without an archive. The WEBSERVICE() function is not the answer: it runs only on Windows, returns raw text, and gives you nothing to parse the JSON with.
Limits, privacy and licensing
- Reading is open. Current values, units, source cells and licences come from the API’s open browse route, which needs no account and is served from an edge cache. The corpus is overwhelmingly open-licensed at source; gating a read would make the add-on worse than the original publishers.
- A free key adds pinning and factor history. The free plan allows 1,000 requests a month and 30 a minute. Pinned lookups go 25 at a time and wait when told to, so a large pinned workbook fills over a minute or two rather than failing. An unpinned workbook never fails on that cap: if the keyed route asks it to slow down, the add-on reads the same current rows from the open route instead.
- Google’s own limits apply to every add-on: a formula must return within 30 seconds, and an account may make 20,000 web fetches a day (100,000 on Google Workspace). The add-on fetches 25 keys at a time and stops at 24 seconds; any rows left show This took too long. Press Enter on the cell once more: the rows already fetched are cached, so the second pass finishes the rest. The 214-country template needs that second pass on a cold cache.
- What leaves the sheet: the factor keys and search text you type, and an API key if you set one. Nothing else in the workbook is read or sent. The key is stored in the spreadsheet owner’s Google account, not in the file. Details are in the privacy policy.
- Sharing with clients is redistribution. A workbook full of these values sent to a client is redistribution of the data under the terms; the Business plan covers it and removes the attribution requirement. The free and Developer plans require a visible credit, which
GC_CITEsupplies.
Copy the template, or get a free key for pinning. Reading needs no account. The key takes a minute, no card, and turns a live sheet into an audit-ready one.
How this guide was tested, and what it broke
Every formula on this page was run in a real workbook on 9 and 10 September 2026 against data version 2026.187, and the worked example above is pasted from the cells, not typed. Rebuilding the template on 11 September found a fifth, and a more fundamental one: the add-on issues one HTTP request per factor key, so a sheet of 214 countries asks for 214 responses and meets a rate limit around row 80. That is why the template here is forty rows rather than every country, and why a batch lookup is the next thing being built. Building the original 214-country template was the first time the add-on had been asked for more than a few dozen keys at once, and it exposed four defects. All four were fixed and shipped the same day; they are recorded here because a tool that reports its own failures is easier to trust than one that does not.
- Keys were lower-cased before lookup, while the corpus is case-sensitive. Every global-warming-potential key (
gwp.CH4_fossil.ar6_100and 197 others) returned unknown key from a cell. Fixed: case is preserved. - One request for 214 keys on a cold cache exceeded Google’s 30-second limit and the whole column failed. Fixed: keys go 25 at a time, and a column that runs out of time says so per row and completes on the next Enter.
- With a free API key saved, every lookup used the keyed route and hit its 30-a-minute cap after the first batch, while a copier with no key filled the column. Fixed: an unpinned workbook falls back to the open route rather than failing.
- When a batch failed, the add-on knew only that it had, not why. Fixed: the reason is logged where the maintainers can read it.
The changes are public in the repository’s merged pull requests for 10 September 2026.
Frequently asked questions
No. Values, units, source cells, licences and citations come from the API’s open route and need no key. A free key is needed for one thing: pinning a workbook to a data version, because that reads the reproducibility archive rather than the current table.
Three places: the sidebar’s search box, the GC_SEARCH formula, or the factor reference pages on this site, each of which prints the key beside every row. Keys are lower-case dotted paths and are stable across releases, so a key you used last year still resolves.
In an unpinned workbook, yes: the formulas follow the current data version, so a June release moves every cell that depends on it. Pin the workbook from the sidebar and it reads the version you chose until you unpin it. Which behaviour you want depends on whether the sheet is a live dashboard or a signed-off report.
Not as an add-in yet. Excel reads the same open data today through Power Query from a browse URL, refreshable on demand, and this guide shows the five steps. A native Excel add-in with the same formulas is planned, and demand for the Sheets version decides when.
The location-based one, grid.gbr.electricity.location_based, which is DEFRA’s generation factor with transmission losses reported separately. The lifecycle figure from Ember is higher because it includes upstream fuel supply and plant construction; it belongs in footprints and product studies, not on a Scope 2 line. For the market-based method, the corpus carries the AIB residual mix for Great Britain, grid.gbr.electricity.residual_mix, 0.28064 kg CO2 per kWh at data version 2026.189, for consumption not covered by a supplier-specific factor or a certificate.
Yes. The template is an ordinary spreadsheet whose cells call GC_FACTOR and GC_CITE, so without the add-on installed every one of those cells reads #NAME?. Install it once from the Google Workspace Marketplace — one click, and it is then present in every spreadsheet that account opens, not just this one. An earlier version of this template carried a copy of the add-on inside the file so it worked with nothing installed; that was retired because the bundled copy was frozen at the day it was made and never received a fix.
No. Google stops any spreadsheet formula at 30 seconds, and a column of two hundred keys on a cold cache can need more. The add-on fetches 25 keys at a time and stops at 24 seconds, marking the rows it did not reach. Press Enter on the cell again: the rows already fetched are cached for six hours, so the second pass finishes the rest.
Yes, and it counts as redistribution of the data under the terms. The Business plan covers redistribution and removes the credit requirement. On the free and Developer plans, keep a visible credit in the workbook, which is what the GC_CITE column already provides.