# How to get crypto prices into Google Sheets or Excel

An official add-on, a keyless CSV, or a script of your own. Why a Google Sheet shares its rate limit with strangers, and what a daily price is dated.

*https://cryptomarkets.tools/how-to/get-crypto-prices-into-a-spreadsheet · next to Crypto Market Data APIs*

**Answer:** Install CoinGecko's own add-on, which gives you =COINGECKO() in Google Sheets and =CG.PRICE() in Excel, and give it a free Demo key. Avoid keyless recipes for anything live: a Google Sheet fetches from Google's shared servers, so other people's sheets spend the same per-IP allowance. Ask for coin IDs rather than tickers, fetch a column in one call rather than one per cell, and treat the number as minutes to hours old.

## Approaches

*In the author’s order. Paid placement does not affect it.*

1. [CoinGecko API](https://cryptomarkets.tools/tools/coingecko-api.md) — First-party add-ons for both spreadsheets — =COINGECKO() in Sheets, =CG.* in Excel — on a free Demo key, plus a batch price endpoint for your own script.
2. [Coin Metrics](https://cryptomarkets.tools/tools/coin-metrics.md) — A keyless community endpoint that answers in CSV, so a daily reference-rate series lands in Google Sheets through the built-in IMPORTDATA with no add-on at all.
3. [CoinMarketCap API](https://cryptomarkets.tools/tools/coinmarketcap-api.md) — The other free key, for a custom function you write yourself; its Basic plan carries commercial-use rights, which matters for a sheet used at work.
4. [Artemis](https://cryptomarkets.tools/tools/artemis.md) — One =ART() formula for prices beside fees, revenue and TVL in Excel and Sheets, with ARTRANGE to pull a whole date range as a single call.

## The short way

Use the vendor's own add-on. [CoinGecko](https://cryptomarkets.tools/tools/coingecko-api) publishes one for Google Sheets
and one for Excel, and both run on a CoinGecko API key — the free Demo key is enough to start.
Install from the Google Workspace Marketplace or the Excel add-ins store, paste the key into the
add-on's settings, and type a formula.

```text
Google Sheets (CoinGecko for Sheets)
=COINGECKO("id:bitcoin")                    latest USD price, by coin ID
=COINGECKO("id:ethereum", "2026-09-01")     price at 00:00 UTC on that date
=COINGECKO("top:20")                        top 20 by market cap

Excel (CoinGecko add-in)
=CG.PRICE("bitcoin")                        latest USD price
=CG.HISTORY("bitcoin", "2026-09-01")        historical USD price
=CG.TOP(20)                                 ranked table, spills down and right
```

Two habits from the start. Use the `id:` form, which CoinGecko's own documentation calls the most
reliable, rather than a ticker. And keep the columns next to the formulas empty: the table
functions spill into adjacent cells and fail if something is already there.

The Demo plan is the free tier described on the card — a monthly credit allowance, a per-minute
ceiling, 365 days of history and a required attribution line. For a watchlist of a few dozen
coins that refreshes a few times a day, that is plenty.

## What the options are

**The official add-on.** As above. Its advantage over everything below is that the rate limit
you hit is your key's, not an IP address's. Sheets caches the formulas for one to two hours;
the add-on's sidebar has a *Refresh All Data* button, and the Excel task pane has the same.

**A keyless CSV and a built-in function.** Google Sheets' `IMPORTDATA` reads any URL that returns
CSV, and [Coin Metrics](https://cryptomarkets.tools/tools/coin-metrics)' community API returns CSV when asked, with no key
and no account:

```text
=IMPORTDATA("https://community-api.coinmetrics.io/v4/timeseries/asset-metrics?assets=btc,eth&metrics=ReferenceRateUSD&frequency=1d&start_time=2026-09-01&format=csv")
```

That returns three columns — asset, time, value — one row per asset per day, and it is the only
route here that needs nothing installed. It suits a daily series; it is not a live quote, and the
licence on community data is non-commercial.

**Your own custom function.** When an add-on does not return the field you need, Apps Script
(Extensions, then Apps Script) lets you write the formula yourself. The one design choice that
matters is to take a *range* and make *one* request for it, rather than one request per cell:

```javascript
// =CGPRICES(A2:A40) — one request for the whole column of CoinGecko IDs.
// Store the Demo key as the script property CG_DEMO_KEY, not in this file.
function CGPRICES(ids) {
  const list = [].concat(ids).flat().filter(String);
  const key = PropertiesService.getScriptProperties().getProperty('CG_DEMO_KEY');
  const url = 'https://api.coingecko.com/api/v3/simple/price'
    + '?vs_currencies=usd&include_last_updated_at=true'
    + '&ids=' + encodeURIComponent(list.join(','));
  const res = UrlFetchApp.fetch(url, { headers: { 'x-cg-demo-api-key': key } });
  const data = JSON.parse(res.getContentText());
  return list.map(id => data[id]
    ? [data[id].usd, new Date(data[id].last_updated_at * 1000)]
    : ['', '']);
}
```

The endpoint takes up to 515 IDs a request, and the second column is the time CoinGecko last
updated the price — keep it. The same shape works against
[CoinMarketCap](https://cryptomarkets.tools/tools/coinmarketcap-api), which takes its key in an `X-CMC_PRO_API_KEY` header
and accepts comma-separated IDs; its free Basic plan includes commercial use, which CoinGecko
keeps for its paid plans and Coin Metrics' community licence excludes.

**A metrics add-in that also does prices.** [Artemis](https://cryptomarkets.tools/tools/artemis) sells a plugin for Excel
and Google Sheets whose one formula covers price, market cap and the fundamentals it is really
bought for. `=ART("BTC", "PRICE")` is the latest price; `=ARTRANGE("BTC", "PRICE", "2026-01-01",
"2026-09-01")` returns the whole range as one call. It is a paid product, and worth it only if
the sheet needs the protocol metrics too.

**The built-ins.** Google's `GOOGLEFINANCE` and Excel's Currencies data type are both documented
for currency pairs, and neither document mentions crypto. Microsoft limits currency pairs to
Microsoft 365 accounts; both vendors say the data may be delayed and is not for trading. Do not
build a sheet you depend on around undocumented coverage.

## Where this breaks

**A Google Sheet does not fetch from your computer.** `IMPORTDATA`, `IMPORTXML`, and anything
written in Apps Script run on Google's servers, and many unrelated spreadsheets leave from the
same addresses. A keyless API that limits by IP is counting all of them. CoinGecko's
documentation states it plainly: "Rate limit errors may occur due to shared IP addresses among
Google Sheets users. For reliable performance, use a dedicated API key with a paid plan." Coin
Metrics' community tier is limited per IP as well. This is why a keyless recipe copied from a
forum works on the first afternoon and returns errors at random afterwards: nothing changed in
your sheet, and nothing you do in it will fix it. Every error also counts — CoinGecko includes
4xx and 5xx responses in the per-minute limit, so a sheet that retries on failure digs itself
deeper. The families of limit, and what each is really counting, are in
[rate limit](https://cryptomarkets.tools/glossary/rate-limit).

**One cell is one call, and Google counts the calls too.** Google's documentation says each use
of a custom function is a separate call to the Apps Script server. A consumer Google account gets
20,000 URL fetches a day and a Workspace account 100,000; no more than 30 scripts run at once per
user; and a custom function that has not returned within 30 seconds shows `#ERROR!`. Four hundred
cells each holding a one-coin custom function can be four hundred fetches per recalculation, and the upstream
API meters every one against your credit allowance as well. Batch: one range in, one request out,
a two-dimensional array back. Artemis gives the same advice about its own formulas, and adds a
catch: in a shared sheet, the calls count against the *owner's* quota and run on the owner's
credentials, so a sheet stops working for everyone when its owner's subscription lapses.

**A ticker is not a coin.** Symbols are not unique. CoinMarketCap's documentation says so and
says what it does about it — when several assets share a symbol, it returns the one with the
highest market cap — and symbols also change when a project rebrands. A formula keyed on a
ticker can quietly start returning a different asset. Key the sheet on each vendor's own ID, and
keep a column mapping IDs to the tickers you want to see.

**A price in a cell is already old.** Google recalculates the import functions hourly and
delays `GOOGLEFINANCE` by up to 20 minutes. CoinGecko's add-on inherits a Sheets cache of one to
two hours, and the price behind it is itself refreshed every 60 seconds on the free and keyless
tiers, every 20 seconds on paid ones. None of that is visible in the cell. Pull the source's
timestamp alongside every price, as the script above does, and read the two together.

**A daily price has a date convention, and they differ.** CoinGecko's historical formula returns
the price at 00:00 UTC on the date you give it; Artemis documents its daily price at midnight UTC
too. Coin Metrics publishes the same number under two names with different stamps: `PriceUSD` is
the price as of the *end* of the UTC day, while `ReferenceRateUSD` at a daily frequency is stamped
at the start of it. Pulled today, `PriceUSD` for 22 September 2026 and `ReferenceRateUSD` for
23 September are the same figure to ten decimal places. Mix the two, or mix them with a column
typed in your local time zone, and every row is a day out. Which aggregate each vendor is
publishing in the first place is the subject of
[where the Bitcoin price comes from](https://cryptomarkets.tools/guides/where-the-bitcoin-price-comes-from).

**The key lives wherever the sheet goes.** `IMPORTDATA` takes a URL and nothing else, so a keyed URL puts
the key in the formula — the query-string placement that CoinGecko and CoinMarketCap both
recommend against — and every copy of the sheet carries it. Use an add-on's settings or a script
property instead, and keep the sheet itself free of credentials before you share it.

**Free to import is not free to republish.** CoinGecko requires attribution on every plan,
including the free one; Coin Metrics' community data is licensed non-commercial. A personal
watchlist is inside both. A sheet circulated to clients, or published as a dashboard, is a
[redistribution](https://cryptomarkets.tools/glossary/redistribution) question, and
[what exchange API terms actually let you do](https://cryptomarkets.tools/guides/exchange-api-terms) covers the venue side
of the same problem.

## If you outgrow this

The sign is a sheet that has become an application: hundreds of assets, refreshes you need on a
schedule rather than on open, or other people depending on the numbers. At that point the
spreadsheet is the wrong place for the fetch. Pull on a schedule from a script or a small job of
your own, write to a file or a database, and let the sheet read that — the rate limit is then
yours, the timestamps are stored rather than recomputed, and the key never enters the document.

If what you actually need is a candle series rather than a last price, that is a different task:
[pulling OHLCV from an exchange](https://cryptomarkets.tools/how-to/pull-ohlcv-from-an-exchange) covers it. If you need one
number to settle a contract or mark a book, a spreadsheet formula over a free tier was never the
right source; that is a reference-rate purchase, and [Coin Metrics](https://cryptomarkets.tools/tools/coin-metrics) and
[Kaiko](https://cryptomarkets.tools/tools/kaiko) are where it starts.

## FAQ

### Does GOOGLEFINANCE work for Bitcoin?

Google's help page for GOOGLEFINANCE documents currency pairs and says nothing about crypto assets, so anything it returns for one is behaviour you cannot point to a document for. What the page does say applies either way — quotes are not sourced from all markets, may be delayed up to 20 minutes, are not for trading, and historical results cannot be read through the Sheets API or Apps Script.

### Why does my sheet show "Loading..." or a rate-limit error when I have barely used it?

Because the request did not come from you. A formula in Google Sheets fetches from Google's servers, and a keyless API that limits per IP address is counting every sheet that shares that address. CoinGecko's documentation says so directly and recommends a dedicated key on a paid plan for reliable performance. A key moves you onto your own allowance; retrying harder only spends the shared one.

### Can I keep my API key out of the formula?

Not with IMPORTDATA, whose only argument is the URL, so the key has to ride in the URL — the placement both CoinGecko and CoinMarketCap advise against. An add-on stores it for you, and an Apps Script custom function can read it from script properties and send it as a header. Either way the key belongs to whoever owns the sheet, and a shared sheet spends the owner's allowance.

### How often does a spreadsheet price refresh?

Less often than it looks. Google recalculates IMPORTDATA and the other import functions hourly; CoinGecko's add-on notes that Sheets caches its formulas for one to two hours, with a sidebar button to force a refresh; and the upstream price itself is cached — every 60 seconds on CoinGecko's free and keyless tiers. Put the source's own timestamp in the sheet next to the number.

## Sources

1. [Common Errors & Rate Limit](https://docs.coingecko.com/docs/errors-and-rate-limits) — CoinGecko, read 2026-09-26
2. [CoinGecko for Google Sheets](https://docs.coingecko.com/docs/google-sheets) — CoinGecko, read 2026-09-26
3. [CoinGecko for Microsoft Excel](https://docs.coingecko.com/docs/excel) — CoinGecko, read 2026-09-26
4. [Coin Price by IDs (simple/price)](https://docs.coingecko.com/reference/simple-price) — CoinGecko, read 2026-09-26
5. [Authentication (Demo API)](https://docs.coingecko.com/v3.0.1/reference/authentication) — CoinGecko, read 2026-09-26
6. [Change a spreadsheet's locale, time zone, recalculation and language](https://support.google.com/docs/answer/58515) — Google, read 2026-09-26
7. [IMPORTDATA](https://support.google.com/docs/answer/3093335) — Google, read 2026-09-26
8. [GOOGLEFINANCE](https://support.google.com/docs/answer/3093281) — Google, read 2026-09-26
9. [Quotas for Google Services](https://developers.google.com/apps-script/guides/services/quotas) — Google, 2026-09-03
10. [Custom Functions in Google Sheets](https://developers.google.com/apps-script/guides/sheets/functions) — Google, read 2026-09-26
11. [Get a currency exchange rate](https://support.microsoft.com/en-us/excel/get-a-currency-exchange-rate) — Microsoft, read 2026-09-26
12. [Coin Metrics API v4 — community rate limits, format parameter, licence](https://docs.coinmetrics.io/api/v4) — Coin Metrics, read 2026-09-26
13. [Price — PriceUSD and its timestamp convention](https://gitbook-docs.coinmetrics.io/network-data/network-data-overview/market/price) — Coin Metrics, read 2026-09-26
14. [Standards and Conventions](https://coinmarketcap.com/api/documentation/guides/standards-and-conventions) — CoinMarketCap, read 2026-09-26
15. [Authentication](https://coinmarketcap.com/api/documentation/guides/authentication) — CoinMarketCap, read 2026-09-26
16. [Syntax and Formulas — =ART() and =ARTRANGE()](https://artemis.ai/docs/artemis-sheets/metrics/syntax-and-formulas) — Artemis, read 2026-09-26
17. [Common Problems with Google Sheets](https://artemis.ai/docs/artemis-sheets/common-problems-w-google-sheets) — Artemis, read 2026-09-26

*Last updated 2026-09-26. Corrected in place — an endpoint that moves is a bug here, not a new post.*
