Google Sheets has a built-in function for importing web tables — and it fails more often than it works on the modern web. Here is why, and what to use instead.
The classic: IMPORTHTML
=IMPORTHTML("https://example.com/page", "table", 1)
It fetches the page server-side and grabs the n-th <table>. When it works, it even refreshes automatically.
Where it breaks:
- JavaScript tables — Sheets fetches the raw HTML, so tables rendered client-side (most dashboards, finance sites, sports stats) come back empty.
- Login walls — Sheets can't see pages that need your session.
- Table index guessing — "table 1" may be a layout table; you end up trying 1, 2, 3…
- Formatting — merged headers and locale numbers (
1.234,56) arrive broken.
The reliable way: extract from the browser
Your browser already renders the final table — JavaScript included, login included. A table extractor extension grabs that version.
With TableGrab, you click the extension icon, it highlights every table on the page, and Send to Google Sheets creates a new spreadsheet with the data already cleaned: headers detected, empty rows removed, numbers typed as numbers.
The Google Sheets export uses your own Google account (OAuth) and the table data is never stored on our servers — it passes through only to call the Sheets API.
When to use which
| Situation | Best tool |
|---|---|
| Static public table, needs auto-refresh | IMPORTHTML |
| JavaScript-rendered table | Extension |
| Page behind login | Extension |
| One-off grab, you're already on the page | Extension |
| Scheduled scraping of many pages | A proper scraper/script |
For day-to-day "I need this table in Sheets now" moments, the one-click path wins. TableGrab is free for 5 exports per day — install it here.