CLI
One binary, zero dependencies. Without a login, create, read, write, and query work on anonymous workbooks.
Install
npm install -g sheets-fast
Or run it without installing: npx sheets-fast create "My workbook".
Sign in
sheets login # opens your browser to approve
sheets whoami
Credentials land in ~/.config/sheets-fast/. For scripts and CI, set SHEETS_FAST_API_KEY instead; an explicit key wins over a stored login.
Work with a grid
sheets create "Q3 pipeline"
sheets write wbk_a8Kx92mQ3Fpq A1=region B1=revenue A2=East B2=1200 B3="=SUM(B2:B2)"
sheets append wbk_a8Kx92mQ3Fpq "West,800" "North,300"
sheets fill wbk_a8Kx92mQ3Fpq C2:C2 --to-row 40
sheets read 'wbk_a8Kx92mQ3Fpq!Sheet1!A1:B3' --format csv
sheets query wbk_a8Kx92mQ3Fpq 'SELECT region, SUM(revenue) FROM "Sheet1" GROUP BY 1'
Bulk-load a grid with --start: one comma-separated argument per row. Style ranges with style. Restructure with sheet.
sheets write wbk_a8Kx92mQ3Fpq --start A1 "region,revenue" "East,1200" "West,800"
sheets style wbk_a8Kx92mQ3Fpq B2:B40 --align right --num-fmt '$#,##0.00'
sheets sheet wbk_a8Kx92mQ3Fpq add Summary
sheets sheet wbk_a8Kx92mQ3Fpq insert-rows --at 2 --count 3
SQL writes and history
mutate runs INSERT, UPDATE, and DELETE over sheet tables as one atomic revision. Formula cells are protected unless you pass --overwrite-formulas. Every write is a revision; revert restores one as a new revision. Pass --if-revision N on any write to fail fast if someone else wrote first.
sheets mutate wbk_a8Kx92mQ3Fpq 'UPDATE "Sheet1" SET status=''won'' WHERE revenue > 1000'
sheets revisions wbk_a8Kx92mQ3Fpq
sheets revert wbk_a8Kx92mQ3Fpq 12 --yes
sheets write wbk_a8Kx92mQ3Fpq D2=updated --if-revision 14
Manage workbooks
sheets list
sheets get wbk_a8Kx92mQ3Fpq
sheets update wbk_a8Kx92mQ3Fpq --name "Pipeline" --description "Agents update column D."
sheets copy wbk_a8Kx92mQ3Fpq "Pipeline (backup)"
sheets export wbk_a8Kx92mQ3Fpq --format xlsx --out pipeline.xlsx
sheets claim wbk_a8Kx92mQ3Fpq
sheets delete wbk_a8Kx92mQ3Fpq --yes
Folders keep a big workspace tidy: folders lists them, and workbooks file into one with update --folder.
sheets folders add Finance
sheets update wbk_a8Kx92mQ3Fpq --folder fld_mv1MMDpWdo6S
sheets folders update fld_mv1MMDpWdo6S --name "Finance 2026"
sheets folders rm fld_mv1MMDpWdo6S --yes
Data in and out
sheets webhooks wbk_a8Kx92mQ3Fpq add https://example.com/hook --events row.added
sheets webhooks wbk_a8Kx92mQ3Fpq log whk_x71bPqM2nRds
sheets ingest wbk_a8Kx92mQ3Fpq add "stripe events"
Conventions
- One string addresses anything:
wbk_a8Kx92mQ3Fpq!Sheet1!A1:D50 is workbook, sheet, and range. --sheet takes a name or 0-based index. - Every command takes
--json for machine-readable output. - Values starting with = are formulas; quote them in your shell.