AIに「この表をスプレッドシートにして」と日本語で頼むだけで、900行の表が数分ででき上がる。 そこまでの全手順を、実際に構築したときの記録から起こしました。 つまずいた11か所は、隠さずそのまま載せています。
実際にこの手順で作ったものです。数字は実測値です。
難しそうに見えて、やっていることは「AIがGoogleに直接データを渡す」だけです。
大事なのは 画面を操作しないことです。AIがブラウザでセルをクリックして打ち込むのではなく、 Googleの受付窓口にデータを直接渡します。だから速いし、日本語も絵文字も崩れません。
この先に出てくる用語は、実質この3つです。正確な定義より、ざっくりした理解で足ります。
⌘+スペース で「ターミナル」と打つと開きます。このガイドではコマンドを貼り付けてEnterを押すだけで、自分で書く場面はありません。3つとも入っているか、ターミナルに貼って確かめられます。
| 必要なもの | 確認コマンド | 入っていなければ |
|---|---|---|
| Node.js | node --version | brew install node で入れる |
| Python 3 | python3 --version | Macに最初から入っています |
| Googleアカウント | — | スプレッドシートを使っているアカウント |
brew が無いと言われたら、先に brew.sh のコマンドを1行実行してください。
上から順にやれば繋がります。詰まりやすい場所には、その場で赤い箱を置いてあります。
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
~/.local/bin/clasp --version と打って 3.x.x のような数字が出れば成功です。
my-gws)gws-desktop などこのアプリからGoogleアカウントへのアクセスをリクエストされています。デベロッパーを信頼できる場合にのみ続行してください。
詳細 / 安全なページに戻る
壊れていません。自分で作ったアプリをGoogleの審査に出していないだけで、全員に出ます。
ここから先に進めないときは、手順4のテストユーザーに自分のGmailが入っているか確認してください。
「クライアントシークレット」という文字列が出ています。これは鍵そのものです。
スクショを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
エラーが出なければ成功です。chmod 600 は「自分だけが読める」設定で、鍵のファイルには必ず付けます。
~/.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を選んで「許可」。ターミナルには戻らず、ブラウザの操作を最後まで終わらせてください。
ターミナルはそのままにしてください。返事を待っている状態で、止まっているわけではありません。
表示されたURLをブラウザに貼れば進みます。
このとき、URLは折り返されて表示されます。途中の localhost:54226 のような5桁の数字を写し間違えないこと。
実際にここで数字を1つ読み違え、「localhost で接続が拒否されました」になりました。
ドラッグで全部選択してコピーするのが確実です。
~/.local/bin/gws auth status
"auth_method": "oauth2" と "has_refresh_token": true の2つが出ていれば完了です。
~/.local/bin/gws drive files list --params '{"pageSize":5,"fields":"files(id,name)"}'
~/.local/bin/gws sheets spreadsheets create --json '{"properties":{"title":"【テスト】書き込み確認"}}'
返ってきた spreadsheetId を控えて、日本語を書き込んでみます。
~/.local/bin/gws sheets spreadsheets values update \
--params '{"spreadsheetId":"<ID>","range":"A1:C2","valueInputOption":"USER_ENTERED"}' \
--json '{"values":[["見出し","日本語","絵文字🍣"],["行1","長い文章もそのまま入ります。","OK"]]}'
シートを開いて、日本語も絵文字も一字も欠けていなければ合格です。ここから先は、AIに日本語で頼むだけになります。
最初、AIに画面操作でシートへ入力させたところ、日本語のセルは半角部分しか残らず、複数セルの貼り付けも失敗しました。 それを「AIの限界」だと記録していましたが、原因は操作方法でした。画面操作では日本語入力(IME)の変換が挟まるためです。
APIに切り替えた瞬間、長文の日本語・絵文字🍣・全角記号「」〜まで一字も欠けずに入りました。
画面操作で失敗したら、ツールのせいにする前に「APIで直接渡せないか」を疑ってください。
Driveにあるスプレッドシートの一覧を出して
このCSVと同じ列で新しいシートを作って、全部流し込んで。 状態の列はプルダウンにして、「公開」は緑、「下書き」は青で行ごと色分けして
色分け・プルダウン・数式・フィルタも、この頼み方で付きます。1,000行を数分です。
ここから先は応用です。繋がっただけで満足せず、自動で回るところまで行くと世界が変わります。
「週に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 # やめる
$ 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/)。
「フルディスクアクセスを許可する」道もありますが、広い権限を渡すことになるので避けました。
ターミナルでは動くのに、自動実行だと落ちる。自動実行は、道具の在りかを知らない状態で動くためです。
スクリプトの先頭で、探し場所を自分で教えます。
export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
ターミナルで動くのに自動実行で動かないときは、まずこれを疑ってください。
詰まったときは、ここから探してください。エラーの文字そのままで並べてあります。
接続テスト
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行)
シートに「更新ボタン」を置く方法(Google Apps Script)も試しました。しかし レンタルサーバーの防御機能が、Googleのサーバーからのアクセスを一律で止めていました。 自分のMacからは普通に取れるのにです。
相手が自分のサーバーなら、Macから取りに行く方が確実。ボタンは諦めて、Mac側の自動実行にしました。
Apps Scriptが向いているのは、相手もGoogleのサービスのとき(Search Console・GA4・Drive)です。
プロジェクトに対する追加のアクセス権が必要です:143826298809
resourcemanager.projects.get(権限がありません)
アクセスのリクエスト
Apps Scriptは裏で、Googleが自動生成した番号だけのプロジェクトを使います。 ここは持ち主でも管理画面を触れない仕様です。
使うなら、手順2で自分が作ったプロジェクトへ紐付け直す必要があります。
example.com がサイトA、example.com/shop は別のサイトB、という構成でした。
ルートを叩いてサイトBの件数だと思い込み、53件と386件を取り違えました。
最初に /wp-json を開くと、そのサイトの名前が返ります。どのサイトを見ているか確認してから進めてください。
データを一覧にしたら、まったく同じタイトルの記事が2本見つかりました。 リライト版を「新しい記事」として公開していたためです。
旧記事のURLは新記事へ転送されていて検索エンジンからは1本に見えていましたが、管理画面には2本残っていました。
気づいていなかった重複は、一覧にすると出てきます。これが表を作る副産物としての価値です。
Search Consoleは 記事URL#ketsuron のような見出しジャンプ用のURLを、別の行として返します。
そのままだと記事と結びつかず、73件が「表に無いページ」扱いになりました。
# より後ろと ? より後ろを落としてから照合すると、99%結びつきます。
.bak などの改名で漏れます。認証フォルダは「原則すべて除外、雛形だけ許可」にします覚える必要はありません。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 とシングルクォートで囲みます。