SETUP GUIDE / 2026-09-04

Claude Code × スプレッドシート
接続ガイド

AIに「この表をスプレッドシートにして」と日本語で頼むだけで、900行の表が数分ででき上がる。 そこまでの全手順を、実際に構築したときの記録から起こしました。 つまずいた11か所は、隠さずそのまま載せています。

MINUTES
約40分
LEVEL
コピペができればOK
COST
無料
WALLS
つまずき11件つき

WHYこれができるようになる

実際にこの手順で作ったものです。数字は実測値です。

1,033行 表がまるごとできる 9サイト分のキーワード管理表を、色分け・プルダウン・数式つきで数分で作成
692件 実データが流し込める WordPressの公開記事を、タイトル・URL・公開日ごと自動で取り込み
毎週月曜 放っておいても更新される 検索順位と内部リンクを、Macが勝手に取ってきて書き込む

HOW仕組みは、この3つだけ

難しそうに見えて、やっていることは「AIがGoogleに直接データを渡す」だけです。

YOU
あなた
日本語で頼む
「この表をシートにして」
AGENT
Claude Code
頼まれた内容を
Googleへの命令に変える
GOOGLE
スプレッドシート
データが書き込まれる
画面は開かなくていい

大事なのは 画面を操作しないことです。AIがブラウザでセルをクリックして打ち込むのではなく、 Googleの受付窓口にデータを直接渡します。だから速いし、日本語も絵文字も崩れません。

WORD知らなくていい言葉、3つだけ覚える

この先に出てくる用語は、実質この3つです。正確な定義より、ざっくりした理解で足ります。

ターミナル
Macに文字で命令を出す黒い画面。⌘+スペース で「ターミナル」と打つと開きます。このガイドではコマンドを貼り付けてEnterを押すだけで、自分で書く場面はありません。
API
サービス同士がデータをやり取りする受付窓口。人間が画面を操作する代わりに、プログラムが直接データを渡せます。これを使うから速くて正確です。
認証情報
「このMacからのアクセスを許可します」という鍵のファイル。手順3で自分用のものを1回だけ作ります。パスワードと同じ扱いをしてください。

PREP始める前に

3つとも入っているか、ターミナルに貼って確かめられます。

必要なもの確認コマンド入っていなければ
Node.jsnode --versionbrew install node で入れる
Python 3python3 --versionMacに最初から入っています
Googleアカウントスプレッドシートを使っているアカウント

brew が無いと言われたら、先に brew.sh のコマンドを1行実行してください。

STEP手順は5つ

上から順にやれば繋がります。詰まりやすい場所には、その場で赤い箱を置いてあります。

1
道具を2つ入れる
3分 / コピペ4行
なぜ:AIがGoogleと話すための通訳が要ります。gws がスプレッドシート担当、clasp が自動化担当です。

Mac全体には入れず、専用フォルダに閉じ込めます。あとで消したくなったら、フォルダごと捨てられます。

ターミナルに貼る
mkdir -p ~/.local/gws-tools ~/.local/bin
cd ~/.local/gws-tools
npm init -y >/dev/null
npm install @google/clasp @googleworkspace/cli
ln -sf ~/.local/gws-tools/node_modules/.bin/gws   ~/.local/bin/gws
ln -sf ~/.local/gws-tools/node_modules/.bin/clasp ~/.local/bin/clasp
こうなればOK

~/.local/bin/clasp --version と打って 3.x.x のような数字が出れば成功です。

2
Googleに「このMacを許可する窓口」を作る
15分 / ブラウザ操作
なぜ:Googleは、知らないプログラムに勝手にデータを渡しません。「このMacは自分のものです」と登録する作業です。ここだけは人がやります。
  1. Google Cloud Console を開く → 上の「プロジェクトの選択」→「新しいプロジェクト
    • 名前は何でもOK(例:my-gws
    • 作ったら、そのプロジェクトを選んだ状態にする
  2. 左の「APIとサービス → ライブラリ」で3つを検索して、それぞれ「有効にする」
    • Google Sheets API / Google Drive API / Google Apps Script API
  3. OAuth同意画面」(新画面では「Google Auth Platform → ブランディング」)
    • ユーザーの種類:外部 / アプリ名とメールを入れて保存
  4. 左の「対象(Audience)」→ テストユーザーに自分のGmailを追加
    • これを忘れると、次の手順で必ず止まります
  5. 左の「クライアント」→「+クライアントを作成」
    • 種類は デスクトップアプリ / 名前は gws-desktop など
  6. 作成直後の画面で「JSONをダウンロード」を押す
  7. script.google.com の設定 で「Google Apps Script API」をオン
壁 01ログイン中に「このアプリはGoogleで確認されていません」と赤い警告が出る
accounts.google.com
このアプリはGoogleで確認されていません

このアプリからGoogleアカウントへのアクセスをリクエストされています。デベロッパーを信頼できる場合にのみ続行してください。

詳細安全なページに戻る

▲「詳細」→「(アプリ名)に移動(安全ではないページ)」で進む

壊れていません。自分で作ったアプリをGoogleの審査に出していないだけで、全員に出ます。

ここから先に進めないときは、手順4のテストユーザーに自分のGmailが入っているか確認してください。

壁 02クライアント作成直後の画面に、秘密の値が表示されている

「クライアントシークレット」という文字列が出ています。これは鍵そのものです。

スクショをAIに送らない。チャットに貼らない。JSONを落としたら画面は閉じて構いません。

AIに手伝ってもらうときも「JSONを落とした」とだけ伝えれば十分です。AI側はファイルを置くだけで、中身は読みません。

最後に、落としたJSONを決まった場所へ移します。

ターミナルに貼る
mkdir -p ~/.config/gws
mv ~/Downloads/client_secret_*.json ~/.config/gws/client_secret.json
chmod 600 ~/.config/gws/client_secret.json
こうなればOK

エラーが出なければ成功です。chmod 600 は「自分だけが読める」設定で、鍵のファイルには必ず付けます。

3
ログインする
5分 / ターミナル→ブラウザ
なぜ:作った窓口を通って、実際にログインします。Gmailの権限はあえて付けません。使わない権限は最初から渡さないのが安全です。
ターミナルに貼る(長いですが1行です)
~/.local/bin/gws auth login --scopes "https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/script.projects,https://www.googleapis.com/auth/script.deployments,https://www.googleapis.com/auth/drive.readonly,https://www.googleapis.com/auth/cloud-platform"

ブラウザが開くので、自分のGmailを選んで「許可」。ターミナルには戻らず、ブラウザの操作を最後まで終わらせてください。

壁 03ブラウザが開かず、ターミナルに長いURLだけ出て止まる

ターミナルはそのままにしてください。返事を待っている状態で、止まっているわけではありません。

表示されたURLをブラウザに貼れば進みます。

このとき、URLは折り返されて表示されます。途中の localhost:54226 のような5桁の数字を写し間違えないこと。 実際にここで数字を1つ読み違え、「localhost で接続が拒否されました」になりました。 ドラッグで全部選択してコピーするのが確実です。

確認する
~/.local/bin/gws auth status
こうなればOK

"auth_method": "oauth2""has_refresh_token": true の2つが出ていれば完了です。

4
本当に読み書きできるか試す
3分 / テスト用シートで
なぜ:ここで確かめておくと、あとで問題が起きたとき「繋がっていないのか、頼み方が悪いのか」を切り分けられます。本番のシートでは試さないでください。
① 読めるか
~/.local/bin/gws drive files list --params '{"pageSize":5,"fields":"files(id,name)"}'
② 書けるか(テスト用シートを新しく作る)
~/.local/bin/gws sheets spreadsheets create --json '{"properties":{"title":"【テスト】書き込み確認"}}'

返ってきた spreadsheetId を控えて、日本語を書き込んでみます。

③ 日本語を書く(<ID> を差し替える)
~/.local/bin/gws sheets spreadsheets values update \
  --params '{"spreadsheetId":"<ID>","range":"A1:C2","valueInputOption":"USER_ENTERED"}' \
  --json '{"values":[["見出し","日本語","絵文字🍣"],["行1","長い文章もそのまま入ります。","OK"]]}'
こうなればOK

シートを開いて、日本語も絵文字も一字も欠けていなければ合格です。ここから先は、AIに日本語で頼むだけになります。

壁 04「AIは日本語をシートに書けない」は誤解だった

最初、AIに画面操作でシートへ入力させたところ、日本語のセルは半角部分しか残らず、複数セルの貼り付けも失敗しました。 それを「AIの限界」だと記録していましたが、原因は操作方法でした。画面操作では日本語入力(IME)の変換が挟まるためです。

APIに切り替えた瞬間、長文の日本語・絵文字🍣・全角記号「」〜まで一字も欠けずに入りました。

画面操作で失敗したら、ツールのせいにする前に「APIで直接渡せないか」を疑ってください。

5
AIに日本語で頼む
ここからが本番
なぜ:コマンドを覚える必要はありません。やりたいことを言えば、AIが上のコマンドを組み立てます。
Claude Code に貼るだけ
Driveにあるスプレッドシートの一覧を出して
Claude Code に貼るだけ
このCSVと同じ列で新しいシートを作って、全部流し込んで。
状態の列はプルダウンにして、「公開」は緑、「下書き」は青で行ごと色分けして

色分け・プルダウン・数式・フィルタも、この頼み方で付きます。1,000行を数分です。

NEXT毎週、放っておいても更新されるようにする

ここから先は応用です。繋がっただけで満足せず、自動で回るところまで行くと世界が変わります。

「週に1回コマンドを打つ」は必ず忘れます。 macOS標準の予定表機能(launchd)に登録すると、毎週決まった時刻に勝手に実行されます。 その時刻にMacが寝ていても、次に起きたときに実行されます。

登録・手動実行・解除
launchctl load   ~/Library/LaunchAgents/com.example.mysync.plist   # 登録
launchctl start  com.example.mysync                                # いま試す
launchctl unload ~/Library/LaunchAgents/com.example.mysync.plist   # やめる
壁 05自動実行だけ Operation not permitted で動かない
実際に出たログ
$ cat ~/Library/Logs/mysync-launchd.log
/bin/sh: /Users/…/Desktop/…/sync.sh: Operation not permitted

$ launchctl list com.example.mysync | grep LastExitStatus
  "LastExitStatus" = 32256;

macOSはデスクトップ・書類・ダウンロードを保護しています。 手で実行すると動くのに、自動実行だと読めません。仕様です。

自動実行で使うスクリプトと鍵は、デスクトップの外に置きます(例:~/.local/~/.config/)。

「フルディスクアクセスを許可する」道もありますが、広い権限を渡すことになるので避けました。

壁 06自動実行だけ env: node: No such file or directory で落ちる

ターミナルでは動くのに、自動実行だと落ちる。自動実行は、道具の在りかを知らない状態で動くためです。

スクリプトの先頭で、探し場所を自分で教えます。

スクリプトの冒頭に足す
export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"

ターミナルで動くのに自動実行で動かないときは、まずこれを疑ってください。

WALL壁の一覧

詰まったときは、ここから探してください。エラーの文字そのままで並べてあります。

壁 07シートのボタンから動かそうとしたら 403 Forbidden で弾かれる
スプレッドシート — 接続テストの結果

接続テスト

WordPress : ✗ HTTP 403
403 Forbidden — You don't have permission to access this resource.

SearchConsole : ✗ 403
Google Search Console API has not been used in project 143826298809 before or it is disabled.

シート書き込み : OK(41行)

▲ 同じ403でも原因は別。片方はサーバーの防御、もう片方はAPIの未設定

シートに「更新ボタン」を置く方法(Google Apps Script)も試しました。しかし レンタルサーバーの防御機能が、Googleのサーバーからのアクセスを一律で止めていました。 自分のMacからは普通に取れるのにです。

相手が自分のサーバーなら、Macから取りに行く方が確実。ボタンは諦めて、Mac側の自動実行にしました。

Apps Scriptが向いているのは、相手もGoogleのサービスのとき(Search Console・GA4・Drive)です。

壁 08追加のアクセス権が必要です」から先に進めない
console.cloud.google.com
追加のアクセス権が必要です

プロジェクトに対する追加のアクセス権が必要です:143826298809

resourcemanager.projects.get(権限がありません)

アクセスのリクエスト

▲ このボタンを押しても解決しません

Apps Scriptは裏で、Googleが自動生成した番号だけのプロジェクトを使います。 ここは持ち主でも管理画面を触れない仕様です。

使うなら、手順2で自分が作ったプロジェクトへ紐付け直す必要があります。

壁 09同じドメインに2つのサイトが同居していた

example.com がサイトA、example.com/shop は別のサイトB、という構成でした。 ルートを叩いてサイトBの件数だと思い込み、53件と386件を取り違えました。

最初に /wp-json を開くと、そのサイトの名前が返ります。どのサイトを見ているか確認してから進めてください。

壁 10同じタイトルの記事が2本あった

データを一覧にしたら、まったく同じタイトルの記事が2本見つかりました。 リライト版を「新しい記事」として公開していたためです。

旧記事のURLは新記事へ転送されていて検索エンジンからは1本に見えていましたが、管理画面には2本残っていました。

気づいていなかった重複は、一覧にすると出てきます。これが表を作る副産物としての価値です。

壁 11#見出し」付きのURLが別ページとして返ってくる

Search Consoleは 記事URL#ketsuron のような見出しジャンプ用のURLを、別の行として返します。 そのままだと記事と結びつかず、73件が「表に無いページ」扱いになりました。

# より後ろと ? より後ろを落としてから照合すると、99%結びつきます。

CARE安全のためのルール

この5つだけ守れば大きな事故は起きません

  • 鍵のファイルはチャットに貼らない。スクショに写さない。置き場所を伝えるだけで十分です
  • 鍵をGitに入れない。ファイル名のパターンで除外すると、.bak などの改名で漏れます。認証フォルダは「原則すべて除外、雛形だけ許可」にします
  • 権限は最小に。このガイドではGmailの権限を付けていません。使わない権限は最初から渡さない
  • 本番のシートで試さない。動作確認は必ず新しいテスト用シートで
  • 外に出す操作は人が押す。AIは下書き・準備まで。公開・送信・削除のボタンは自分で押す運用にすると、AIに広い権限を渡さずに済みます

CHEATコマンド早見表

覚える必要はありません。AIが裏でこれを打っています。「何が動いているか知りたい」ときだけどうぞ。

やりたいことコマンド
繋がっているか確認~/.local/bin/gws auth status
シートの一覧gws drive files list --params '{"fields":"files(id,name)"}'
範囲を読むgws sheets spreadsheets values get --params '{"spreadsheetId":"ID","range":"タブ名!A1:F20"}'
セルに書くgws sheets spreadsheets values update --params '{…,"valueInputOption":"USER_ENTERED"}' --json '{"values":[["下書き"]]}'
色・数式・プルダウンgws sheets spreadsheets batchUpdate --params '{"spreadsheetId":"ID"}' --json '{"requests":[…]}'

日本語のタブ名はそのまま書けます。記号が入るときは 'タブ名'!A1 とシングルクォートで囲みます。