with one click
google-workspace-recipes
// Cookbook of multi-step Google Workspace workflows (Gmail + Drive + Calendar + Docs + Sheets + Tasks).
// Cookbook of multi-step Google Workspace workflows (Gmail + Drive + Calendar + Docs + Sheets + Tasks).
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | google-workspace-recipes |
| version | 1.0.0 |
| description | Cookbook of multi-step Google Workspace workflows (Gmail + Drive + Calendar + Docs + Sheets + Tasks). |
| tags | ["skills","google-workspace","recipes","cookbook"] |
| metadata | {"openclaw":{"category":"recipe","domain":"productivity","requires":{"bins":["gws"]}}} |
| triggers | ["google workspace recipes","use google workspace recipes","run google workspace recipes"] |
Multi-step recipes combining
gwsCLI commands. Each recipe solves a concrete productivity workflow. Single source of truth — replaces 41 individualrecipe-*skill files. [[skills/INDEX]] | [[brain/CAPABILITIES]]
gws binary must be on $PATH. See skills/gws-shared/SKILL.md for auth and global flags.gws-gmail, gws-drive, etc.).Create a Gmail filter to automatically label, star, or categorize incoming messages.
Requires: gws-gmail
gws gmail users labels list --params '{"userId": "me"}' --format tablegws gmail users labels create --params '{"userId": "me"}' --json '{"name": "Receipts"}'gws gmail users settings filters create --params '{"userId": "me"}' --json '{"criteria": {"from": "receipts@example.com"}, "action": {"addLabelIds": ["LABEL_ID"], "removeLabelIds": ["INBOX"]}}'gws gmail users settings filters list --params '{"userId": "me"}' --format tableEnable a Gmail out-of-office auto-reply with a custom message and date range.
Requires: gws-gmail
gws gmail users settings updateVacation --params '{"userId": "me"}' --json '{"enableAutoReply": true, "responseSubject": "Out of Office", "responseBodyPlainText": "I am out of the office until Jan 20. For urgent matters, contact backup@company.com.", "restrictToContacts": false, "restrictToDomain": false}'gws gmail users settings getVacation --params '{"userId": "me"}'gws gmail users settings updateVacation --params '{"userId": "me"}' --json '{"enableAutoReply": false}'Read content from a Google Doc and use it as the body of a Gmail message.
Requires: gws-docs, gws-gmail
gws docs documents get --params '{"documentId": "DOC_ID"}'gws gmail +send --to recipient@example.com --subject 'Newsletter Update' --body 'CONTENT_FROM_DOC'Share a Google Drive file and email the link with a message to recipients.
Requires: gws-drive, gws-gmail
gws drive files list --params '{"q": "name = '\''Quarterly Report'\''"}'gws drive permissions create --params '{"fileId": "FILE_ID"}' --json '{"role": "reader", "type": "user", "emailAddress": "client@example.com"}'gws gmail +send --to client@example.com --subject 'Quarterly Report' --body 'Hi, please find the report here: https://docs.google.com/document/d/FILE_ID'Find Gmail messages with a specific label and forward them to another address.
Requires: gws-gmail
gws gmail users messages list --params '{"userId": "me", "q": "label:needs-review"}' --format tablegws gmail users messages get --params '{"userId": "me", "id": "MSG_ID"}'[Original Message Body]'`
Apply Gmail labels to matching messages and archive them to keep your inbox clean.
Requires: gws-gmail
gws gmail users messages list --params '{"userId": "me", "q": "from:notifications@service.com"}' --format tablegws gmail users messages modify --params '{"userId": "me", "id": "MESSAGE_ID"}' --json '{"addLabelIds": ["LABEL_ID"]}'gws gmail users messages modify --params '{"userId": "me", "id": "MESSAGE_ID"}' --json '{"removeLabelIds": ["INBOX"]}'Find Gmail messages with attachments and save them to a Google Drive folder.
Requires: gws-gmail, gws-drive
gws gmail users messages list --params '{"userId": "me", "q": "has:attachment from:client@example.com"}' --format tablegws gmail users messages get --params '{"userId": "me", "id": "MESSAGE_ID"}'gws gmail users messages attachments get --params '{"userId": "me", "messageId": "MESSAGE_ID", "id": "ATTACHMENT_ID"}'gws drive +upload --file ./attachment.pdf --parent FOLDER_IDSave a Gmail message body into a Google Doc for archival or reference.
Requires: gws-gmail, gws-docs
gws gmail users messages list --params '{"userId": "me", "q": "subject:important from:boss@company.com"}' --format tablegws gmail users messages get --params '{"userId": "me", "id": "MSG_ID"}'gws docs documents create --json '{"title": "Saved Email - Important Update"}'[EMAIL BODY]'`
Export a Google Sheets spreadsheet as a CSV file for local backup or processing.
Requires: gws-sheets, gws-drive
gws sheets spreadsheets get --params '{"spreadsheetId": "SHEET_ID"}'gws drive files export --params '{"fileId": "SHEET_ID", "mimeType": "text/csv"}'gws sheets +read --spreadsheet SHEET_ID --range 'Sheet1' --format csvList and download all files from a Google Drive folder.
Requires: gws-drive
gws drive files list --params '{"q": "'\''FOLDER_ID'\'' in parents"}' --format jsongws drive files get --params '{"fileId": "FILE_ID", "alt": "media"}' -o filename.extgws drive files export --params '{"fileId": "FILE_ID", "mimeType": "application/pdf"}' -o document.pdfCreate a Google Shared Drive and add members with appropriate roles.
Requires: gws-drive
gws drive drives create --params '{"requestId": "unique-id-123"}' --json '{"name": "Project X"}'gws drive permissions create --params '{"fileId": "DRIVE_ID", "supportsAllDrives": true}' --json '{"role": "writer", "type": "user", "emailAddress": "member@company.com"}'gws drive permissions list --params '{"fileId": "DRIVE_ID", "supportsAllDrives": true}'Identify large Google Drive files consuming storage quota.
Requires: gws-drive
gws drive files list --params '{"orderBy": "quotaBytesUsed desc", "pageSize": 20, "fields": "files(id,name,size,mimeType,owners)"}' --format tableCreate a Google Drive folder structure and move files into the right locations.
Requires: gws-drive
gws drive files create --json '{"name": "Q2 Project", "mimeType": "application/vnd.google-apps.folder"}'gws drive files create --json '{"name": "Documents", "mimeType": "application/vnd.google-apps.folder", "parents": ["PARENT_FOLDER_ID"]}'gws drive files update --params '{"fileId": "FILE_ID", "addParents": "FOLDER_ID", "removeParents": "OLD_PARENT_ID"}'gws drive files list --params '{"q": "FOLDER_ID in parents"}' --format tableShare a Google Drive folder and all its contents with a list of collaborators.
Requires: gws-drive
gws drive files list --params '{"q": "name = '\''Project X'\'' and mimeType = '\''application/vnd.google-apps.folder'\''"}'gws drive permissions create --params '{"fileId": "FOLDER_ID"}' --json '{"role": "writer", "type": "user", "emailAddress": "colleague@company.com"}'gws drive permissions create --params '{"fileId": "FOLDER_ID"}' --json '{"role": "reader", "type": "user", "emailAddress": "stakeholder@company.com"}'gws drive permissions list --params '{"fileId": "FOLDER_ID"}' --format tableSubscribe to change notifications on a Google Drive file or folder.
Requires: gws-events
gws events subscriptions create --json '{"targetResource": "//drive.googleapis.com/drives/DRIVE_ID", "eventTypes": ["google.workspace.drive.file.v1.updated"], "notificationEndpoint": {"pubsubTopic": "projects/PROJECT/topics/TOPIC"}, "payloadOptions": {"includeResource": true}}'gws events subscriptions listgws events +renew --subscription SUBSCRIPTION_IDAdd a list of attendees to an existing Google Calendar event and send notifications.
Requires: gws-calendar
gws calendar events get --params '{"calendarId": "primary", "eventId": "EVENT_ID"}'gws calendar events patch --params '{"calendarId": "primary", "eventId": "EVENT_ID", "sendUpdates": "all"}' --json '{"attendees": [{"email": "alice@company.com"}, {"email": "bob@company.com"}, {"email": "carol@company.com"}]}'gws calendar events get --params '{"calendarId": "primary", "eventId": "EVENT_ID"}'Create recurring focus time blocks on Google Calendar to protect deep work hours.
Requires: gws-calendar
gws calendar events insert --params '{"calendarId": "primary"}' --json '{"summary": "Focus Time", "description": "Protected deep work block", "start": {"dateTime": "2025-01-20T09:00:00", "timeZone": "America/New_York"}, "end": {"dateTime": "2025-01-20T11:00:00", "timeZone": "America/New_York"}, "recurrence": ["RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"], "transparency": "opaque"}'gws calendar +agendaRead event data from a Google Sheets spreadsheet and create Google Calendar entries for each row.
Requires: gws-sheets, gws-calendar
gws sheets +read --spreadsheet SHEET_ID --range "Events!A2:D"gws calendar +insert --summary 'Team Standup' --start '2026-01-20T09:00:00' --end '2026-01-20T09:30:00' --attendee alice@company.com --attendee bob@company.comQuery Google Calendar free/busy status for multiple users to find a meeting slot.
Requires: gws-calendar
gws calendar freebusy query --json '{"timeMin": "2024-03-18T08:00:00Z", "timeMax": "2024-03-18T18:00:00Z", "items": [{"id": "user1@company.com"}, {"id": "user2@company.com"}]}'gws calendar +insert --summary 'Meeting' --attendee user1@company.com --attendee user2@company.com --start '2024-03-18T14:00:00' --end '2024-03-18T14:30:00'Review your Google Calendar week, identify gaps, and add events to fill them.
Requires: gws-calendar
gws calendar +agendagws calendar freebusy query --json '{"timeMin": "2025-01-20T00:00:00Z", "timeMax": "2025-01-25T00:00:00Z", "items": [{"id": "primary"}]}'gws calendar +insert --summary 'Deep Work Block' --start '2026-01-21T14:00:00' --end '2026-01-21T16:00:00'gws calendar +agendaMove a Google Calendar event to a new time and automatically notify all attendees.
Requires: gws-calendar
gws calendar +agendagws calendar events get --params '{"calendarId": "primary", "eventId": "EVENT_ID"}'gws calendar events patch --params '{"calendarId": "primary", "eventId": "EVENT_ID", "sendUpdates": "all"}' --json '{"start": {"dateTime": "2025-01-22T14:00:00", "timeZone": "America/New_York"}, "end": {"dateTime": "2025-01-22T15:00:00", "timeZone": "America/New_York"}}'Create a recurring Google Calendar event with attendees.
Requires: gws-calendar
gws calendar events insert --params '{"calendarId": "primary"}' --json '{"summary": "Weekly Standup", "start": {"dateTime": "2024-03-18T09:00:00", "timeZone": "America/New_York"}, "end": {"dateTime": "2024-03-18T09:30:00", "timeZone": "America/New_York"}, "recurrence": ["RRULE:FREQ=WEEKLY;BYDAY=MO"], "attendees": [{"email": "team@company.com"}]}'gws calendar +agenda --days 14 --format tableShare Google Drive files with all attendees of a Google Calendar event.
Requires: gws-calendar, gws-drive
gws calendar events get --params '{"calendarId": "primary", "eventId": "EVENT_ID"}'gws drive permissions create --params '{"fileId": "FILE_ID"}' --json '{"role": "reader", "type": "user", "emailAddress": "attendee@company.com"}'gws drive permissions list --params '{"fileId": "FILE_ID"}' --format tableRetrieve and review responses from a Google Form.
Requires: gws-forms
gws forms forms list (if you don't have the form ID)gws forms forms get --params '{"formId": "FORM_ID"}'gws forms forms responses list --params '{"formId": "FORM_ID"}' --format tableRead data from two tabs in a Google Sheet to compare and identify differences.
Requires: gws-sheets
gws sheets +read --spreadsheet SHEET_ID --range "January!A1:D"gws sheets +read --spreadsheet SHEET_ID --range "February!A1:D"Duplicate a Google Sheets template tab for a new month of tracking.
Requires: gws-sheets
gws sheets spreadsheets get --params '{"spreadsheetId": "SHEET_ID"}'gws sheets spreadsheets sheets copyTo --params '{"spreadsheetId": "SHEET_ID", "sheetId": 0}' --json '{"destinationSpreadsheetId": "SHEET_ID"}'gws sheets spreadsheets batchUpdate --params '{"spreadsheetId": "SHEET_ID"}' --json '{"requests": [{"updateSheetProperties": {"properties": {"sheetId": 123, "title": "February 2025"}, "fields": "title"}}]}'Copy a Google Docs template, fill in content, and share with collaborators.
Requires: gws-drive, gws-docs
gws drive files copy --params '{"fileId": "TEMPLATE_DOC_ID"}' --json '{"name": "Project Brief - Q2 Launch"}'Launch the new feature by end of Q2.'4. Share with team:gws drive permissions create --params '{"fileId": "NEW_DOC_ID"}' --json '{"role": "writer", "type": "user", "emailAddress": "team@company.com"}'`
Create a Google Form for feedback and share it via Gmail.
Requires: gws-forms, gws-gmail
gws forms forms create --json '{"info": {"title": "Event Feedback", "documentTitle": "Event Feedback Form"}}'gws gmail +send --to attendees@company.com --subject 'Please share your feedback' --body 'Fill out the form: FORM_URL'Create a new Google Slides presentation and add initial slides.
Requires: gws-slides
gws slides presentations create --json '{"title": "Quarterly Review Q2"}'gws drive permissions create --params '{"fileId": "PRESENTATION_ID"}' --json '{"role": "writer", "type": "user", "emailAddress": "team@company.com"}'Read data from a Google Sheet and create a formatted Google Docs report.
Requires: gws-sheets, gws-docs, gws-drive
gws sheets +read --spreadsheet SHEET_ID --range "Sales!A1:D"gws docs documents create --json '{"title": "Sales Report - January 2025"}'Total deals: 45 Revenue: $125,000
gws drive permissions create --params '{"fileId": "DOC_ID"}' --json '{"role": "reader", "type": "user", "emailAddress": "cfo@company.com"}'Share a Google Docs document with edit access and email collaborators the link.
Requires: gws-drive, gws-docs, gws-gmail
gws drive files list --params '{"q": "name contains '\''Project Brief'\'' and mimeType = '\''application/vnd.google-apps.document'\''"}'gws drive permissions create --params '{"fileId": "DOC_ID"}' --json '{"role": "writer", "type": "user", "emailAddress": "reviewer@company.com"}'gws gmail +send --to reviewer@company.com --subject 'Please review: Project Brief' --body 'I have shared the project brief with you: https://docs.google.com/document/d/DOC_ID'Export Google Contacts directory to a Google Sheets spreadsheet.
Requires: gws-people, gws-sheets
gws people people listDirectoryPeople --params '{"readMask": "names,emailAddresses,phoneNumbers", "sources": ["DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE"], "pageSize": 100}' --format jsongws sheets +append --spreadsheet SHEET_ID --range 'Contacts' --values '["Name", "Email", "Phone"]'gws sheets +append --spreadsheet SHEET_ID --range 'Contacts' --values '["Jane Doe", "jane@company.com", "+1-555-0100"]'Create a Google Meet meeting space and share the join link.
Requires: gws-meet, gws-gmail
gws meet spaces create --json '{"config": {"accessType": "OPEN"}}'gws gmail +send --to team@company.com --subject 'Join the meeting' --body 'Join here: MEETING_URI'Review who attended a Google Meet conference and for how long.
Requires: gws-meet
gws meet conferenceRecords list --format tablegws meet conferenceRecords participants list --params '{"parent": "conferenceRecords/CONFERENCE_ID"}' --format tablegws meet conferenceRecords participants participantSessions list --params '{"parent": "conferenceRecords/CONFERENCE_ID/participants/PARTICIPANT_ID"}' --format tableSend a team announcement via both Gmail and a Google Chat space.
Requires: gws-gmail, gws-chat
gws gmail +send --to team@company.com --subject 'Important Update' --body 'Please review the attached policy changes.'gws chat +send --space spaces/TEAM_SPACE --text '📢 Important Update: Please check your email for policy changes.'Set up a new Google Tasks list with initial tasks.
Requires: gws-tasks
gws tasks tasklists insert --json '{"title": "Q2 Goals"}'gws tasks tasks insert --params '{"tasklist": "TASKLIST_ID"}' --json '{"title": "Review Q1 metrics", "notes": "Pull data from analytics dashboard", "due": "2024-04-01T00:00:00Z"}'gws tasks tasks insert --params '{"tasklist": "TASKLIST_ID"}' --json '{"title": "Draft Q2 OKRs"}'gws tasks tasks list --params '{"tasklist": "TASKLIST_ID"}' --format tableFind Google Tasks that are past due and need attention.
Requires: gws-tasks
gws tasks tasklists list --format tablegws tasks tasks list --params '{"tasklist": "TASKLIST_ID", "showCompleted": false}' --format tableCreate a Google Classroom course and invite students.
Requires: gws-classroom
gws classroom courses create --json '{"name": "Introduction to CS", "section": "Period 1", "room": "Room 101", "ownerId": "me"}'gws classroom invitations create --json '{"courseId": "COURSE_ID", "userId": "student@school.edu", "role": "STUDENT"}'gws classroom courses students list --params '{"courseId": "COURSE_ID"}' --format tableSet up a Google Sheets spreadsheet for tracking expenses with headers and initial entries.
Requires: gws-sheets, gws-drive
gws drive files create --json '{"name": "Expense Tracker 2025", "mimeType": "application/vnd.google-apps.spreadsheet"}'gws sheets +append --spreadsheet SHEET_ID --range 'Sheet1' --values '["Date", "Category", "Description", "Amount"]'gws sheets +append --spreadsheet SHEET_ID --range 'Sheet1' --values '["2025-01-15", "Travel", "Flight to NYC", "450.00"]'gws drive permissions create --params '{"fileId": "SHEET_ID"}' --json '{"role": "reader", "type": "user", "emailAddress": "manager@company.com"}'Append a deal status update to a Google Sheets sales tracking spreadsheet.
Requires: gws-sheets, gws-drive
gws drive files list --params '{"q": "name = '\''Sales Pipeline'\'' and mimeType = '\''application/vnd.google-apps.spreadsheet'\''"}'gws sheets +read --spreadsheet SHEET_ID --range "Pipeline!A1:F"gws sheets +append --spreadsheet SHEET_ID --range 'Pipeline' --values '["2024-03-15", "Acme Corp", "Proposal Sent", "$50,000", "Q2", "jdoe"]'Create a Google Docs post-mortem, schedule a Google Calendar review, and notify via Chat.
Requires: gws-docs, gws-calendar, gws-chat
gws docs +write --title 'Post-Mortem: [Incident]' --body '## Summary\n\n## Timeline\n\n## Root Cause\n\n## Action Items'gws calendar +insert --summary 'Post-Mortem Review: [Incident]' --attendee team@company.com --start '2026-03-16T14:00:00' --end '2026-03-16T15:00:00'gws chat +send --space spaces/ENG_SPACE --text '🔍 Post-mortem scheduled for [Incident].'