OpenClaw Google Workspace 教學

Windows WSL Docker Gws 教學

第一步 建立 Google Cloud Project

 Google Cloud Console 建立一個新的 projectgws OAuth 需要 GCP project 作為前提。

注意:202633日起,Google Cloud 已開始強制執行兩步驟驗證

建立完成兩步驟驗證,進入專案頁面

按下「新增專案」

在左邊欄位中點選[API與服務>OAuth同意畫面]

進入OAuth總覽頁面,按下「開始」

這代表開始設定 Google 驗證平台,也就是 OAuth app 的基本資料

應用程式目標選擇外部

輸入完成電子郵件後,按下同意條款後建立專案

建立完成後,進入目標對象頁面

注意,不要點擊「發布應用程式」,先保持「測試」狀態

如果有多個測試對象,可以加入「測試使用者」

我增加一個的測試用的帳號,記得增加自己的帳號

如果沒加 Test users,後面 gws auth login 很容易直接被擋

到「用戶端」建立 OAuth Client,先進入「用戶端」頁面

Client 類型一定要選 Desktop app,不要選 Web application,選錯最常見就是後面出現 redirect_uri_mismatch

設定適當的用戶端名稱

會得到用戶端密碼

下載 client JSON

如果還在「OAuth用戶端已建立」畫面,可以直接按下「下載JSON

如果已經退出了畫面,可以點擊名稱,進入指定用戶端頁面

按下右下的「下載」符號,即可取得JSON

接下來要把json放在openclaw的設置中

方法1,使用指令移動

使用指令,直接放在gws資料夾

1. 找到 Windows 下載檔

通常在:

C:\Users\你的Windows帳號\Downloads\

WSL 內對應是:

/mnt/c/Users/你的Windows帳號/Downloads/

2. 複製到 WSL gws 設定目錄

mkdir -p ~/.config/gws
cp /mnt/c/Users/
你的Windows帳號/Downloads/client_secret_*.json ~/.config/gws/client_secret.json

3. 確認

ls -la ~/.config/gws

你應該會看到:

client_secret.json

方法2 使用檔案總管直接移動

下載回來名稱為「client_secret_...json」將名稱更改為「client_secret.json

開啟資料夾 \\wsl.localhost\Ubuntu\home\使用者名稱

手動建立資料夾.config\gws

將剛剛下載並改名的json檔案貼入到資料夾內

確認檔案在WSL是否可以讀取

ls -l ~/.config/gws/client_secret.json

WSL 終端機 執行這幾行:

export PATH="$HOME/.cargo/bin:$PATH"
hash -r
which gws
gws --version

如果這樣成功,再把它永久寫進 shell

echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
which gws
gws --version

WSL 主機完成 OAuth,產生真正可用的 credentials.json

你已經把 client_secret.json 放在正確位置了,也就是:

/home/cg/.config/gws/client_secret.json

所以接著只要:

ls -l ~/.config/gws/client_secret.json
gws auth login -s drive
mkdir -p ~/openclaw/secrets/gws
gws auth export --unmasked > ~/openclaw/secrets/gws/credentials.json
ls -lh ~/openclaw/secrets/gws/credentials.json

快速安裝 (進入docker容器強制安裝)

docker compose exec -u root openclaw-gateway bash

# 1) 確認 npm 全域安裝位置

echo "$NPM_CONFIG_PREFIX"

ls -la "$NPM_CONFIG_PREFIX/bin"

# 2) gws 放到所有使用者都找得到的 PATH 位置

ln -sf "$NPM_CONFIG_PREFIX/bin/gws" /usr/local/bin/gws

hash -r

# 3) 確認 gws 可執行

which gws

gws --version

# 4) 下載 gws repo

git clone --depth=1 https://github.com/googleworkspace/cli.git /opt/gws-repo

# 5) 注意:skills 要放到 /home/node/.openclaw/skills,不是 /root/.openclaw/skills

mkdir -p /home/node/.openclaw/skills

ln -sfn /opt/gws-repo/skills/gws-shared   /home/node/.openclaw/skills/gws-shared

ln -sfn /opt/gws-repo/skills/gws-drive    /home/node/.openclaw/skills/gws-drive

ln -sfn /opt/gws-repo/skills/gws-gmail    /home/node/.openclaw/skills/gws-gmail

ln -sfn /opt/gws-repo/skills/gws-calendar /home/node/.openclaw/skills/gws-calendar

ln -sfn /opt/gws-repo/skills/gws-sheets   /home/node/.openclaw/skills/gws-sheets

# 6) 確認 skills 已建立

ls -la /home/node/.openclaw/skills/

exit

docker compose restart openclaw-gateway

驗證安裝

docker compose exec openclaw-gateway sh -lc 'which gws && gws --version'

docker compose exec openclaw-gateway sh -lc 'ls -1 /home/node/.openclaw/skills | grep "^gws-"'

如果這兩條有正常輸出,代表:

第一次 OAuth 登入(先只開 Drive

先確認 client_secret.json 在位,再做登入

ls -l ~/.config/gws/client_secret.json

gws auth login -s drive

如果已看到 Google Drive 已勾選,直接按 Enter 即可

[x] 代表已經選取,圖中顯示2/2 selected

如果沒有選取,可以使用空白鍵切換

確認完畢後會出現網址,開啟網頁並取得授權

按下繼續,這是自己的APP,允許存取

設定完成

回到WSL,會顯示已經完成設定

Drive 通過後,擴充到其他服務

gws auth login -s drive,gmail,calendar,sheets

可以選擇存取Google硬碟、Google表單、GmailGoogle日曆與雲端平台

確認完成後按下Enter進行下一步

進入網址後,設定OAuth授權

設定完成後,可以關閉視窗,回到WSL

回到WSL,設定已經完成

匯出 credentials.json Docker

這一步產生的是 credentials.json(不是 client_secret.json),這才是之後掛進容器的憑證

mkdir -p ~/openclaw/secrets/gws

gws auth export --unmasked > ~/openclaw/secrets/gws/credentials.json

ls -lh ~/openclaw/secrets/gws/credentials.json

接著進行測試,先確認終端是否有真的吃到gws設定

確認三件事:

WSL gws 可執行

credentials.json 已存在

容器端有吃到 GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE

# WSL

which gws

gws --version

ls -lh ~/openclaw/secrets/gws/credentials.json

# Docker / OpenClaw

docker compose exec openclaw-gateway sh -lc 'which gws && gws --version'

docker compose exec openclaw-gateway sh -lc 'echo "$GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE"'

docker compose exec openclaw-gateway sh -lc 'ls -1 /home/node/.openclaw/skills | grep "^gws-"'

測試1- Drive 只讀測試

先確認讀取權限正常

docker compose exec openclaw-gateway sh -lc \

  'gws drive files list --params '\''{"pageSize": 5}'\'''

如果出現這個訊息,代表容器缺少gws,或是路徑沒有打入到docker容器中

'gws drive files list --params '\''{"pageSize": 5}'\''' sh: 1: gws: not found

解決方式如下

1.      建立一個docker-compose.override.yml,內容如下(全部貼入)

services:

  openclaw-gateway:

    environment:

      NPM_CONFIG_PREFIX: /home/node/.openclaw/.npm-global

      PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers

      PATH: /home/node/.openclaw/.npm-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/node/.dotnet/tools

      GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /run/secrets/gws-credentials.json

      GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: file

    volumes:

      - ${GWS_CREDENTIALS_FILE:-./secrets/gws/credentials.json}:/run/secrets/gws-credentials.json:ro

  openclaw-cli:

    environment:

      NPM_CONFIG_PREFIX: /home/node/.openclaw/.npm-global

      PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers

      PATH: /home/node/.openclaw/.npm-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/node/.dotnet/tools

      GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /run/secrets/gws-credentials.json

      GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: file

    volumes:

      - ${GWS_CREDENTIALS_FILE:-./secrets/gws/credentials.json}:/run/secrets/gws-credentials.json:ro

2.      openclaw資料夾中使用記事本開啟.env

在最後面加入這一行

GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /run/secrets/gws-credentials.json

3.      重建容器

cd ~/openclaw

docker compose up -d --force-recreate

4.      在容器裡重新安裝 gws

docker compose exec -u root openclaw-gateway sh -lc '

echo "NPM_CONFIG_PREFIX=$NPM_CONFIG_PREFIX"

npm install -g @googleworkspace/[email protected]

which gws || ln -sf "$NPM_CONFIG_PREFIX/bin/gws" /usr/local/bin/gws

hash -r

which gws

gws --version

'

5.      然後立刻驗證這三條

docker compose exec openclaw-gateway sh -lc 'which gws && gws --version'

docker compose exec openclaw-gateway sh -lc 'echo "$GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE"'

docker compose exec openclaw-gateway sh -lc 'ls -l /run/secrets/gws-credentials.json'

第一條有 gws 路徑與版本

第二條輸出:/run/secrets/gws-credentials.json

第三條看得到檔案存在

再次驗證

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc 'which gws && gws --version'

如果三條都有訊息,再繼續測試1-Drive 只讀

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc \

  'gws drive files list --params '\''{"pageSize": 5}'\'''

第一次進入,可能會出現403,需要開啟權限,進入頁面中的網址,每一個專案的ID不同,需要自行複製網址後設置

按下啟用Google Drive API

確認開啟權限,重新測試,應該會看到雲端硬碟的檔案

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc \

  'gws drive files list --params '\''{"pageSize": 5}'\'''

測試2-建立 test.txt 並上傳到 Drive

先建立檔案:

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc \

  'printf "OpenClaw GWS upload test\ncreated_at=2026-03-13\n" > /tmp/gws-test.txt && ls -l /tmp/gws-test.txt'

再上傳:

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc \

  'gws drive +upload /tmp/gws-test.txt --name "openclaw-gws-test-2026-03-13.txt"'

開啟Google Drive時,可以看見剛剛建立的檔案” openclaw-gws-test-2026-03-13.txt”,代表串連成功了

下一個測試:建立明天的測試行事曆事件

docker compose \

  -f docker-compose.yml \

  exec openclaw-gateway sh -lc \

  'gws calendar events insert \

    --params '\''{"calendarId":"primary"}'\'' \

    --json '\''{

      "summary":"OpenClaw GWS 測試事件",

      "description":"這是一筆用來驗收 gws + OpenClaw 的測試事件",

      "start":{"dateTime":"2026-03-14T15:00:00+08:00","timeZone":"Asia/Taipei"},

      "end":{"dateTime":"2026-03-14T15:30:00+08:00","timeZone":"Asia/Taipei"}

    }'\'''

第一次使用時,也需要開啟權限,開啟訊息中的網址

啟用Google行事曆系統

重新測試

開啟Google行事曆,可以看到

代表成功建立行事曆了

接下來測試,由OpenClaw來的操控功能

建議先修改TOOLS.md,增加下列文字(不是覆蓋,是增加),需要明確告訴openclaw他有什麼技能,避免他使用錯誤的方法

## Google Workspacegws

目前環境已安裝並設定好 Google Workspace 工具,已可透過 gws 存取:

- Google Drive:列檔、搜尋、上傳、刪除

- Google Calendar:列日曆、列事件、建立事件、刪除事件

- Gmail:列標籤、讀取基本信箱資訊

- Google Sheets / Docs:若對應 gws skills 已安裝,則可使用

強制使用規則:

- 當使用者提到 Google DriveGoogle CalendarGmailGoogle SheetsGoogle Docs 時,必須優先使用 gws

- 不可自行改用 Python google-authgoogle-api-python-client、服務帳戶程式碼、自寫 OAuth 流程,除非使用者明確要求修改相關程式碼。

- 不可自行尋找或假設其他憑證路徑,例如:

  - ~/.config/google-credentials.json

  - ~/google-credentials.json

  - 任何未由目前環境明確提供的 Google 憑證檔

- gws 可用,禁止改用臨時 Python 腳本或其他自建認證方式存取 Google Workspace

- gws 執行失敗,必須回報實際的 gws / 工具錯誤,不可自行切換到其他 Google 認證方法。

WebChat / openclaw-control-ui 特別規則:

- WebChat / openclaw-control-ui 中,若目前環境已安裝 gws,應直接在當前執行環境使用 gws CLI

- 不要先嘗試 sessions_spawnthread=trueACP agentthread bindings 來操作 Google Workspace,除非使用者明確要求這種流程。

- 若要確認 gws 是否可用,先直接執行:

  - which gws

  - gws --version

  - echo $GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE

- 若上述檢查通過,再直接執行 gws 指令,不要先宣告「WebChat 不支援 Google Drive / Google Calendar 即時存取」。

操作規則:

- 探索、查詢、驗證狀態時,優先做 read-only 操作。

- 建立、上傳、刪除、修改等寫入操作時,嚴格依照使用者提供的內容執行。

- 若需求有歧義,先澄清,不可自行猜測。

- 若操作可能造成資料刪除、覆蓋、寄信、行程異動等風險,且使用者意圖不夠明確,應先確認。

- 寫入成功後,一律回傳資源 ID(例如 file idevent id)。

- 不可捏造 Google Workspace 結果;若工具失敗,必須明確說明。

建議回覆格式:

- Drive:檔名 + file id

- Calendar:事件標題 + 開始時間 + 結束時間 + 時區 + event id

- Gmail:簡潔摘要,避免冗長

- Sheets / Docs:文件標題 + 資源 id + 重要變更摘要

### 已驗證的 gws 指令格式

目前環境中,以下 gws 指令格式已驗證可用,應優先沿用,不要自行發明其他 CLI flags

#### 1. 基本檢查

- 檢查 gws 是否可用:

  which gws

  gws --version

  echo $GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE

#### 2. Google Drive(已驗證)

- 列出 Google Drive 5 個檔案:

  gws drive files list --params '{"pageSize": 5}'

- Drive 上傳測試(若目前環境已建立檔案):

  gws drive +upload /tmp/gws-test.txt --name "openclaw-gws-test.txt"

#### 3. Google Calendar(已驗證)

- 建立 Google Calendar 測試事件:

  gws calendar events insert --params '{"calendarId":"primary"}' --json '{"summary":"OpenClaw GWS 測試事件","description":"這是一筆用來驗收 gws + OpenClaw 的測試事件","start":{"dateTime":"2026-03-14T15:00:00+08:00","timeZone":"Asia/Taipei"},"end":{"dateTime":"2026-03-14T15:30:00+08:00","timeZone":"Asia/Taipei"}}'

- 讀取 Calendar 清單:

  gws calendar calendarList list

#### 4. 匯出認證(WSL / 有瀏覽器的機器)

- 匯出認證:

  gws auth export --unmasked > ~/openclaw/secrets/gws/credentials.json

### gws 指令規則

- 不要自行猜測 --limit--order-by--fields CLI flags,除非先查過當前版本的 gws --help 或官方 schema

- 不要使用 gws upload 當作頂層命令;Google Drive 上傳請優先使用 drive 相關 helper 或正式 drive commands

- 若不確定參數格式,先執行:

  - gws --help

  - gws drive --help

  - gws drive files --help

  - gws calendar --help

  - gws calendar events --help

### gws help 後續規則

- 若為了確認參數而先執行 gws --help / 子命令 --help,接下來必須繼續執行真正的目標命令。

- 不可只回傳 help 分析就停止。

- 若命令格式仍不確定,應明確回報「目前需要你確認哪個參數格式」,而不是停在 help

- 對於已驗證成功的命令格式,優先直接執行,不要重複停在 help

### Google Drive / Calendar 任務的具體行為

- 當使用者要求「列出雲端硬碟前幾個檔案」時,優先使用:

  gws drive files list --params '{"pageSize": N}'

- 當使用者要求「建立行事曆事件」時,應優先使用:

  gws calendar events insert

- 當使用者要求「確認事件是否建立成功」時,可先查 calendar list 或相關 events 查詢,再回傳標題、時間與 event id

- 進行 Calendar 建立後,回覆中必須明確列出:

  - 事件標題

  - 開始時間

  - 結束時間

  - 時區

  - event id

- 進行 Drive 上傳後,回覆中必須明確列出:

  - 檔名

  - file id

建議重啟容器,確保可以抓到最新設置

docker compose restart openclaw-gateway

測試1.1

使用強約束提示先測試一次

請直接使用目前環境已安裝好的 gws CLI,不要使用 sessions_spawnthread=trueACP agentPythongoogle-auth、服務帳戶程式碼或自寫 OAuth

先執行:

1. which gws

2. gws --version

3. echo $GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE

若以上正常,再執行:

gws drive files list --params '{"pageSize": 5}'

請回傳每一步的原始 stdout / stderr,最後再整理成簡短結論。

測試1.2 使用簡短句子詢問

使用gws工具幫我找到雲端硬碟的前五個檔案與ID

測試1.3 上傳檔案

幫我使用gws工具,建立test.txt文件後並上傳到google drive

測試2.1-建立Google行事曆

使用gws工具,建立一個明天的行事曆,名字為"OpenClaw測試"

確認行事曆建立完畢

測試2.2 查詢行事曆

幫我查詢明天的行程

若要跨重建容器保留 skills,正式版建議改用 Dockerfile

建立Dockerfile.gws

ARG BASE_IMAGE=openclaw

FROM ${BASE_IMAGE}

USER root

RUN set -eux; \

    if command -v apt-get >/dev/null 2>&1; then \

      apt-get update && \

      apt-get install -y --no-install-recommends git ca-certificates && \

      rm -rf /var/lib/apt/lists/*; \

    elif command -v apk >/dev/null 2>&1; then \

      apk add --no-cache git ca-certificates; \

    fi

# 安裝 gws,鎖版本

RUN npm install -g @googleworkspace/[email protected] && gws --version

# clone skills repo

RUN git clone --depth=1 https://github.com/googleworkspace/cli.git /opt/gws-repo

# bootstrap script:啟動時把 skills copy bind mount 目錄

RUN printf '#!/bin/sh\nset -eu\nSKILLS_DIR="/home/node/.openclaw/skills"\nmkdir -p "$SKILLS_DIR"\nfor s in gws-shared gws-drive gws-gmail gws-calendar gws-sheets; do\n  [ ! -e "$SKILLS_DIR/$s" ] && cp -R "/opt/gws-repo/skills/$s" "$SKILLS_DIR/$s"\ndone\n' \

    > /usr/local/bin/openclaw-gws-bootstrap.sh && \

    chmod +x /usr/local/bin/openclaw-gws-bootstrap.sh

ENV GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=file

USER node

建立docker-compose.override.yml

services:

  openclaw-gateway:

    image: openclaw:gws

    build:

      context: .

      dockerfile: Dockerfile.gws

    environment:

      GH_TOKEN: ${GH_TOKEN}

      GITHUB_TOKEN: ${GITHUB_TOKEN}

      NPM_CONFIG_PREFIX: /home/node/.openclaw/.npm-global

      PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers

      PATH: /home/node/.openclaw/.npm-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/node/.dotnet/tools

      GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /run/secrets/gws-credentials.json

      GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: file

    volumes:

      - ${GWS_CREDENTIALS_FILE:-./secrets/gws/credentials.json}:/run/secrets/gws-credentials.json:ro

  openclaw-cli:

    image: openclaw:gws

    environment:

      GH_TOKEN: ${GH_TOKEN}

      GITHUB_TOKEN: ${GITHUB_TOKEN}

      NPM_CONFIG_PREFIX: /home/node/.openclaw/.npm-global

      PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers

      PATH: /home/node/.openclaw/.npm-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/node/.dotnet/tools

      GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /run/secrets/gws-credentials.json

      GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: file

    volumes:

      - ${GWS_CREDENTIALS_FILE:-./secrets/gws/credentials.json}:/run/secrets/gws-credentials.json:ro

接著使用指令進行安裝(gws打入docker容器中)

DOCKER_BUILDKIT=0 docker build --no-cache -f Dockerfile.gws -t openclaw:gws .