Home / Software / n8n / n8n + Google Sheets: Automate Your Spreadsheets

n8n + Google Sheets: Automate Your Spreadsheets

n8n + Google Sheets: Automate Your Spreadsheets

If you run a small business and still find yourself copying data from web forms into a spreadsheet, manually sending follow-up emails, or checking a Google Sheet every morning to see whether something has changed, n8n can take all of that off your plate. Google Sheets is the backbone of spreadsheet work for thousands of UK SMBs using Google Workspace, and n8n connects to it natively — meaning you can build automation workflows that read, write, and monitor your spreadsheets without writing a single line of code. This guide walks through the credential setup and three practical workflows you can build today.

Connecting Google Sheets to n8n

The Google Sheets integration in n8n uses OAuth2, which works the same way as the Gmail credential. You will need a Google Cloud Console project with the Google Sheets API (and Google Drive API) enabled. Go to console.cloud.google.com, create a project, navigate to APIs & Services > Library, and enable both APIs. Then go to Credentials > Create Credentials > OAuth 2.0 Client ID, set the application type to Web application, and add your n8n instance URL plus /rest/oauth2-credential/callback as an authorised redirect URI.

Back in n8n, go to Credentials > New > Google Sheets OAuth2 API, paste in your Client ID and Client Secret, then click Connect my account. Google will ask you to authorise access — accept, and you are connected. One credential works across all your Google Sheets nodes.

Understanding the Google Sheets Node Operations

The Google Sheets node in n8n supports four core operations. Append Row adds a new row at the bottom of your data — ideal for logging. Get All Rows reads every row from a sheet and returns them as individual items you can loop over or filter. Update Row modifies a specific row by its row number. Delete Row removes a row entirely. For most business automation, you will use Append and Get All Rows most frequently, with Update Row to mark records as processed.

One important tip: structure your spreadsheets with clear, consistent column headers in row one, no merged cells, and one data type per column. n8n uses the header row to map fields, so a column called Email Address with spaces will appear in expressions as Email Address — keep headers simple, like email, name, or submission_date, to avoid awkward expression syntax.

Workflow 1: Log Form Submissions to a Spreadsheet

Nodes: Webhook Trigger → Google Sheets (Append Row) → Send Email

This workflow captures any HTTP POST — from a Typeform, a contact form, or your own website — and logs it to a master spreadsheet before firing a confirmation email. In n8n, add a Webhook node and copy the generated URL into your form’s webhook settings. When a submission arrives, the Webhook node receives the payload as JSON.

Add a Google Sheets node, set the operation to Append Row, select your spreadsheet and sheet, then map the incoming fields to your columns using n8n expressions. For example, to populate the name column, set the value to {{ $json.name }}. The {{ }} syntax lets you reference data from any previous node — $json refers to the current item’s data, and .fieldName picks the specific field. You can also use {{ $now.toISO() }} to stamp the submission date automatically.

Finally, add a Send Email node. Set the To field to {{ $json.email }} and write a confirmation body referencing the submitter’s name. Every enquiry from your website now lands in your spreadsheet and triggers a professional acknowledgement — no manual data entry required.

Workflow 2: Read a Spreadsheet and Send Personalised Emails

Nodes: Schedule Trigger → Google Sheets (Get All Rows) → IF → Send Email → Google Sheets (Update Row)

This workflow is ideal for renewal reminders, drip sequences, or any situation where you have a list of contacts and want to email each one exactly once. Set up your spreadsheet with columns such as name, email, message, and emailed. Leave the emailed column blank for contacts you have not yet reached.

Add a Schedule Trigger — daily at 8am works well for most use cases. Connect a Google Sheets node set to Get All Rows. This returns every row as a separate item. Add an IF node and set the condition to: {{ $json.emailed }} is empty. This filters out anyone already contacted.

Connect the true branch to a Send Email node. Use expressions to personalise: set the subject to Hi {{ $json.name }}, your renewal is due and build the body using {{ $json.message }} or any other column. After the email node, add a second Google Sheets node set to Update Row. Set the row number to {{ $json.row_number }} (n8n automatically includes this when reading rows) and set the emailed column value to {{ $now.format('yyyy-MM-dd') }}. Each contact is emailed once, and the spreadsheet updates itself to record the date.

Workflow 3: Monitor for Changes and Send Alerts

Nodes: Schedule Trigger → Google Sheets (Get All Rows) → IF → Slack or Send Email

This workflow is useful if you maintain a KPI tracker, a price monitoring sheet, or any spreadsheet where a change in a value should trigger an alert. Run it hourly using a Schedule Trigger. Add a Google Sheets node to read the relevant row or value — for a single monitored cell, use Get All Rows and filter by a known identifier column.

The trick for detecting change is n8n’s static data feature. In a Code node (or using the workflow’s built-in static data via $getWorkflowStaticData('global')), store the last known value after each run. On the next execution, compare the current value from the sheet against the stored value using an IF node: {{ $json.price }} does not equal {{ $getWorkflowStaticData('global').lastPrice }}.

If the condition is true, route to a Slack node or Send Email node with an alert: Value changed to {{ $json.price }}. Then update the static data store with the new value so the next run has a fresh baseline. This approach means your spreadsheet becomes a live monitoring dashboard — and you only hear about it when something actually changes.

Tips for Cleaner Workflows

  • Always use the header row option in the Google Sheets node — it maps column names automatically and makes expressions readable.
  • Keep date columns in ISO format (YYYY-MM-DD) so n8n can compare and sort them reliably.
  • Use a dedicated automation sheet within a workbook (e.g. a tab called n8n_log) rather than writing into your main data tab — it keeps things clean and auditable.
  • When referencing data from a node that is not the immediately previous one, use {{ $('Node Name').item.json.fieldName }} to reach back to any earlier node in the workflow.

These three workflows replace hours of weekly manual effort — the kind of copy-paste, check-and-email routine that quietly costs UK small business owners entire afternoons. Once built, they run silently in the background, keeping your spreadsheets accurate and your contacts informed without you lifting a finger.