Google Sheets To Notion

To transfer Google Sheets to Notion, read approved spreadsheet rows, map their fields to the destination database’s property types and create a page for each accepted row. Record the returned Notion page identifier beside the source identifier before another transfer. The catalogue-based design below is one-way page creation, with an explicit review step for mapping and reruns.

Spreadsheet columns and Notion database properties are different contracts. A column named Status does not automatically match a valid select property or one of its allowed values.

By Ai Flowi · Published

Choose the source range and page identity

Identify the spreadsheet, tab and exact range you are permitted to read. Include a stable source ID with every row and agree which fields become Notion properties. Keep the selected range narrow enough to exclude unrelated private columns. Sorting or inserting rows changes their positions; use the source ID to identify the same record across batches.

Read Range exposes values as JSON. Loop’s data input lists Table and DataFrame, so do not connect Read Range straight to Loop on the strength of both representing collections. Convert reviewed mapped records through Data → DataFrame and inspect the Table first.

What you need from both providers

Authorize your Google account for the source sheet using Google connection setup, and supply your Notion account’s database credential through notion_secret; provider charges remain separate and this transfer has no model call.

Before selecting the batch, check that the Notion credential can inspect the intended database in a small local exercise.

Follow the Notion integration reference for List Database Properties and Create Page setup.

The transfer mapping should name the intended database alongside each target property. Two databases can have a property called Status while accepting different options. Review that choice against the database selected for this batch, rather than carrying over a mapping from a similarly named destination.

Configure a reviewed creation batch

example configuration, not a recorded test

Spreadsheet rows to Notion page creation
ComponentInputs to configureTask acceptance check
Read RangeChoose the approved header and data cells through range_name; identify their spreadsheet through spreadsheet_id and choose google_account.Check the selected range still maps positions to the approved source headers.
List Database PropertiesSet notion_secret and the intended database_id.The inspected schema belongs to this batch’s intended database.
JSON OperationsSelect "JQ Expression" through operations for the supplied data; write query to name the observed row fields and reject missing IDs.Every accepted row has a reviewed property mapping and source identity.
Data → DataFrame and LoopConnect mapped JSON into data_list, then the resulting dataframe into Loop.data.Each creation receipt must be matched by source ID, never merely by row position.
Create PageChoose database_id for this batch, pass the inspected property string in properties_json and provide its credential through notion_secret. If generated upstream, use a checked Message conversion.Open the created page and compare its status with the approved mapping decision.
  1. Read and label rows. Run Read Range on a test sheet. Map each observed position to an agreed header, preserving the stable source ID. Check trailing blank cells before treating a shortened row as missing columns.
  2. Inspect the Notion schema. Run List Database Properties separately. Write a mapping for each source field: target property name, expected type, handling for empty values and allowed options where relevant.
  3. Prepare accepted records. Use JSON Operations to construct only permitted fields. Stop the manual exercise when duplicate IDs, unknown status values or missing required content appear; do not silently create pages with partial mappings.
  4. Match each item to its receipt. Follow Loop’s wiring and ordering limitations for iteration setup. Check that each returned page ID is associated with the source ID carried by that creation request; compare IDs rather than pairing source rows and receipts by position.
  5. Create one page and retain its receipt. Prepare the property object according to the observed destination schema, convert it to a Message using Type Convert with output_type = "Message" if needed, and inspect that the resulting text is valid JSON. Feed it to Create Page’s properties_json.
  6. Record the source-to-page mapping. For this exercise, manually retain the source ID, returned page ID and outcome in a review log before selecting another row. No automatic write-back node is configured in this graph.

Map typed properties intentionally

In a hypothetical transfer, a spreadsheet row identifies a task as T-07 and gives its status as Waiting. If the destination database offers no matching status option, hold that row for a mapping decision. Do not substitute the first available option or create a misleading page with an apparently valid status. The reviewer can approve a specific destination option, correct the source or omit the row with a recorded reason. Retain that decision beside T-07 so the same ambiguity does not recur in the next batch.

Separate text, numeric quantities, dates and option-like values in your mapping sheet. A blank cell may mean “leave the property empty,” “reject this record” or “use an approved default”; decide explicitly. Never invent a date from ambiguous spreadsheet text just to satisfy a destination field.

For option properties, compare the source value with the destination’s permitted values. For text properties, preserve meaningful line breaks and punctuation. The component entry does not establish automatic relation resolution, attachment copying or rich-text conversion. Leave those fields outside the first transfer until their payload and behavior have been verified.

Prevent accidental creation on reruns

Create Page is a creation operation, not a documented upsert. If the same row is selected again, do not assume that its matching title will update the earlier page. Use the source-to-page receipt log to select only rows whose creation status is known to be incomplete.

When no reliable creation receipt returns, inspect the target database for this source ID before submitting the row again. The catalogue supplies no idempotency parameter for Create Page and no transactional link between creation and your receipt log. A page can exist even when the caller did not retain its identifier; stop and reconcile that outcome instead of automatically retrying.

Check the transfer before expanding it

Prepare synthetic rows covering a blank optional value, an invalid option, a leading-zero source ID and duplicate source IDs. Confirm the proposed validation excludes invalid records before creation. For one accepted row, inspect the destination property values and record its page ID; then confirm the selection process excludes that row from a second creation batch.

Check the range header after a spreadsheet column is inserted or renamed. If your projection maps positions, a shifted header must stop the process rather than move values into the wrong properties. Retain the source schema used for each batch so later changes remain explainable.

What limits apply to a Google Sheets to Notion transfer, and what are the alternatives?

This transfer is documented in the catalogue; not production-tested by Ai Flowi. No bidirectional sync, automatic edit reconciliation, complete pagination, loop-back behavior or safe retry mechanism is established. Choose an existing manual import when it already satisfies a one-off move, and avoid unattended batches until mapping and failure recovery have been checked.

For selected database properties moving in the reverse direction, read Notion To Google Sheets. For page-body text becoming a document snapshot, use Notion To Google Docs. Those are separate artifacts with separate identity rules.

Usage for per-row creation

Plans: Go from USD8/month billed yearly (USD10 monthly), Plus from USD16 (USD20 monthly), Pro 100 from USD80 (USD100 monthly), Pro 200 from USD160 (USD200 monthly) and Pro 500 from USD400 (USD500 monthly), with 5,000 to 250,000 Flowi Tokens/month and top-ups; 1 token per node run; third-party API and model usage is not included.

Inspect executions inside the iteration as well as the source read and Table conversion. A per-row create node may execute many times in a batch; one visible node in the graph does not mean one billed node run for the whole transfer.

References for spreadsheet transfers

Inspect property interfaces in the Notion reference. If upstream rows arrive through an HTTP intake, consult the webhook intake tutorial before selecting a transfer batch. The recipe index records other workflow scopes. Reverse database-property exports belong in Notion to Google Sheets; for fields still trapped in uploaded documents, use Document AI extraction first.