Skip to main content
MySQL → Google Sheets

MySQL data in Google Sheets,
on the schedule you set.

Business teams get live MySQL data in the spreadsheet they already know — no SQL queries, no manual exports, no scripts. Describe the sync in plain English and rsync.ai handles the rest.

TL;DR

rsync.ai reads from MySQL using a read-only connection, maps column types to Google Sheets cell formats automatically, and writes rows to your target tab on the schedule you describe. Supports full replace (always consistent) and incremental append (faster for large tables). Works with MySQL 5.7+, RDS, Aurora, Cloud SQL, and PlanetScale. Google OAuth and service account auth both supported.

  • Plain-English schedule — 'every morning at 9am', 'every hour'
  • Auto column type mapping — TINYINT(1)→Checkbox, DECIMAL→Currency, DATETIME→Date
  • Incremental append or full replace — per pipeline
  • Multiple MySQL tables → multiple tabs in the same spreadsheet
How it works

How to sync MySQL to Google Sheets — 5 steps

From MySQL connection to scheduled Sheets refresh — typically under 5 minutes.

  1. 1

    Connect MySQL

    Provide your MySQL host, port (default 3306), username, password, and database name. rsync.ai opens a read-only connection — no binlog replication user required for the Sheets connector, just SELECT privileges on the tables you want to export. SSL/TLS and SSH tunnels are supported.

    mysql://user:pass@host:3306/mydb — SELECT privileges only
  2. 2

    Connect Google Sheets

    Authenticate via Google OAuth (your personal account) or a Google service account (recommended for production). With OAuth, rsync.ai gets access to the specific spreadsheet you share with it. With a service account, share the target spreadsheet with the service account email — rsync.ai will have editor access.

    OAuth or service account — share the spreadsheet with rsync.ai
  3. 3

    Describe the sync in plain English

    Type what you want: 'Export MySQL orders from the last 30 days to Sheet1 every morning at 9am.' or 'Refresh the products tab in my pricing spreadsheet every hour with MySQL data.' rsync.ai parses your intent, infers the SQL query, maps column types to Sheets cell formats, and proposes a target tab layout.

    No SQL · No YAML · No scripts
  4. 4

    Review the column type mapping

    rsync.ai shows each MySQL column and its proposed Google Sheets cell type — INT as Number, DATETIME as Date, VARCHAR as Text, TINYINT(1) as Checkbox, DECIMAL(10,2) as Currency, JSON as Text. You can adjust any mapping, rename columns, or exclude columns you don't want in the sheet.

    INT→Number · DATETIME→Date · TINYINT(1)→Checkbox
  5. 5

    Approve and schedule

    Approve the proposed tab layout. rsync.ai writes the first batch immediately so you can verify it looks right, then runs on the cadence you set. Each run either replaces the tab (full refresh) or appends new rows since the last run (incremental), based on your description.

    First run immediate — then scheduled on your cadence

MySQL → Google Sheets column type mapping

Standard mappings rsync.ai proposes. You can override any mapping or exclude columns in the review step.

MySQL columnGoogle Sheets cell typeNotes
id (INT)id (Number)MySQL INT maps to a Sheets Number cell. Integer formatting applied — no decimal places shown.
created_at (DATETIME)created_at (Date)MySQL DATETIME → Sheets Date with the format pattern you specify (default: YYYY-MM-DD HH:MM:SS). Timezone converted to UTC.
customer_name (VARCHAR(255))customer_name (Text)VARCHAR → plain Text cell. Cell width auto-sized to column name length on first write.
is_paid (TINYINT(1))is_paid (Checkbox)MySQL TINYINT(1) boolean convention → Google Sheets Checkbox cell. 1=checked, 0=unchecked.
total_amount (DECIMAL(10,2))total_amount (Currency)DECIMAL with 2 decimal places → Sheets Currency cell. Format pattern: $#,##0.00 by default (configurable).
metadata (JSON)metadata (Text)MySQL JSON column serialised as a JSON string in a Text cell. Nested objects are not expanded — use a PostgreSQL destination if you need queryable JSON.

rsync.ai vs. Zapier, Fivetran, manual CSV for MySQL → Google Sheets

How the options compare for keeping a spreadsheet in sync with MySQL.

Feature
rsync.aiyou
Zapier
Fivetran
Manual CSV
Plain-English pipeline setup
Scheduled MySQL → Sheets sync
Incremental (append new rows only)
Column-level PII masking / exclusion
Self-hosted (no SaaS relay)
Source-available connector code
No per-row / per-task pricing
Multiple tabs from multiple tables

MySQL to Google Sheets — frequently asked

How many rows can rsync.ai write to Google Sheets from MySQL?

Google Sheets has a hard limit of 10 million cells per spreadsheet and a practical row limit of around 200,000–500,000 rows per tab before performance degrades noticeably. For most use cases — daily order reports, weekly product summaries, monthly billing exports — this is more than enough. If you need more, consider MySQL → PostgreSQL or MySQL → S3 as a destination, and use Sheets only for summary/aggregated views.

Can rsync.ai do incremental updates to Google Sheets, or only full replace?

Both modes are supported. Full replace clears the tab and rewrites all rows on every run — simple and always consistent. Incremental mode appends rows where a timestamp or auto-increment column (e.g. `created_at`, `id`) is greater than the last synced value. Incremental is faster for large tables but doesn't update or delete existing rows — use full replace if rows in your MySQL table can change after insert.

Can I sync MySQL data into multiple tabs in the same Google Sheet?

Yes. You can set up multiple rsync.ai pipelines pointing to different tabs in the same spreadsheet — for example, one pipeline writes `orders` to the 'Orders' tab, another writes `products` to the 'Products' tab, and a third writes an aggregated summary to the 'Dashboard' tab. Each pipeline runs on its own schedule independently.

How does rsync.ai map MySQL column types to Google Sheets cell types?

MySQL INT, BIGINT, SMALLINT → Number. DECIMAL, FLOAT, DOUBLE → Number (or Currency if the column name contains 'price', 'amount', 'total', 'cost'). DATETIME, TIMESTAMP → Date with time. DATE → Date. TINYINT(1) → Checkbox. VARCHAR, CHAR, TEXT → Text. JSON, BLOB → Text (serialised as string). You can override any mapping in the column review step.

How does Google Sheets authentication work — OAuth vs. service account?

OAuth uses your personal Google account — rsync.ai redirects you through Google's consent screen and receives a refresh token scoped to the specific spreadsheet. Best for personal use or quick setup. Service account is recommended for production: create a service account in Google Cloud Console, download the JSON key, and share the target spreadsheet with the service account email (e.g. rsync-writer@your-project.iam.gserviceaccount.com). The service account gets editor access to only that spreadsheet.

What schedule options are available for MySQL → Google Sheets syncs?

You describe the schedule in plain English: 'every morning at 9am', 'every hour', 'every 15 minutes', 'on weekdays at 8am UTC'. rsync.ai converts this to a cron expression. The minimum interval is 5 minutes (Google Sheets API rate limits make shorter intervals unreliable). You can also trigger a manual run at any time from the rsync.ai UI.

Can I redact PII columns before they reach Google Sheets?

Yes. In the column review step you can mark columns as excluded (not written to Sheets at all), hashed (SHA-256 of the value), or truncated (first N characters only). This is useful when a business team needs access to order data in Sheets but should not see raw customer email addresses or phone numbers.

Is rsync.ai self-hosted for MySQL → Google Sheets?

Yes. rsync.ai runs on your own infrastructure via `docker compose up`. Your MySQL credentials and Google service account key are stored in a Postgres control plane you host. Row data flows directly from your MySQL instance to Google Sheets — nothing transits rsync.ai's servers. License is Elastic License 2.0 — free to self-host, cannot be resold as a managed service.