

# Can You Export All Google Search Results to a Spreadsheet?

You can export a capped sample of Google web-search results to a spreadsheet. That export does not prove that you have all Google results or every indexed page of a website. Save the exact query, country, language, result positions, and check time. Then report the requested limit, saved rows, unique destination addresses, and reason collection stopped.

If you need every known page of your own website, start with your own site inventory and Google Search Console evidence. Those owner records better match that question. A public search export answers which results appeared in the selected search. Google states that `site:` results are not exhaustive and that an indexed address is not guaranteed to appear. [Google site search guidance — checked October 25, 2026; explains search limits, not a complete site inventory](https://developers.google.com/search/docs/monitor-debug/search-operators/all-search-site)

For a defined public search sample, Chronometrica’s Google Search Scraper documents a useful spreadsheet format: one saved row for each result observation. An observation is one result recorded under a particular search, page, and position. An Actor is a hosted data collection program. The Actor collects those rows; you must check the export and explain its limits. [Chronometrica Google Search Scraper — contract checked October 25, 2026; no paid run](https://apify.com/chronometrica/google-search-scraper)

## 1. Define what the spreadsheet must answer

Replace “all results” with a request you can check. For example: “Save up to 10 Google web-search observations for one query, with the United States and English settings.”

A cap is the maximum number of rows the collection is allowed to save for each executed query on each engine. It is not a promise that the source will return that many rows.

Before collection, write down these decisions:

1. State the purpose of the list. You might need candidate pages for a topic review or evidence of which destinations appeared.
2. Save the exact query text. Keep its spelling, punctuation, and any search operators.
3. Select Google as the engine for this first export.
4. Set the country and language you want to request.
5. Set the row cap and record whether sponsored results are included.
6. Define the checks the spreadsheet must pass before you use it.

A search operator is text such as `site:` that asks an engine to narrow a search. The engine interprets it. An operator does not turn a search into a complete website inventory.

Keep the source question clear. A Google Custom Search engine is a different source from the Google web-search collection described here. The supplied evidence does not establish Google Custom Search API compatibility. An API is a way for programs to exchange data. A public question asks about exporting a custom engine to Excel, but that question does not verify support in this Actor. [Public spreadsheet question — observed August 11, 2026; publication date unknown, Custom Search scope only](https://www.reddit.com/r/excel/comments/13daysg/does_anyone_know_how_i_can_export_google_search)

This method concerns public web-search observations. It does not establish Maps coverage, search volume, a complete web index, or access to owner-only records.

## 2. Save a small input before collection

Use the following supplied input as a starting point. JSON is a text format that stores named values and lists.

```json
{"country":"US","engines":["google"],"includeSponsoredResults":false,"language":"en","maxResultsPerExecutedQuery":10,"queries":["small business invoice approval workflow"],"safeSearch":true}
```

2. Save a small input before collection

This input passed a check against the public default-build input rules. It was not run for this guide. The check confirms the input format and allowed values. It does not confirm that Google returned results. [Public default build 1.0.15 — checked October 25, 2026; input rules inspected, no paid run](https://api.apify.com/v2/acts/mlmVX4amk2biciJaB/builds/default)

Replace the sample values in this order:

1. Replace the whole `queries` list with your intended query. Keep one query for the first check.
2. Keep `engines` set to `["google"]` for this method.
3. Replace `country` and `language` if your intended search uses other settings. `US` requests the United States; `en` requests English where supported.
4. Set `maxResultsPerExecutedQuery` to your chosen cap. The checked range is 1 to 100.
5. Review `safeSearch` and `includeSponsoredResults` before saving the input.

`safeSearch:true` asks supported engines to filter explicit results. Engines may apply their own local rules. `includeSponsoredResults:false` omits sponsored results. If you turn it on, the documented output includes `isSponsored` and `advertiserDomain` fields for that purpose.

Save the full input with your collection record. The output fields do not replace the input record. In particular, retain the sponsored-result setting so another reader can understand which results you requested.

You can also start from the public [Export Search Results to CSV Task — checked October 25, 2026; public presence verified, saved input not inspected](https://apify.com/chronometrica/google-search-scraper/examples/export-search-results-to-csv). A Task is a saved input preset for an Actor. Replace its sample query and inspect every saved setting before use. The public page check did not verify that its saved values match the input above.

## 3. Check the collection state before exporting

The next steps are proposed reader actions. No collector run occurred for this guide.

After you start your collection, inspect its final state and summary before you treat the dataset as ready. A dataset is the saved collection of result rows. Keep both the dataset and the summary that explains what happened during collection.

Use this sequence:

1. Check whether the run finished successfully, failed, or was interrupted.
2. Read the recorded reason collection stopped.
3. Check the reported Google result count and any engine-level failure information.
4. Compare the saved count with the requested cap.
5. Keep any block, filter, or source-exhaustion information with the export.

Source exhaustion means that collection reached the end of the results available through that request. It does not prove that Google has no other indexed pages.

Keep these states separate:

| Recorded state | What you can report | What remains unproved |
| --- | --- | --- |
| Cap reached | Collection saved rows up to the requested limit | Whether more results were available |
| Source exhausted | Collection stopped after the available source results ended | Complete Google or website coverage |
| Source blocked or request failed | Collection met an access or execution problem | Whether matching results exist |
| Results filtered | Filtering affected the result set | The contents of the excluded set |
| Stop state missing or unclear | The reason is unknown | Why collection ended below the cap |

A finished run with fewer rows than requested needs an explanation. It does not automatically mean failure, and it does not automatically mean completeness.

If the dataset and summary disagree, keep the original records and hold the spreadsheet for review. Do not add blank rows to reach the cap. Do not substitute the requested cap for the number actually saved.

## 4. Export without changing the source values

Export CSV or JSON from the completed dataset. CSV stores table values in text, usually separated by commas. Keep the original downloaded file before you edit a spreadsheet copy.

Import the file through your spreadsheet’s import controls. Set identifiers and web addresses to text. Preserve the original timestamp strings in text columns as well. Automatic date or number conversion can change a value’s form and make comparison with the source harder.

Retain these documented result fields:

| Field | What to preserve or check |
| --- | --- |
| `runId` | Identifier linking the observation to its collection run |
| `country` | Country setting recorded for the result |
| `language` | Language setting recorded for the result |
| `safeSearch` | Recorded explicit-content filter setting |
| `engine` | Search engine attached to the observation |
| `executedQuery` | Exact query attached to the observation |
| `page` | Recorded search-result page |
| `rankOnPage` | Recorded position within that page |
| `rank` | Recorded result position for the search |
| `title` | Returned search-result title |
| `canonicalUrl` | Returned normalized candidate address |
| `resultDomain` | Returned destination domain |
| `snippet` | Returned search-result text |
| `isSponsored` | Returned sponsored-result flag |
| `advertiserDomain` | Returned advertiser domain, when supplied |
| `observedAt` | Recorded observation time |
| `schemaVersion` | Identifier for the output format version |

These fields come from the checked public output contract. [Chronometrica Google Search Scraper — checked October 25, 2026; documented fields, no runtime verification](https://apify.com/chronometrica/google-search-scraper)

`canonicalUrl` is a normalized candidate address. Its name does not prove that someone checked the destination page’s HTML canonical tag, which identifies a preferred page address. It also does not establish the original link text or address.

A snippet is search-result text. It is not fetched article text. A missing snippet does not mean that the destination page is empty. A rank records a result position; it does not measure visits or traffic.

Check a few imported rows against the original file. Include any available values with commas, quotation marks, line breaks, or non-English characters. Confirm that each value stays in its correct column.

If CSV does not preserve the difference between a missing value and an empty string, keep JSON as the source reference. Record the distinction in a separate review column when the spreadsheet needs it.

## 5. Count observations and destinations separately

A row count and a unique-destination count answer different questions.

The observation count tells you how many result records you saved. The unique-destination count tells you how many distinct returned addresses appear under your stated counting rule.

For the first export, use exact `canonicalUrl` strings as the destination rule. This avoids silently combining addresses with different paths or parameters. It still gives a count of distinct returned addresses, not independently verified page identities.

Keep the observation table intact. Build any destination list in a separate working table. If one address appears twice at different result positions, retain both observations and their positions.

A repeated export row is a different issue. If the same saved record appears twice because you imported the file twice, investigate that import error. Do not use repeated destination addresses alone to decide that observations are duplicate copies.

For the separate task of combining exports, see [How to Merge Bing Search Exports Without Losing Query and Rank Evidence](/en/articles/web-result-dedup/). That guide concerns Bing exports. Its separate observation and destination tables help explain the counting distinction; it does not provide runtime evidence for this Google method.

Preserve missing values during every count. A missing rank is unknown, not rank zero. A missing result count is unknown, not a confirmed zero. Record zero only when the source evidence supports that count within the stated collection scope.

## 6. Original fiction: 16 observations and 15 destinations

This entire worked example is original fiction. Its run, times, result positions, destination address, and counts are invented for teaching. It is not an Actor test or customer result.

An analyst uses one Google query: “small business invoice approval workflow.” They request the United States and English settings. They keep safe search on and sponsored results off.

For this fictional example only, they change the cap from the supplied input’s 10 to 20 observations. The collection saves 16 observations. The fictional summary reports source exhaustion.

Two observations have the same returned address:

| Fictional record | Engine | Rank | Returned address | Observation time |
| --- | --- | --- | --- | --- |
| Observation A | Google | 3 | `https://workflow.example/invoice-approval` | `2026-10-24T14:00:00Z` |
| Observation B | Google | 11 | `https://workflow.example/invoice-approval` | `2026-10-24T14:00:00Z` |

The other 14 observations each have a different address. None matches the shared address above.

The counts reconcile as follows:

- Observation count: 2 observations with a shared destination + 14 other observations = 16 observations.
- Unique-destination count: 1 shared destination + 14 other destinations = 15 destinations.
- Unused cap allowance: 20 permitted observations − 16 saved observations = 4 observations below the cap.

Those four observations are unused allowance. They are not four known missing results. The cap gives no count of Google’s complete matching result set.

The analyst’s fictional collection record reads:

| Item | Fictional recorded value |
| --- | --- |
| Query | small business invoice approval workflow |
| Engine | Google |
| Country and language | United States and English requested |
| Sponsored results | Excluded |
| Safe search | Requested |
| Requested cap | 20 observations |
| Saved rows | 16 observations |
| Unique returned destinations | 15 exact address strings |
| Check time | `2026-10-24T14:00:00Z` |
| Stop state | Source exhaustion |

A suitable fictional coverage statement is:

### 6. Original fiction: 16 observations and 15 destinations

For this Google query, the collection requested up to 20 observations with United States and English settings, safe search on, and sponsored results excluded. It saved 16 observations with 15 distinct returned destination addresses at the recorded check time, 2026-10-24T14:00:00Z. The summary reported source exhaustion. This export does not establish complete Google or website coverage.

Do not describe this example as 20 returned results. Do not describe it as all indexed pages. Dividing 16 by the cap of 20 would compare saved rows with an allowance, not measure Google coverage.

## 7. Accept the spreadsheet and record its limits

Before you use the file in a report or another process, apply these acceptance checks:

1. Match the request. Confirm the engine, executed query, country, language, and saved input settings.
2. Reconcile the rows. Compare the original dataset count with the imported observation count. Explain any difference.
3. Check the fields. Confirm that identifiers, addresses, query text, and times survived import.
4. Separate the counts. Report observations and unique destinations under a stated address rule.
5. Preserve unknowns. Keep missing values distinct from zero and empty text where the source permits that distinction.
6. Attach the stop evidence. Record the final state, known failures, and reason collection ended.
7. Write the coverage statement. State the cap, saved rows, unique destinations, settings, actual check time, and source limits.

If observation times are missing, say so. If you record your own inspection time, label it as your inspection time. Do not place it in `observedAt` as though the source supplied it.

A clean spreadsheet does not prove that destination pages are accessible or relevant. If your next step is page collection, review the destinations separately. The [Bing crawl queue guide](/en/articles/web-crawl-queue/) explains that later review task. Its search source is Bing; use it to understand destination acceptance, rejection, and unresolved checks.

Add another query only when it serves a stated need. You might need a different topic term or market. Keep that search as another defined sample. Repeating searches does not establish completeness.

## Make one checked export before expanding

Start with one query and a small cap in the [Chronometrica Google Search Scraper — contract checked October 25, 2026; no paid run for this guide](https://apify.com/chronometrica/google-search-scraper). Replace the sample values, save the input, and inspect the completed collection before exporting.

Accept the spreadsheet when its row count, preserved fields, destination count, and stop evidence agree. Then decide whether you need another defined search, destination review, or owner-only site records. Carry the coverage statement with the file so its limits remain clear.

## Sources

- [Google site search guidance — checked October 25, 2026; site results are not exhaustive and do not prove a complete site inventory](https://developers.google.com/search/docs/monitor-debug/search-operators/all-search-site)
- [Chronometrica Google Search Scraper — checked October 25, 2026; public documented inputs and result fields, no paid runtime test](https://apify.com/chronometrica/google-search-scraper)
- [Public default build 1.0.15 — checked October 25, 2026; input rules and matching output contract inspected, sample not run](https://api.apify.com/v2/acts/mlmVX4amk2biciJaB/builds/default)
- [Export Search Results to CSV Task — checked October 25, 2026; public page and preset presence verified, saved input not inspected or run](https://apify.com/chronometrica/google-search-scraper/examples/export-search-results-to-csv)
- [Public Custom Search spreadsheet question — observed August 11, 2026; publication date unknown, one question does not establish Actor compatibility](https://www.reddit.com/r/excel/comments/13daysg/does_anyone_know_how_i_can_export_google_search)