[{"data":1,"prerenderedAt":570},["ShallowReactive",2],{"content-\u002Fplugins\u002Faio-saas-tools\u002Faio-google-workspace":3,"children-\u002Fplugins\u002Faio-saas-tools\u002Faio-google-workspace":569},{"id":4,"title":5,"author":6,"body":7,"budget_tier":6,"build_tags":6,"created":6,"description":560,"document_type":561,"extension":562,"game":6,"install":36,"investment_tier":6,"league":6,"meta":563,"navigation":564,"patch":6,"path":565,"plugin":24,"profit_per_hour":6,"ratings":6,"seo":566,"skills_count":6,"status":6,"stem":567,"strategy_tier":6,"tags":6,"updated":6,"version":6,"weight":6,"__hash__":568},"content\u002Fplugins\u002Faio-saas-tools\u002Faio-google-workspace.md","aio-google-workspace",null,{"type":8,"value":9,"toc":520},"minimark",[10,37,42,47,63,70,74,87,91,101,106,206,209,213,217,223,227,233,235,239,243,249,252,258,260,264,267,273,276,282,284,288,291,297,300,306,308,312,318,320,324,330,332,336,342,344,348,354,356,360,366,368,372,378,380,384,391,397,399,403,406,412,416,422,426,430,436,440,446,450,456,460],[11,12,13],"blockquote",{},[14,15,16,17,25,26,25,30,33,34],"p",{},"From plugin ",[18,19,21],"a",{"href":20},"\u002Fplugins\u002Faio-saas-tools",[22,23,24],"strong",{},"aio-saas-tools"," · ",[27,28,29],"code",{},"v1.0.2",[22,31,32],{},"Install:"," ",[27,35,36],{},"\u002Fplugin install aio-saas-tools@aiocean-plugins",[38,39,41],"h1",{"id":40},"google-workspace-gws-cli","Google Workspace (gws CLI)",[43,44,46],"h2",{"id":45},"environment","Environment",[48,49,50,57],"ul",{},[51,52,53,54],"li",{},"gws: !",[27,55,56],{},"which gws 2>\u002Fdev\u002Fnull || echo \"NOT INSTALLED\"",[51,58,59,60],{},"gws auth: !",[27,61,62],{},"gws auth status 2>\u002Fdev\u002Fnull || echo \"NOT AUTHENTICATED — run: gws auth login\"",[14,64,65,66,69],{},"Interact with Google Workspace services using the ",[27,67,68],{},"gws"," CLI tool.",[43,71,73],{"id":72},"prerequisites","Prerequisites",[48,75,76,81],{},[51,77,78,80],{},[27,79,68],{}," CLI must be installed and authenticated",[51,82,83,84],{},"If auth errors occur, run: ",[27,85,86],{},"gws auth login",[43,88,90],{"id":89},"general-syntax","General Syntax",[92,93,99],"pre",{"className":94,"code":96,"language":97,"meta":98},[95],"language-bash","gws \u003Cservice> \u003Cresource> \u003Cmethod> --params '\u003CJSON>'\ngws \u003Cservice> +\u003Chelper> [args]           # Helper commands (shortcuts)\ngws schema \u003Cservice.resource.method>     # View API schema\n","bash","",[27,100,96],{"__ignoreMap":98},[102,103,105],"h3",{"id":104},"common-flags","Common Flags",[107,108,109,122],"table",{},[110,111,112],"thead",{},[113,114,115,119],"tr",{},[116,117,118],"th",{},"Flag",[116,120,121],{},"Description",[123,124,125,136,146,156,166,176,186,196],"tbody",{},[113,126,127,133],{},[128,129,130],"td",{},[27,131,132],{},"--params '\u003CJSON>'",[128,134,135],{},"URL\u002Fquery parameters",[113,137,138,143],{},[128,139,140],{},[27,141,142],{},"--json '\u003CJSON>'",[128,144,145],{},"Request body (POST\u002FPATCH\u002FPUT)",[113,147,148,153],{},[128,149,150],{},[27,151,152],{},"--upload \u003CPATH>",[128,154,155],{},"Upload file as media content",[113,157,158,163],{},[128,159,160],{},[27,161,162],{},"--output \u003CPATH>",[128,164,165],{},"Save binary response to file",[113,167,168,173],{},[128,169,170],{},[27,171,172],{},"--format \u003CFMT>",[128,174,175],{},"Output: json (default), table, yaml, csv",[113,177,178,183],{},[128,179,180],{},[27,181,182],{},"--page-all",[128,184,185],{},"Auto-paginate (NDJSON output)",[113,187,188,193],{},[128,189,190],{},[27,191,192],{},"--page-limit \u003CN>",[128,194,195],{},"Max pages (default: 10)",[113,197,198,203],{},[128,199,200],{},[27,201,202],{},"--dry-run",[128,204,205],{},"Validate without sending",[207,208],"hr",{},[43,210,212],{"id":211},"gmail","Gmail",[102,214,216],{"id":215},"helpers-preferred-for-common-tasks","Helpers (preferred for common tasks)",[92,218,221],{"className":219,"code":220,"language":97,"meta":98},[95],"# Send email\ngws gmail +send --params '{\"to\": \"user@example.com\", \"subject\": \"Hello\", \"body\": \"Message body\"}'\n\n# Triage inbox - show unread summary\ngws gmail +triage\n\n# Watch for new emails (streaming)\ngws gmail +watch\n",[27,222,220],{"__ignoreMap":98},[102,224,226],{"id":225},"direct-api","Direct API",[92,228,231],{"className":229,"code":230,"language":97,"meta":98},[95],"# List messages\ngws gmail users messages list --params '{\"userId\": \"me\", \"maxResults\": 10}'\n\n# List with query filter\ngws gmail users messages list --params '{\"userId\": \"me\", \"q\": \"from:boss@company.com is:unread\"}'\n\n# Get a specific message\ngws gmail users messages get --params '{\"userId\": \"me\", \"id\": \"MESSAGE_ID\"}'\n\n# Search emails\ngws gmail users messages list --params '{\"userId\": \"me\", \"q\": \"subject:invoice after:2025\u002F01\u002F01\"}'\n\n# List labels\ngws gmail users labels list --params '{\"userId\": \"me\"}'\n\n# Modify labels (archive = remove INBOX)\ngws gmail users messages modify --params '{\"userId\": \"me\", \"id\": \"MSG_ID\"}' --json '{\"removeLabelIds\": [\"INBOX\"]}'\n\n# List threads\ngws gmail users threads list --params '{\"userId\": \"me\", \"maxResults\": 5}'\n\n# Get thread\ngws gmail users threads get --params '{\"userId\": \"me\", \"id\": \"THREAD_ID\"}'\n",[27,232,230],{"__ignoreMap":98},[207,234],{},[43,236,238],{"id":237},"google-drive","Google Drive",[102,240,242],{"id":241},"helpers","Helpers",[92,244,247],{"className":245,"code":246,"language":97,"meta":98},[95],"# Upload a file\ngws drive +upload --params '{\"name\": \"report.pdf\", \"parent\": \"FOLDER_ID\"}' --upload .\u002Freport.pdf\n",[27,248,246],{"__ignoreMap":98},[102,250,226],{"id":251},"direct-api-1",[92,253,256],{"className":254,"code":255,"language":97,"meta":98},[95],"# List files (recent)\ngws drive files list --params '{\"pageSize\": 10, \"orderBy\": \"modifiedTime desc\"}'\n\n# List with fields\ngws drive files list --params '{\"pageSize\": 10, \"fields\": \"files(id,name,mimeType,modifiedTime,size)\"}'\n\n# Search files by name\ngws drive files list --params '{\"q\": \"name contains '\\''report'\\''\", \"pageSize\": 10}'\n\n# Search by type\ngws drive files list --params '{\"q\": \"mimeType='\\''application\u002Fpdf'\\''\", \"pageSize\": 10}'\n\n# List files in a folder\ngws drive files list --params '{\"q\": \"'\\''FOLDER_ID'\\'' in parents\", \"pageSize\": 20}'\n\n# Get file metadata\ngws drive files get --params '{\"fileId\": \"FILE_ID\"}'\n\n# Download file\ngws drive files get --params '{\"fileId\": \"FILE_ID\", \"alt\": \"media\"}' --output .\u002Fdownloaded-file\n\n# Export Google Doc as PDF\ngws drive files export --params '{\"fileId\": \"FILE_ID\", \"mimeType\": \"application\u002Fpdf\"}' --output .\u002Fdoc.pdf\n\n# Create folder\ngws drive files create --json '{\"name\": \"New Folder\", \"mimeType\": \"application\u002Fvnd.google-apps.folder\"}'\n\n# Move file to folder\ngws drive files update --params '{\"fileId\": \"FILE_ID\", \"addParents\": \"FOLDER_ID\", \"removeParents\": \"OLD_PARENT_ID\"}'\n\n# Share file (anyone with link)\ngws drive permissions create --params '{\"fileId\": \"FILE_ID\"}' --json '{\"role\": \"reader\", \"type\": \"anyone\"}'\n\n# Share with specific user\ngws drive permissions create --params '{\"fileId\": \"FILE_ID\"}' --json '{\"role\": \"writer\", \"type\": \"user\", \"emailAddress\": \"user@example.com\"}'\n\n# Delete file\ngws drive files delete --params '{\"fileId\": \"FILE_ID\"}'\n\n# Search across all drives\ngws drive files list --params '{\"q\": \"fullText contains '\\''quarterly report'\\''\", \"includeItemsFromAllDrives\": true, \"supportsAllDrives\": true}'\n",[27,257,255],{"__ignoreMap":98},[207,259],{},[43,261,263],{"id":262},"google-calendar","Google Calendar",[102,265,242],{"id":266},"helpers-1",[92,268,271],{"className":269,"code":270,"language":97,"meta":98},[95],"# Show upcoming events\ngws calendar +agenda\n\n# Create an event\ngws calendar +insert --params '{\"summary\": \"Team Standup\", \"start\": \"2025-03-20T09:00:00\", \"end\": \"2025-03-20T09:30:00\"}'\n",[27,272,270],{"__ignoreMap":98},[102,274,226],{"id":275},"direct-api-2",[92,277,280],{"className":278,"code":279,"language":97,"meta":98},[95],"# List upcoming events\ngws calendar events list --params '{\"calendarId\": \"primary\", \"timeMin\": \"2025-03-17T00:00:00Z\", \"maxResults\": 10, \"singleEvents\": true, \"orderBy\": \"startTime\"}'\n\n# Get event details\ngws calendar events get --params '{\"calendarId\": \"primary\", \"eventId\": \"EVENT_ID\"}'\n\n# Create event with attendees\ngws calendar events insert --params '{\"calendarId\": \"primary\"}' --json '{\n  \"summary\": \"Project Review\",\n  \"start\": {\"dateTime\": \"2025-03-20T14:00:00\", \"timeZone\": \"Asia\u002FHo_Chi_Minh\"},\n  \"end\": {\"dateTime\": \"2025-03-20T15:00:00\", \"timeZone\": \"Asia\u002FHo_Chi_Minh\"},\n  \"attendees\": [{\"email\": \"user@example.com\"}]\n}'\n\n# Update event\ngws calendar events patch --params '{\"calendarId\": \"primary\", \"eventId\": \"EVENT_ID\"}' --json '{\"summary\": \"Updated Title\"}'\n\n# Delete event\ngws calendar events delete --params '{\"calendarId\": \"primary\", \"eventId\": \"EVENT_ID\"}'\n\n# List calendars\ngws calendar calendarList list\n\n# Check free\u002Fbusy\ngws calendar freebusy query --json '{\n  \"timeMin\": \"2025-03-20T00:00:00Z\",\n  \"timeMax\": \"2025-03-21T00:00:00Z\",\n  \"items\": [{\"id\": \"primary\"}]\n}'\n",[27,281,279],{"__ignoreMap":98},[207,283],{},[43,285,287],{"id":286},"google-sheets","Google Sheets",[102,289,242],{"id":290},"helpers-2",[92,292,295],{"className":293,"code":294,"language":97,"meta":98},[95],"# Read values\ngws sheets +read --params '{\"spreadsheetId\": \"SHEET_ID\", \"range\": \"Sheet1!A1:D10\"}'\n\n# Append a row\ngws sheets +append --params '{\"spreadsheetId\": \"SHEET_ID\", \"range\": \"Sheet1!A:D\"}' --json '{\"values\": [[\"value1\", \"value2\", \"value3\", \"value4\"]]}'\n",[27,296,294],{"__ignoreMap":98},[102,298,226],{"id":299},"direct-api-3",[92,301,304],{"className":302,"code":303,"language":97,"meta":98},[95],"# Get spreadsheet info\ngws sheets spreadsheets get --params '{\"spreadsheetId\": \"SHEET_ID\"}'\n\n# Read a range\ngws sheets spreadsheets values get --params '{\"spreadsheetId\": \"SHEET_ID\", \"range\": \"Sheet1!A1:E20\"}'\n\n# Write values\ngws sheets spreadsheets values update --params '{\"spreadsheetId\": \"SHEET_ID\", \"range\": \"Sheet1!A1\", \"valueInputOption\": \"USER_ENTERED\"}' --json '{\"values\": [[\"Name\", \"Score\"], [\"Alice\", 95], [\"Bob\", 87]]}'\n\n# Batch read multiple ranges\ngws sheets spreadsheets values batchGet --params '{\"spreadsheetId\": \"SHEET_ID\", \"ranges\": [\"Sheet1!A:B\", \"Sheet2!A:C\"]}'\n\n# Create new spreadsheet\ngws sheets spreadsheets create --json '{\"properties\": {\"title\": \"New Spreadsheet\"}}'\n\n# Clear a range\ngws sheets spreadsheets values clear --params '{\"spreadsheetId\": \"SHEET_ID\", \"range\": \"Sheet1!A1:Z100\"}'\n",[27,305,303],{"__ignoreMap":98},[207,307],{},[43,309,311],{"id":310},"google-tasks","Google Tasks",[92,313,316],{"className":314,"code":315,"language":97,"meta":98},[95],"# List task lists\ngws tasks tasklists list\n\n# List tasks in a list\ngws tasks tasks list --params '{\"tasklist\": \"TASKLIST_ID\"}'\n\n# Create a task\ngws tasks tasks insert --params '{\"tasklist\": \"TASKLIST_ID\"}' --json '{\"title\": \"Review PR\", \"notes\": \"Check the auth changes\", \"due\": \"2025-03-20T00:00:00Z\"}'\n\n# Complete a task\ngws tasks tasks patch --params '{\"tasklist\": \"TASKLIST_ID\", \"task\": \"TASK_ID\"}' --json '{\"status\": \"completed\"}'\n\n# Delete a task\ngws tasks tasks delete --params '{\"tasklist\": \"TASKLIST_ID\", \"task\": \"TASK_ID\"}'\n\n# Create a task list\ngws tasks tasklists insert --json '{\"title\": \"Sprint 42\"}'\n",[27,317,315],{"__ignoreMap":98},[207,319],{},[43,321,323],{"id":322},"google-docs","Google Docs",[92,325,328],{"className":326,"code":327,"language":97,"meta":98},[95],"# Get document content\ngws docs documents get --params '{\"documentId\": \"DOC_ID\"}'\n\n# Create a document\ngws docs documents create --json '{\"title\": \"Meeting Notes\"}'\n\n# Batch update (insert text)\ngws docs documents batchUpdate --params '{\"documentId\": \"DOC_ID\"}' --json '{\n  \"requests\": [{\"insertText\": {\"location\": {\"index\": 1}, \"text\": \"Hello World\\n\"}}]\n}'\n",[27,329,327],{"__ignoreMap":98},[207,331],{},[43,333,335],{"id":334},"google-slides","Google Slides",[92,337,340],{"className":338,"code":339,"language":97,"meta":98},[95],"# Get presentation\ngws slides presentations get --params '{\"presentationId\": \"PRES_ID\"}'\n\n# Create presentation\ngws slides presentations create --json '{\"title\": \"Q1 Review\"}'\n\n# Get a specific page\u002Fslide\ngws slides presentations pages get --params '{\"presentationId\": \"PRES_ID\", \"pageObjectId\": \"PAGE_ID\"}'\n",[27,341,339],{"__ignoreMap":98},[207,343],{},[43,345,347],{"id":346},"google-chat","Google Chat",[92,349,352],{"className":350,"code":351,"language":97,"meta":98},[95],"# List spaces\ngws chat spaces list\n\n# Send message to space\ngws chat spaces messages create --params '{\"parent\": \"spaces\u002FSPACE_ID\"}' --json '{\"text\": \"Hello team!\"}'\n\n# List messages in space\ngws chat spaces messages list --params '{\"parent\": \"spaces\u002FSPACE_ID\", \"pageSize\": 10}'\n",[27,353,351],{"__ignoreMap":98},[207,355],{},[43,357,359],{"id":358},"google-people-contacts","Google People (Contacts)",[92,361,364],{"className":362,"code":363,"language":97,"meta":98},[95],"# List contacts\ngws people people connections list --params '{\"resourceName\": \"people\u002Fme\", \"personFields\": \"names,emailAddresses,phoneNumbers\", \"pageSize\": 20}'\n\n# Search contacts\ngws people people searchContacts --params '{\"query\": \"John\", \"readMask\": \"names,emailAddresses\"}'\n",[27,365,363],{"__ignoreMap":98},[207,367],{},[43,369,371],{"id":370},"cross-service-workflows","Cross-Service Workflows",[92,373,376],{"className":374,"code":375,"language":97,"meta":98},[95],"# Standup report (today's meetings + open tasks)\ngws workflow +standup-report\n\n# Meeting prep (agenda, attendees, linked docs)\ngws workflow +meeting-prep\n\n# Convert email to task\ngws workflow +email-to-task --params '{\"messageId\": \"MSG_ID\"}'\n\n# Weekly digest (meetings + unread count)\ngws workflow +weekly-digest\n\n# Announce a Drive file in Chat\ngws workflow +file-announce --params '{\"fileId\": \"FILE_ID\", \"spaceId\": \"SPACE_ID\"}'\n",[27,377,375],{"__ignoreMap":98},[207,379],{},[43,381,383],{"id":382},"schema-discovery","Schema Discovery",[14,385,386,387,390],{},"Use ",[27,388,389],{},"gws schema"," to explore any API method's parameters:",[92,392,395],{"className":393,"code":394,"language":97,"meta":98},[95],"# View method parameters\ngws schema drive.files.list\ngws schema gmail.users.messages.list\ngws schema calendar.events.insert\n\n# Resolve nested references\ngws schema calendar.events.insert --resolve-refs\n",[27,396,394],{"__ignoreMap":98},[207,398],{},[43,400,402],{"id":401},"pagination","Pagination",[14,404,405],{},"For large result sets:",[92,407,410],{"className":408,"code":409,"language":97,"meta":98},[95],"# Auto-paginate all results (NDJSON, one JSON per page)\ngws drive files list --params '{\"pageSize\": 100}' --page-all\n\n# Limit to 5 pages\ngws drive files list --params '{\"pageSize\": 100}' --page-all --page-limit 5\n\n# Add delay between pages (rate limiting)\ngws gmail users messages list --params '{\"userId\": \"me\"}' --page-all --page-delay 200\n",[27,411,409],{"__ignoreMap":98},[43,413,415],{"id":414},"output-formats","Output Formats",[92,417,420],{"className":418,"code":419,"language":97,"meta":98},[95],"# Table format (human-readable)\ngws drive files list --params '{\"pageSize\": 5}' --format table\n\n# CSV (for spreadsheet import)\ngws drive files list --params '{\"pageSize\": 100}' --format csv\n\n# YAML\ngws calendar events list --params '{\"calendarId\": \"primary\", \"maxResults\": 5}' --format yaml\n",[27,421,419],{"__ignoreMap":98},[43,423,425],{"id":424},"common-patterns","Common Patterns",[102,427,429],{"id":428},"find-a-file-then-share-it","Find a file then share it",[92,431,434],{"className":432,"code":433,"language":97,"meta":98},[95],"# 1. Search for file\ngws drive files list --params '{\"q\": \"name = '\\''Budget 2025'\\''\"}' --format table\n# 2. Share with team (use fileId from step 1)\ngws drive permissions create --params '{\"fileId\": \"FILE_ID\"}' --json '{\"role\": \"writer\", \"type\": \"user\", \"emailAddress\": \"team@company.com\"}'\n",[27,435,433],{"__ignoreMap":98},[102,437,439],{"id":438},"check-inbox-then-reply","Check inbox then reply",[92,441,444],{"className":442,"code":443,"language":97,"meta":98},[95],"# 1. Triage unread\ngws gmail +triage\n# 2. Read specific message (use id from triage)\ngws gmail users messages get --params '{\"userId\": \"me\", \"id\": \"MSG_ID\"}'\n# 3. Reply\ngws gmail +send --params '{\"to\": \"sender@example.com\", \"subject\": \"Re: Original Subject\", \"body\": \"Thanks for the update.\", \"threadId\": \"THREAD_ID\"}'\n",[27,445,443],{"__ignoreMap":98},[102,447,449],{"id":448},"morning-productivity-check","Morning productivity check",[92,451,454],{"className":452,"code":453,"language":97,"meta":98},[95],"# Run all three\ngws gmail +triage\ngws calendar +agenda\ngws workflow +standup-report\n",[27,455,453],{"__ignoreMap":98},[43,457,459],{"id":458},"errors","Errors",[107,461,462,472],{},[110,463,464],{},[113,465,466,469],{},[116,467,468],{},"Error",[116,470,471],{},"Fix",[123,473,474,487,497,507],{},[113,475,476,481],{},[128,477,478],{},[27,479,480],{},"401 Unauthorized",[128,482,483,484,486],{},"Run ",[27,485,86],{}," to re-authenticate",[113,488,489,494],{},[128,490,491],{},[27,492,493],{},"403 Forbidden",[128,495,496],{},"Check scopes — may need broader OAuth consent",[113,498,499,504],{},[128,500,501],{},[27,502,503],{},"404 Not Found",[128,505,506],{},"Verify resource ID (fileId, eventId, etc.)",[113,508,509,514],{},[128,510,511],{},[27,512,513],{},"429 Rate Limit",[128,515,386,516,519],{},[27,517,518],{},"--page-delay"," for bulk operations",{"title":98,"searchDepth":521,"depth":521,"links":522},2,[523,524,525,529,533,537,541,545,546,547,548,549,550,551,552,553,554,559],{"id":45,"depth":521,"text":46},{"id":72,"depth":521,"text":73},{"id":89,"depth":521,"text":90,"children":526},[527],{"id":104,"depth":528,"text":105},3,{"id":211,"depth":521,"text":212,"children":530},[531,532],{"id":215,"depth":528,"text":216},{"id":225,"depth":528,"text":226},{"id":237,"depth":521,"text":238,"children":534},[535,536],{"id":241,"depth":528,"text":242},{"id":251,"depth":528,"text":226},{"id":262,"depth":521,"text":263,"children":538},[539,540],{"id":266,"depth":528,"text":242},{"id":275,"depth":528,"text":226},{"id":286,"depth":521,"text":287,"children":542},[543,544],{"id":290,"depth":528,"text":242},{"id":299,"depth":528,"text":226},{"id":310,"depth":521,"text":311},{"id":322,"depth":521,"text":323},{"id":334,"depth":521,"text":335},{"id":346,"depth":521,"text":347},{"id":358,"depth":521,"text":359},{"id":370,"depth":521,"text":371},{"id":382,"depth":521,"text":383},{"id":401,"depth":521,"text":402},{"id":414,"depth":521,"text":415},{"id":424,"depth":521,"text":425,"children":555},[556,557,558],{"id":428,"depth":528,"text":429},{"id":438,"depth":528,"text":439},{"id":448,"depth":528,"text":449},{"id":458,"depth":521,"text":459},"Interact with Google Workspace services (Gmail, Drive, Calendar, Sheets, Docs, Tasks) via the gws CLI.","skill","md",{},true,"\u002Fplugins\u002Faio-saas-tools\u002Faio-google-workspace",{"title":5,"description":560},"plugins\u002Faio-saas-tools\u002Faio-google-workspace","XUzOd2kdShxY7l-QwhFcluyqec_UpPVHotVbXNBAXBU",[],1779707416790]