| name | gws-docs |
| version | 1.1.0 |
| description | Google Docs CLI operations via gws. Use when users need to read, create, or edit Google Docs documents. Triggers: google docs, document, gdoc, word processing. |
| metadata | {"short-description":"Google Docs CLI operations","compatibility":"claude-code, codex-cli"} |
Google Docs (gws docs)
gws docs provides CLI access to Google Docs with structured JSON output.
Disclaimer: gws is not the official Google CLI. This is an independent, open-source project not endorsed by or affiliated with Google.
Dependency Check
Before executing any gws command, verify the CLI is installed:
gws version
If not found, install: go install github.com/omriariav/workspace-cli/cmd/gws@latest
Authentication
Requires OAuth2 credentials. Run gws auth status to check.
If not authenticated: gws auth login (opens browser for OAuth consent).
For initial setup, see the gws-auth skill.
Quick Command Reference
| Task | Command |
|---|
| Read a document | gws docs read <doc-id> |
| Read with formatting | gws docs read <doc-id> --include-formatting |
| Get document info | gws docs info <doc-id> |
| Create a document | gws docs create --title "My Doc" |
| Create with markdown | gws docs create --title "My Doc" --text "# Heading\n\n**Bold**" |
| Create with plain text | gws docs create --title "My Doc" --text "Plain" --content-format plaintext |
| Append text | gws docs append <doc-id> --text "New paragraph" |
| Insert text at position | gws docs insert <doc-id> --text "Hello" --at 1 |
| Find and replace | gws docs replace <doc-id> --find "old" --replace "new" |
| Replace all content | gws docs replace-content <doc-id> --text "# New content" |
| Replace from file | gws docs replace-content <doc-id> --file ./content.md |
| Delete content | gws docs delete <doc-id> --from 5 --to 10 |
| Add a table | gws docs add-table <doc-id> --rows 3 --cols 4 |
| Format text | gws docs format <doc-id> --from 1 --to 10 --bold |
| Set paragraph style | gws docs set-paragraph-style <doc-id> --from 1 --to 100 --alignment CENTER |
| Set heading style | gws docs set-paragraph-style <doc-id> --from 1 --to 100 --style HEADING_1 |
| Add a list | gws docs add-list <doc-id> --at 1 --type bullet --items "A;B;C" |
| Remove list | gws docs remove-list <doc-id> --from 1 --to 50 |
| Trash document | gws docs trash <doc-id> |
| Permanently delete | gws docs trash <doc-id> --permanent |
| Add a tab | gws docs add-tab <doc-id> --title "Tab 2" |
| Delete a tab | gws docs delete-tab <doc-id> --tab-id <id> |
| Rename a tab | gws docs rename-tab <doc-id> --tab-id <id> --title "New Name" |
| Read specific tab | gws docs read <doc-id> --tab "Tab 2" |
| Add an image | gws docs add-image <doc-id> --uri <url> |
| Insert table row | gws docs insert-table-row <doc-id> --table-start 5 --row 0 --col 0 |
| Delete table row | gws docs delete-table-row <doc-id> --table-start 5 --row 0 --col 0 |
| Insert table column | gws docs insert-table-col <doc-id> --table-start 5 --row 0 --col 0 |
| Delete table column | gws docs delete-table-col <doc-id> --table-start 5 --row 0 --col 0 |
| Merge table cells | gws docs merge-cells <doc-id> --table-start 5 --row 0 --col 0 --row-span 2 --col-span 2 |
| Unmerge table cells | gws docs unmerge-cells <doc-id> --table-start 5 --row 0 --col 0 --row-span 2 --col-span 2 |
| Pin header rows | gws docs pin-rows <doc-id> --table-start 5 --count 1 |
| Insert page break | gws docs page-break <doc-id> --at 10 |
| Insert section break | gws docs section-break <doc-id> --at 10 |
| Add header | gws docs add-header <doc-id> |
| Delete header | gws docs delete-header <doc-id> <header-id> |
| Add footer | gws docs add-footer <doc-id> |
| Delete footer | gws docs delete-footer <doc-id> <footer-id> |
| Add named range | gws docs add-named-range <doc-id> --name "range1" --from 1 --to 10 |
| Delete named range | gws docs delete-named-range <doc-id> --name "range1" |
| Add footnote | gws docs add-footnote <doc-id> --at 5 |
| Delete object | gws docs delete-object <doc-id> <object-id> |
| Replace image | gws docs replace-image <doc-id> --object-id <id> --uri <url> |
| Replace named range | gws docs replace-named-range <doc-id> --name "range1" --text "new" |
| Update doc margins | gws docs update-style <doc-id> --margin-top 72 |
| Update section style | gws docs update-section-style <doc-id> --from 1 --to 100 --column-count 2 |
| Update cell style | gws docs update-table-cell-style <doc-id> --table-start 5 --row 0 --col 0 --bg-color "#FF0000" |
| Update column width | gws docs update-table-col-properties <doc-id> --table-start 5 --col-index 0 --width 200 |
| Update row height | gws docs update-table-row-style <doc-id> --table-start 5 --row 0 --min-height 50 |
Detailed Usage
read โ Read document content
gws docs read <document-id> [flags]
Flags:
--include-formatting โ Include formatting information and element positions
Use --include-formatting to see position indices needed for insert, delete, and add-table.
info โ Get document info
gws docs info <document-id>
Gets metadata about a Google Doc (title, ID, revision info).
create โ Create a new document
gws docs create --title <title> [flags]
Flags:
--title string โ Document title (required)
--text string โ Initial text content
--content-format string โ Content format: markdown (default), plaintext, or richformat
Examples:
gws docs create --title "Meeting Notes"
gws docs create --title "Report" --text "# Q4 Summary\n\n**Revenue** grew 15%"
gws docs create --title "Plain" --text "No formatting" --content-format plaintext
append โ Append text
gws docs append <document-id> --text <text> [flags]
Flags:
--text string โ Text to append (required)
--newline โ Add newline before appending (default: true)
--content-format string โ Content format: markdown (default), plaintext, or richformat
insert โ Insert text at position
gws docs insert <document-id> --text <text> [flags]
Flags:
--text string โ Text to insert (required)
--at int โ Position to insert at (1-based index, default: 1)
--content-format string โ Content format: markdown (default), plaintext, or richformat
Position 1 is the start of the document content. Use gws docs read <id> --include-formatting to see element positions.
replace โ Find and replace text
gws docs replace <document-id> --find <text> --replace <text> [flags]
Flags:
--find string โ Text to find (required)
--replace string โ Replacement text (required)
--match-case โ Case-sensitive matching (default: true)
replace-content โ Replace all document content
gws docs replace-content <document-id> --text "# New content"
gws docs replace-content <document-id> --file ./content.md
Flags:
--text string โ Replacement text
--file string โ Read content from file (alternative to --text)
--content-format string โ Content format: markdown (default), plaintext, or richformat
Replaces the entire document body while preserving the doc ID, permissions, comments, and revision history. Provide exactly one of --text or --file.
delete โ Delete content
gws docs delete <document-id> --from <pos> --to <pos>
Flags:
--from int โ Start position (1-based index, required)
--to int โ End position (1-based index, required)
Use gws docs read <id> --include-formatting to see position indices.
add-table โ Add a table
gws docs add-table <document-id> [flags]
Flags:
--rows int โ Number of rows (default: 3)
--cols int โ Number of columns (default: 3)
--at int โ Position to insert at (1-based index, default: 1)
format โ Format text style
gws docs format <document-id> [flags]
Flags:
--from int โ Start position (1-based index, required)
--to int โ End position (1-based index, required)
--bold โ Make text bold
--italic โ Make text italic
--font-size int โ Font size in points
--color string โ Text color (hex, e.g., "#FF0000")
--font-family string โ Font family (e.g., "Arial", "David Libre")
set-paragraph-style โ Set paragraph style
gws docs set-paragraph-style <document-id> [flags]
Flags:
--from int โ Start position (1-based index, required)
--to int โ End position (1-based index, required)
--alignment string โ Paragraph alignment: START, CENTER, END, JUSTIFIED
--line-spacing float โ Line spacing multiplier (e.g., 1.15, 1.5, 2.0)
--style string โ Named style: NORMAL_TEXT, TITLE, SUBTITLE, HEADING_1..HEADING_6
--direction string โ Text direction: LEFT_TO_RIGHT or RIGHT_TO_LEFT
add-list โ Add a bullet or numbered list
gws docs add-list <document-id> [flags]
Flags:
--at int โ Position to insert at (1-based index, default: 1)
--type string โ List type: bullet or numbered (default: bullet)
--items string โ List items separated by semicolons (required)
remove-list โ Remove list formatting
gws docs remove-list <document-id> [flags]
Flags:
--from int โ Start position (1-based index, required)
--to int โ End position (1-based index, required)
trash โ Trash or permanently delete a document
gws docs trash <document-id> [flags]
Flags:
--permanent โ Permanently delete instead of trashing (cannot be undone)
Content Formats
The --content-format flag controls how --text input is handled for create, append, and insert.
| Format | Description |
|---|
markdown (default) | Text is inserted as-is with markdown syntax preserved. Select the text in Google Docs and use "Paste from Markdown" to apply formatting. |
plaintext | Text is inserted as-is with no markdown syntax expected. |
richformat | --text is parsed as a JSON array of Google Docs API Request objects, passed directly to BatchUpdate. |
Markdown example:
gws docs create --title "Report" --text "# Summary\n\n- Item **one**\n- Item *two*"
Richformat example:
gws docs create --title "Styled" --text '[{"insertText":{"location":{"index":1},"text":"Hello World"}},{"updateTextStyle":{"range":{"startIndex":1,"endIndex":6},"textStyle":{"bold":true},"fields":"bold"}}]' --content-format richformat
Output Modes
gws docs read <doc-id> --format json
gws docs read <doc-id> --format yaml
gws docs read <doc-id> --format text
Tips for AI Agents
- Always use
--format json (the default) for programmatic parsing
- To get position indices for insert/delete/add-table, first run
gws docs read <id> --include-formatting
- Positions are 1-based (1 = start of document content)
append is the simplest way to add content โ it adds to the end with an automatic newline
replace replaces ALL occurrences in the document, not just the first one
- Document IDs can be extracted from Google Docs URLs:
docs.google.com/document/d/<ID>/edit
- For comments on a doc, use
gws drive comments <doc-id>
- Use
--quiet on write operations to suppress JSON output in scripts