Secure Google Sheets Writer Skill
A purpose-built skill for agent pipelines that write to one pre-configured spreadsheet — append, write to ranges, read for verification, all bound to PE_SHEET_ID.
google-sheets · append · automation · pipelines · etl
Example
Append today's 18 signups from this CSV to the leads sheet, and confirm the row count.
Target: PE_SHEET_ID=google:1Bx... (writes fail closed if unset) ok appended 18 rows after last row (INSERT_ROWS) verify: last row is now 1,204. Audit entry includes the row count.
Add to your agent
Steps 1–2 are identical for every agent — install the porteden binary and authenticate once. Step 3 registers the skill with your runtime.
Install the PortEden CLI
OpenClaw skills delegate every API call to the porteden binary. Install once with Homebrew or Go.
brew install porteden/tap/porteden # orgo install github.com/porteden/cli/cmd/porteden@latest Authenticate
Browser-based login is recommended — credentials are written to your OS keyring. Token-based login is available for headless environments.
porteden auth login # headless / CIporteden auth login --token <PE_API_KEY> porteden auth status Install the porteden-sheets-writer skill
OpenClaw fetches the signed skill bundle and registers its commands with the agent.
openclaw skills install porteden-sheets-writer The SKILL.md
The canonical, copy-paste-able skill definition your agent loads.
porteden sheets-writer
Automate Google Sheets updates with porteden sheets. This skill configures a target spreadsheet via environment variable so agents can append rows and write data without repeating the file ID. Use -jc flags for AI-optimized output.
If porteden is not installed: brew install porteden/tap/porteden (or go install github.com/porteden/cli/cmd/porteden@latest).
Setup
1. Authenticate (once)
- Browser login (recommended):
porteden auth login— opens browser, credentials stored in system keyring - Direct token:
porteden auth login --token <key>— stored in system keyring - Verify:
porteden auth status - If
PE_API_KEYis set in the environment, the CLI uses it automatically (no login needed). - Drive access requires a token with
driveAccessEnabled: trueand a connected Google account with Drive scopes.
2. Find and set the target spreadsheet
Search for the spreadsheet by name:
porteden drive files -q "Q1 Budget" --mime-type application/vnd.google-apps.spreadsheet -jcCopy the id field from the result (already provider-prefixed, e.g., google:1BxiMVs0XRA5...) and set it as the target:
export PE_SHEET_ID="google:1BxiMVs0XRA5nFMdKvBdBZjgmU..."To persist across sessions, add to your shell profile (~/.bashrc, ~/.zshrc) or .env file.
3. Test the connection
porteden sheets info $PE_SHEET_ID -jcExpected: returns spreadsheet title, sheet tabs, and dimensions. If this fails, verify the file ID and that your token has Drive access.
Writing data
Append rows (primary automation operation)
Append adds rows after the last row with data in the target range. This is the recommended operation for automation — it never overwrites existing data.
- Append from JSON:
bash porteden sheets append $PE_SHEET_ID --range "Sheet1!A:D" --values '[["2025-01-15","Order #1042","Shipped",29.99]]'
- Append multiple rows:
bash porteden sheets append $PE_SHEET_ID --range "Sheet1!A:D" --values '[["2025-01-15","Order #1042","Shipped",29.99],["2025-01-16","Order #1043","Processing",45.50]]'
- Append from CSV string:
bash porteden sheets append $PE_SHEET_ID --range "Sheet1!A:D" --csv "2025-01-15,Order #1042,Shipped,29.99"
- Append from CSV file:
bash porteden sheets append $PE_SHEET_ID --range "Sheet1!A:D" --csv-file ./new_rows.csv
Write to specific cells
Write replaces the exact range specified. Use for updating known cells or overwriting a section.
- Write a single cell:
bash porteden sheets write $PE_SHEET_ID --range "Sheet1!E2" --values '[["Complete"]]'
- Write a block:
bash porteden sheets write $PE_SHEET_ID --range "Sheet1!A1:C2" --values '[["Name","Status","Score"],["Alice","Done",95]]'
- Write from CSV file:
bash porteden sheets write $PE_SHEET_ID --range "Sheet1!A1" --csv-file ./data.csv
Read for verification
After writing, confirm the data landed correctly:
porteden sheets read $PE_SHEET_ID --range "Sheet1!A1:D10" -jcAutomation best practices
1. Always use append for new rows — avoids overwriting existing data. Use write only for targeted cell updates. 2. Specify column range in append (e.g., A:D not just A) — ensures data lands in the correct columns. 3. Use --raw for literal values — prevents unintended formula evaluation (e.g., strings starting with =). 4. Verify after write — read the range back to confirm data integrity in critical workflows. 5. Use -jc on read/info — compact JSON output minimizes tokens for AI agents. 6. Batch rows in a single append — send multiple rows in one --values array rather than one-row-at-a-time. 7. Match column order to the sheet header — check with porteden sheets read $PE_SHEET_ID --range "Sheet1!1:1" -jc to read the header row first.
Range format
- Open-ended columns (for append):
Sheet1!A:D - Specific cells:
Sheet1!A1:C10 - Single cell:
Sheet1!E2 - Whole sheet:
Sheet1 - Header row only:
Sheet1!1:1
Notes
- Credentials persist in the system keyring after login. No repeated auth needed.
- Set
PE_PROFILE=workto avoid repeating--profile. -jcis shorthand for--json --compact: strips noise, limits fields, reduces tokens for AI agents.- File IDs are always provider-prefixed (e.g.,
google:1BxiMVs0XRA5...). Pass them as-is. --values,--csv, and--csv-fileare mutually exclusive — provide exactly one.--csvinline: use\nas row separator (e.g.,"Name,Score\nAlice,95\nBob,87").--rawflag disables formula evaluation (values written literally, not parsed as formulas).accessInfoin responses describes active token restrictions.- Environment variables:
PE_API_KEY,PE_PROFILE,PE_SHEET_ID,PE_FORMAT,PE_COLOR,PE_VERBOSE.
How it works
Pin the target with PE_SHEET_ID
PE_SHEET_ID accepts the google: prefixed file ID. The skill rejects all writes if the env var is unset, so an unconfigured agent fails closed instead of writing to the wrong place.
export PE_SHEET_ID="google:1BxiMVs0XRA5..." porteden sheets info $PE_SHEET_ID -jc porteden sheets read $PE_SHEET_ID --range "Sheet1!1:1" -jc # header schema Append vs write
append finds the last non-empty row and writes after it (Google Sheets API valueInputOption=USER_ENTERED, insertDataOption=INSERT_ROWS). write overwrites the explicit range. Default to append in autonomous loops.
CSV import
--csv-file ./data.csv parses CSV server-side and appends in one batch. Useful for nightly ETL: the agent dumps a CSV, the skill writes it. Header row handling is controlled with --has-header.
The same firewall behind every PortEden skill
- Provision to teams with role-based access policies
- Identity-aware execution — every call ties back to a user
- Signed, version-pinned skills
- Full audit trail on every tool call
- Field-level redaction at egress
Frequently asked questions
How does it avoid writing to the wrong spreadsheet?
Does append ever overwrite history?
Can it back-fill from a file?
Which agents can install it?
Related Skills
Install Secure OpenClaw Google Sheets Writer Skill Without Inheriting the Audit Tail
Browser auth, keyring-bound credentials, server-side audit log. The same data firewall behind every PortEden integration.
Regulated org or 200+ seats? Talk to sales →