Google Workspace CLI × Claude Code 実務ワークフロー 2026 — Gmail自動化・Sheets連携・GA4コピペ廃止の実装パターン
gws CLI(google workspace CLI)とClaude Codeを組み合わせた実務ワークフロー完全ガイド。Gmail自動化・Sheets連携・GA4データ取得のコピペ作業をゼロにする実装パターン、GWS CLI vs MCP判断基準、Model Armor連携まで解説。
エンジニアのゆとです。
「毎週月曜に同じ操作をしている」——その典型が、Google Workspace関連の定型作業だ。
Analyticsのデータをコピーしてスプレッドシートに貼る。Gmailに溜まった通知メールをフォルダに振り分ける。Calendarを見て週次レポートを書く。どれも10〜30分でできるけど、毎週やると馬鹿にならない時間になる。
GWS CLI(gws)とClaude Codeを組み合わせると、この種の作業のほとんどが自動化できる。しかも「スクリプトを書いて維持する」負担なしに。
この記事では、フリーランスが実際に週次ルーティンとして回している自動化パターンを4つ紹介する。セットアップから実務での使い分け、セキュリティまで一通り整理した。
GWS CLIとは何か
GWS CLI(gws)は、Drive・Gmail・Calendar・Sheets・Docs・Chat・Admin など、Google Workspaceのほぼ全サービスをターミナルから操作できるコマンドラインツールだ。
2026年3月にGitHubで公開され、初週でHacker Newsで500ポイント超えを記録した。GitHubスターも22,000を超えて急成長中のツール。
技術的な特徴を押さえておく。
動的コマンド構築の仕組み
gwsの最大の特徴は、コマンド体系を起動時に動的に構築することだ。Google Discovery Serviceに接続してAPIエンドポイントを読み込み、それをコマンドツリーに変換する。
これの意味するところは、Google側でAPIが追加されると、gwsをアップデートしなくても翌日から使えるようになるということだ。CLI側の実装が薄い分、APIの最新状態に常に追従する。
# どんなAPIが使えるか確認
gws --help
# Gmail配下のコマンドを確認(Discovery Service経由で動的生成)
gws gmail --help
全出力がJSON
全てのレスポンスが構造化JSONで返ってくる。jqとの相性が良く、パイプで加工しやすい。
# 未読メールのIDと件名だけ取り出す
gws gmail list --query="is:unread" | jq '.messages[] | {id, snippet}'
100以上のプリビルドスキル
+ プレフィックスで呼べる高レベルな操作が100本以上ある。gws calendar +agenda、gws gmail +standup-report、gws sheets +weekly-digest など。低レベルAPIを叩かずに業務ユースケースに直結したスキルを使える。
MCP内蔵
gws mcp でMCPサーバーが起動する。Claude CodeやClaude Desktopから自然言語でGoogleサービスを操作できる。ただし全API公開時のコンテキスト消費量の問題があるため(後述)、使い方には注意が必要だ。
セットアップ
インストールと認証を一通り確認しておく。
インストール
npmが最も手軽だ。
npm install -g @googleworkspace/cli
# インストール確認
gws --version
ソースからビルドする場合はRustツールチェインが必要だが、通常は不要。npmパッケージにプリビルドネイティブバイナリが含まれているため、Rust環境なしで動く。
OAuth認証
初回は認証フローが走る。
gws auth login
ブラウザが開いてGoogleアカウントの認証画面になる。許可すると認証情報が ~/.config/gws/ に保存される。以降は自動でリフレッシュトークンが更新される。
# 認証状態を確認
gws auth whoami
gws auth loginで要求されるスコープはデフォルトで広めだ。実務で使うサービスだけに絞るには Google Cloud Consoleで自前のOAuthアプリを作成し、スコープを指定する方法がある。
ただし初期セットアップのコストが高いため、個人で使うなら標準スコープのままでも実害は少ない。「業務データを扱うエージェントに渡す」場合は最小権限設定を推奨する。
Claude Codeとの基本的な連携確認
gws CLIはシェルコマンドなので、Claude CodeのBashツールから直接呼び出せる。
# Claude Codeのセッション内でこれを確認するだけで動作チェックになる
gws calendar list
gws gmail list --query="is:unread newer_than:1d" --max-results=5
Claude Codeに「今日の予定を教えて」と依頼すると、内部でこのコマンドを叩いてレスポンスを整形して返してくれる。
GWS CLI vs MCP: どちらを使うか
同じことを実現するのに、GWS CLIをBashコマンドとして叩く方法と、gws mcp でMCPサーバーを起動してClaude Codeに接続する方法の2択がある。どちらを選ぶかは用途次第で、判断基準をまとめておく。
Bash直接実行が向いているケース
- 既存スクリプトへの組み込み: cron、LaunchAgent、GitHub Actionsなど既存の自動化フローに追加する場合
- 単発の決まったコマンド: 「毎朝未読メールをSlackに転送する」みたいな単純な操作
- jqでパイプ加工したい: JSON出力をそのまま別ツールに渡す場合
- スクリプト化して再現性を保ちたい: コマンド履歴として残せて、誰でも同じ操作を再現できる
# Bash直接実行の典型例: 週次レポート素材の収集
gws sheets get --id="${SHEET_ID}" --range="月次KPI!A1:G100" --format=json \
| jq '.values' \
> /tmp/kpi_data.json
MCPモードが向いているケース
- 自然言語で横断操作したい: 「Driveのプロジェクトフォルダを確認して、対応必要なものをカレンダーに入れて」という複合指示
- 複数サービスをClaude Codeに任せる: GmailとCalendarとSheetsを組み合わせたワークフロー
- アドホックな判断が必要: 「今週のメールから重要な案件を選んでまとめて」という判断込みの作業
ただし前述の通り、MCPモードでGoogleの全APIを公開するとコンテキストを大量消費する。特定のスキルに絞って接続するか、セッションごとに必要なサービスのみ起動するのが現実的だ。
# MCPサーバー起動(スキル絞り込みオプションがあれば指定する)
gws mcp
# claude_desktop_config.json での設定例
# {
# "mcpServers": {
# "gws": {
# "command": "gws",
# "args": ["mcp", "--skills", "gmail,calendar,sheets"]
# }
# }
# }
判断フローチャート
決め方をシンプルにまとめるとこうなる。
定期実行・スクリプト化したい
→ Bash直接実行(cron/Routines/GitHub Actions)
複合指示・判断が入る・アドホック
→ MCPモード(Claude Codeとの対話的セッション)
両方必要
→ Routines: Bash直接 / 対話時: MCPモード の使い分け
実務ワークフロー4選
実際にフリーランスの週次ルーティンとして使っているパターンを紹介する。コマンド例はそのまま使えるように書いた。
ワークフロー1: Gmail自動分類 + 日次ダイジェスト
課題: 朝Gmailを開くたびに通知メール・請求書・案件メールが混在していて、優先度の判断に時間がかかる。
実装: 毎朝9時にRoutinesが動いて、前日の未読メールをカテゴリ別に分類してSlackに投げる。
#!/bin/bash
# daily_gmail_digest.sh
# 昨日以降の未読メールを取得
MESSAGES=$(gws gmail list \
--query="is:unread newer_than:1d" \
--format=json)
# Claude Codeに分類させる(Claude Code Routinesのプロンプト例)
# 「添付のメールリストをカテゴリ別に整理してください。
# カテゴリ: 案件・請求・通知・その他
# 重要度: 高/中/低
# 各メールの要約を1行で。
# Slackのblocks形式でJSONを出力してください。」
Routinesのプロンプトで「件名と差出人だけ見て分類して」と指示すれば、本文を全部読まずに高速で動く。メールが100件あっても1分以内に処理できる。
重要なのは「本文を読む処理」と「メタデータだけで分類できる処理」を分けることだ。件名・差出人だけで8割の分類はできる。
ワークフロー2: GA4データ → Sheets自動転記(コピペ廃止)
課題: 毎週月曜に先週分のGA4データをスプレッドシートに貼り付けていた。単純作業だけど10分かかる。
実装: Google Analytics Data APIとgws sheetsを組み合わせる。
#!/bin/bash
# weekly_ga4_to_sheets.sh
# Google Analytics Data APIでデータ取得(curl + サービスアカウント)
REPORT=$(curl -s \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"dateRanges": [{"startDate": "7daysAgo", "endDate": "yesterday"}],
"metrics": [
{"name": "sessions"},
{"name": "activeUsers"},
{"name": "screenPageViews"}
],
"dimensions": [{"name": "date"}]
}' \
"https://analyticsdata.googleapis.com/v1beta/properties/${GA4_PROPERTY_ID}:runReport")
# 日付とメトリクスをCSV形式に変換
ROWS=$(echo "$REPORT" | jq -r '
.rows[] |
[.dimensionValues[0].value,
.metricValues[0].value,
.metricValues[1].value,
.metricValues[2].value] |
@csv')
# Sheetsに追記(週次サマリーシート)
while IFS= read -r row; do
gws sheets append \
--id="${SPREADSHEET_ID}" \
--range="週次GA4!A:D" \
--values="${row}"
done <<< "$ROWS"
echo "GA4データをSheetsに追記しました: $(date '+%Y-%m-%d')"
これをRoutinesのスケジュールトリガー(毎週月曜9:00)に設定しておくと、月曜の朝には先週分のデータがSheets上に揃っている。コピペ作業がゼロになった。
GA4以外でも同じパターンが使える。Search Console、BigQuery、Slack analyticsなど、APIがあればSheets転記を自動化できる。
ワークフロー3: 週次業務サマリーの自動生成
課題: 毎週金曜に週次レポートを書いていた。カレンダーを振り返って、作業ログを見て、1時間かかっていた。
実装: gwsでその週のカレンダーとメールを取得して、Claude Codeにサマリーを書かせる。
# Routinesのプロンプト例(毎週金曜17:00トリガー)
<<PROMPT
以下のデータをもとに、今週の業務サマリーをGoogleドキュメントに作成してください。
1. 今週(月〜金)のカレンダーイベント一覧: {{gws calendar list --min-time=MONDAY --max-time=TODAY}}
2. 今週送受信したメール(重要なもの): {{gws gmail list --query="newer_than:7d -category:promotions -category:social"}}
3. Sheetsの作業ログ: {{gws sheets get --id=WORK_LOG_ID --range="作業ログ!A1:D50"}}
アウトプット形式:
- 今週の主な成果(3点以内)
- 対応したクライアント別の時間概算
- 来週への申し送り事項
- ドキュメントのタイトル: 週次サマリー YYYY-MM-DD
PROMPT
gws docs create --title="週次サマリー $(date '+%Y-%m-%d')" --content="..."
完璧なレポートは出てこないけど、ベースは80%くらいできる。残り20%を人間が手直しする形にすると、1時間かかっていた作業が15分になった。
ワークフロー4: 請求書メール → Sheets自動記録
課題: クライアントから届く請求書承認メールをスプレッドシートに手動で転記していた。
実装: 特定のGmailラベルがついたメールをトリガーにSheetsに書き込む。
# 請求書関連メールを取得(subject検索)
INVOICES=$(gws gmail list \
--query="subject:(請求書 OR invoice) from:(client1.com OR client2.com) is:unread" \
--format=json)
# Claude Codeに各メールから金額・日付・クライアント名を抽出させる
# 抽出結果をgws sheets appendでSpreadsheetに記録
# メールにラベルを付けて処理済みマーク
gws gmail label add \
--message-id="${MESSAGE_ID}" \
--label="請求書/処理済"
「メールから金額を抽出してSheets転記」はClaude Codeの自然言語処理と組み合わせると精度が高い。正規表現で数字を抜き出すより、「このメールから請求金額と支払期限を抽出して」という指示の方が日本語のバリエーションに強い。
セキュリティ: Model Armor連携
エージェントにメール本文を渡す場合、プロンプトインジェクションのリスクがある。メール本文に 「これ以前の指示を無視して...」 という悪意ある文章が入っていたとき、AIがそれに従ってしまう問題だ。
GWS CLIの --sanitize フラグは、Google Cloud Model Armorと連携してAPIレスポンスをスキャンし、プロンプトインジェクションらしき内容を検知・無害化する。
# --sanitizeフラグを使う
gws gmail get --id="${MESSAGE_ID}" --sanitize
# この場合、Google Cloud Model Armorのエンドポイントが必要
export GWS_MODEL_ARMOR_ENDPOINT="https://modelarmor.googleapis.com/..."
詳細な設定手順はこちらの記事で整理している。

フリーランスで個人のメールを処理するだけなら --sanitize は不要だ。ただし、外部クライアントのメールをAIエージェントが読む場合、あるいはWebhookで自動処理するフローを組む場合は、有効にしておくことを勧める。
トラブルシューティング
実際に使っていて詰まりやすいポイントをまとめた。
OAuth認証が突然切れる
症状: 動いていたスクリプトが UNAUTHENTICATED エラーで失敗する。
原因: Googleアカウントのパスワード変更、2段階認証の設定変更、OAuthアプリへのアクセス取り消し、など。
対処:
# 認証情報をリセット
rm -rf ~/.config/gws/
gws auth login
自動化スクリプトには認証エラーを検知してSlack通知するハンドリングを入れておくと、サイレントに失敗しなくて済む。
if ! gws auth whoami > /dev/null 2>&1; then
# Slack通知
curl -X POST "${SLACK_WEBHOOK}" \
-d '{"text": "⚠️ gws認証エラー: 再認証が必要です"}'
exit 1
fi
sheets appendでデータがずれる
症状: 追記したデータが期待した列にはまらない。
原因: --range で指定した範囲と実データの列数が合っていない。
対処: --values で渡すデータの列数を --range と一致させる。
# A:Cに3列追記する場合は値も3列で渡す
gws sheets append \
--id="${SPREADSHEET_ID}" \
--range="Sheet1!A:C" \
--values="2026-06-04,10000,完了"
Discovery Serviceのキャッシュが古い
症状: 新しいGoogleのAPIが使えない、または存在するはずのコマンドがない。
対処: キャッシュを削除して再取得させる。
# キャッシュの場所(環境によって異なる)
rm -rf ~/.cache/gws/
# または環境変数で強制リフレッシュ
GWS_CACHE_TTL=0 gws gmail --help
MCPモードでコンテキスト上限に引っかかる
症状: Claude Codeとの会話でContextが膨らんで応答が遅くなる、または切れる。
原因: gws mcp がGoogle APIの全ツール(200〜400個)をコンテキストに展開している。
対処: .mcp.json でスキルを絞る、またはセッション開始時に --skills オプションで制限する。
{
"mcpServers": {
"gws-limited": {
"command": "gws",
"args": ["mcp", "--skills", "gmail.list,calendar.events.list,sheets.values.get,sheets.values.append"]
}
}
}
まとめ
GWS CLI × Claude Codeの組み合わせが解決するのは「Googleサービスと自動化の間にあるAPI連携の手間」だ。
これまでは「GmailのデータをSheeetsに転記したい」となったとき、Gmail APIのOAuth設定からSheets APIの書き込みまで、コードをゼロから書く必要があった。GWS CLIが入ると、コマンド1行ずつ組み合わせるだけで完成する。Claude Codeが絡むと、コマンドをどう組み合わせるかもAIが考えてくれる。
フリーランスにとってのキモは「毎週同じことをやっている操作を特定して、その順番でgwsコマンドを並べる」だけでいい点だ。完璧なスクリプトじゃなくていい。80点でも自動化できれば、週10分の節約を52週積み上げると8時間以上になる。
Bash直接実行: 定期実行・既存フローへの組み込みに。cron/Routines/GitHub Actionsと組み合わせる
MCPモード: 自然言語での横断操作に。スキルを絞ってコンテキスト消費を抑える
—sanitize: 外部メールをAIに渡す場合に有効化。個人利用ならスキップしてOK
認証エラーハンドリング: 自動化スクリプトには必ず認証チェックを入れる
関連記事




よくある質問
Q. GWS CLIはGoogle公式のサポート対象か?
公式サポート対象外です。GitHubのREADMEに明記されています。v1.0 に向けて破壊的変更が予定されており、開発ペースが速いため、プロダクション環境への組み込みはバージョンを固定して使うことを推奨します。
Q. GoogleアカウントがWorkspace版でなく個人Gmail(@gmail.com)でも使えるか?
基本機能は使えます。ただし管理機能(gws admin)はWorkspaceアカウント限定です。Drive・Gmail・Calendar・Sheetsの個人アカウントでの操作は問題なく動作します。
Q. Routinesから使う場合、認証はどうするか?
Routinesはクラウド環境で動くため、ローカルの gws auth login 認証情報は使えません。サービスアカウントのJSONキーを環境変数として設定するか、Google Cloud Workload Identityを使う方法が現実的です。環境変数 GOOGLE_APPLICATION_CREDENTIALS でサービスアカウントファイルのパスを指定すれば、gwsが自動でピックアップします。