ReplyLabs
FeaturesPricingCompareFAQUse casesBlogHelpSetup
Sign inGet started free
Get started

Product

  • Features
  • Pricing
  • Compare
  • Roadmap

Resources

  • Use cases
  • Blog
  • Glossary
  • Cost calculator

Support

  • Setup Guide
  • Help Center
  • Contact Support
  • Report an Issue
  • Feature Requests

Company

  • Opt Out of Testing

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie list
  • Subprocessors

Empra Consultancy LTD
hello@replylabs.io

ReplyLabs|PrivacyTermsCookiesSubprocessors

© 2026 Empra Consultancy LTD. All rights reserved.

All articles
Web scraping

How to scrape a website to a spreadsheet (no code, 2026)

Scrape any website into a spreadsheet without code. The three real methods, where each one breaks, what it costs, and a step-by-step that scales to thousands of URLs.

By Hugo Dupont · 8 min read

To scrape a website into a spreadsheet, you point a tool at one or more URLs, it fetches each page on your behalf, and it writes the values you want into rows and columns. You can do this three ways: with Google Sheets' built-in IMPORTXML and IMPORTHTML functions for a few static pages, with a sidebar add-on that fetches pages on a server for anything bigger or JavaScript-heavy, or with a scraping API if you are a developer building a pipeline. The fastest no-code route for real work is the add-on, because it runs the requests off the spreadsheet, renders dynamic pages, and only bills for URLs that return data. This guide walks through each method, where it breaks, the cost, and the exact steps.

What is the easiest way to scrape a website into a spreadsheet?

The easiest no-code route is a Google Sheets add-on that takes a column of URLs and writes the results back into the next column. You never leave the spreadsheet, you do not write a line of code, and the fetching happens on a server rather than inside the sheet, so it does not stall on large lists or JavaScript pages.

The built-in functions feel easier at first because they need no install, but they cap out within a few dozen URLs and return nothing on most modern sites. They are a quick fix, not a method that scales. For the full breakdown of the native route, see web scraping in Google Sheets.

What are the three ways to scrape a website to a spreadsheet?

There are three practical shapes, and each fits a different size of job.

  1. Native import functions. IMPORTXML, IMPORTHTML, and IMPORTDATA live inside Google Sheets. You write a formula, point it at a URL plus an XPath or table index, and the value lands in the cell. Free, instant, and fine for a handful of clean, static pages.
  2. A sidebar add-on. You select a column of URLs, the add-on fetches each page on its own servers, and results stream back into a new column. This is the shape that survives at thousands of rows and on JavaScript-rendered sites, because the work never touches Apps Script.
  3. A scraping API. A developer calls a scraping service in code, parses the response, and pushes rows into Sheets through the Sheets API. Maximum control, but it is a build project, not a spreadsheet task.

ReplyLabs is the second shape, a web scraper that runs from inside Google Sheets and bundles several engines so you can route a run through whichever one fits the target page.

How do the built-in functions work, and where do they break?

The native functions are the obvious starting point because they cost nothing. IMPORTHTML pulls a table or list by index. IMPORTXML pulls any node you can target with an XPath query. They look like this:

=IMPORTXML("https://example.com/about", "//h1")
=IMPORTHTML("https://example.com/pricing", "table", 1)

The XPath //h1 grabs the first level-one heading. You can target deeper nodes too, written as a path expression inside the XPath string. On a clean static page this genuinely works.

The trouble starts the moment you scale or hit a modern site:

  • JavaScript pages return nothing. IMPORTXML reads the raw HTML the server sends, not the page a browser builds after running scripts. Most large sites render their content with JavaScript, so the value you want is not in the HTML the function sees. You get an empty cell or an error.
  • Roughly 50 calls per sheet. Each spreadsheet runs only about 50 import calls before they start failing, and each call returns up to 50,000 characters. A list of 500 URLs is out of reach.
  • It slows the whole sheet. Once you have more than a dozen import formulas, the document recalculates erratically and crawls, because every edit can trigger a refresh.
  • No retries, no rendering, no error handling. When a page is slow, blocks the request, or needs a header, the formula simply fails, and there is nowhere to add a fallback.

Native functions are the right tool for a quick one-off on a static page. They are the wrong tool for enriching a lead list or monitoring competitor pages.

Why not just write an Apps Script to loop over URLs?

This is the common next step, and it hits a hard wall: Google caps a single Apps Script execution at six minutes. Fetch a page, parse it, write the row, repeat, and you burn through that budget after a few hundred URLs, often far fewer if the pages are slow. The script dies mid-run and leaves you a half-filled column with no clean way to resume.

You can chunk the work into six-minute slices with time-based triggers, but now you are maintaining a brittle queue-and-resume system instead of scraping. The real fix is to move the fetching off the spreadsheet. A server-side add-on runs every request on its own infrastructure, so the six-minute limit never applies and a run of fifty thousand URLs is just a longer run, not a broken one.

How do I scrape a website to a spreadsheet, step by step?

The flow is the same whether you are pulling page text, prices, or company details:

  1. Put your target URLs in a column. Open the sidebar with Extensions, ReplyLabs, Open sidebar.
  2. Select the range of URLs.
  3. Choose a scrape engine, or leave it on the default in-house engine, which auto-falls back to another engine when a page resists the first attempt.
  4. Pick what to extract: full page text for an AI step to read, or a specific field.
  5. Review the cost preview for your exact URL count.
  6. Click Run. Each URL is fetched on a server, and results stream back into a new column.

Because every URL is its own request, a page that blocks or times out fails on its own row without stopping the rest, and you only pay for URLs that return data. Dead links cost nothing.

What does scraping to a spreadsheet cost?

ReplyLabs offers four engines so you can match the price to the target site:

  • ReplyLabs Scrape (in-house), from $0.002 per URL, with automatic fallback to another engine when a page resists. The default for most lists.
  • Google Sheets Scrape, which runs through your own Apps Script so requests come from Google IP addresses. Useful when a site treats Google traffic differently.
  • Jina, at $0.005 per URL, a managed reader that returns clean page text.
  • Firecrawl, at $0.0075 per URL, for the hardest JavaScript-heavy pages.

You see the price for your exact URL count before anything runs, and only succeeded URLs are charged. New accounts start with $20 of free credit, enough to scrape thousands of URLs on the in-house engine before paying. To model a run alongside AI and verification, use the cost calculator.

Is scraping a website to a spreadsheet legal?

Scraping publicly accessible pages is broadly legal in the US and EU, as established by hiQ Labs v. LinkedIn, where the Ninth Circuit held that accessing data anyone can view without logging in is not unauthorised access under US anti-hacking law. That is not a free pass. The same case later turned on contract: hiQ was found to have breached LinkedIn's terms by scraping and creating fake accounts. A few rules keep you safe: stay on pages with no login, respect robots.txt, rate-limit yourself to roughly one request per second per domain, and do not collect personal data without a lawful basis under GDPR or CCPA.

Common questions

Can I scrape a website to Google Sheets without coding?

Yes. A sidebar add-on like ReplyLabs takes a column of URLs and writes results into the next column with no code. The built-in IMPORTXML function is also no-code but caps out at roughly 50 calls per sheet and fails on JavaScript pages.

How many URLs can I scrape into a spreadsheet?

With native functions, about 50 import calls per spreadsheet before they fail. With a server-side add-on, there is no spreadsheet-side cap because the requests run off the sheet, so runs of thousands of URLs are normal.

Why does my scrape return blank cells?

Usually the page is JavaScript-rendered, so the content is not in the raw HTML, or you have exceeded the per-sheet import limit, or the site is rate-limiting you. A server-side engine that renders the page reaches content the native functions cannot.

Do I pay for URLs that fail?

No. ReplyLabs only charges for URLs that return data, so a blocked page, a timeout, or a dead link fails on its own row at no cost. See the full Google Sheets scraping guide or start with ReplyLabs to try it on your own list.

Keep reading: Web scraping
Read the full guide: Web scraping into Google Sheets
  • Scrape LinkedIn company pages safely
  • IMPORTXML vs a real scraper
Definitions
Web scraperRate limiting

Try it on your own list

ReplyLabs runs from a sidebar inside Google Sheets. Start free with $20 credit, no card needed.

Get started free