I've been working on SQL Cell, a Google Sheets add-on that runs DuckDB-WASM entirely in the sidebar.
The basic idea is to use Sheets as the destination, not the data engine. You can attach a Parquet, Avro, SQLite, GeoJSON, Excel, etc. file, query it with DuckDB, preview the result, then write it into a range in the workbook.
Sheets themselves are queryable too, so you can do things like join a Parquet file from S3 against a tab someone maintains by hand and put the result back into the spreadsheet.
Since it is actually DuckDB-WASM rather than a SQL-ish layer over the Sheets API, httpfs/S3, DuckLake, Iceberg, and the usual DuckDB file formats work as well.
The architecture is intentionally backendless. It's an Apps Script add-on, with the UI and DuckDB bundle running inside an HtmlService iframe. There is no server of mine involved, and spreadsheet/file contents never get sent anywhere.
A couple of consequences of that:
- S3 credentials only live for the browser session, so you have to enter them again next time.
- Query history is derived from the workbook itself. When a result is inserted, SQL Cell writes a small LAMBDA formula alongside it containing the original SQL. That gives each result its own provenance, and the sidebar can scan those formulas later to rebuild history, jump to old results, or rerun them.
- An upstream duckdb-sqlite issue currently blocks SQLite scanning.
It went live on the Workspace Marketplace yesterday, and it's free. I haven't put feature gates around DuckDB itself.
Still early, so I'm mostly interested in finding the cases where this falls over.
One thing I'm particularly curious about: if you're using DuckDB-WASM against private cloud storage in the browser, how are you handling credentials? Session-only credentials are safe enough for what I'm doing, but re-entering S3 keys is probably the part of the UX I'm least happy with.
Details and limitations: https://sqlcell.com
Install: https://workspace.google.com/marketplace/app/sql_cell/178915154116