ClaudeにGASを書かせるプロンプトの型|一発で動くコードが返る指示と、返らない指示
ClaudeにGASを書かせるプロンプトの型|一発で動くコードが返る指示と、返らない指示
「ClaudeにGASを書かせたが、返ってきたコードが動かない」「動いたけれど、思っていたものと違う」。この差は、Claudeの性能ではなく、プロンプトに書いた情報量でほぼ決まります。
先に結論です。ClaudeにGAS(Google Apps Script)を書かせて一発で動くコードを返させるには、次の5つをプロンプトに入れます。
- シート構造を「何行目・何列目」のレベルで書く
- 入出力の実データ例を貼る
- 実行方法(手動・トリガー・Webアプリ)を指定する
- 既存環境(既存スクリプトの有無・シート紐づきかスタンドアロンか)を伝える
- 消してはいけないもの・重複時の挙動など、守るべき制約を書く
graciautoでは、月次シートの自動コピー、ガントチャートの自動色付け+カレンダー連携、チャットからのタスク自動登録という3本のGASをClaudeに書かせて構築し、いずれも本番運用しています。この記事では、その実際のやり取りから「返る指示」と「返らない指示」の違いを具体的に示します。
返らない指示の典型:「〇〇するGASを書いて」だけ
まず、うまくいかないプロンプトの典型です。
「スプレッドシートのシートを毎月コピーするGASを書いてください」
この指示でも、Claudeは何かしらのコードを返してきます。文法的には正しく、それらしく動くコードです。ただ、高い確率で要件とズレます。
理由は単純で、Claudeはあなたのスプレッドシートを見ていないからです。シート名の形式、数式が入っているセルの位置、消してよい列と残すべき列。こうした情報がプロンプトになければ、Claudeは一般的な構成を推測で書くしかありません。そして推測で書かれた部分が、そのまま手戻りになります。
「AIが使えない」と感じている場合、多くはこの状態です。コードを書く能力の問題ではなく、要件が渡っていないという情報の問題です。人間のエンジニアに外注するときに仕様書なしで発注しないのと同じことが、Claudeにも当てはまります。
一発で動かすための5要素と実例
ここからは、本番運用中のGAS3本のやり取りをもとに、5つの要素をどう書くかを示します。
1. シート構造は「何行目・何列目」まで書く
美容サロンFCの新店舗開店準備で使ったガントチャートの自動色付けGASでは、シート構造をここまで具体的に渡しました。
- ヘッダー行は3行目(タスク/オーナー/開始日/終了日/進捗)
- 日付行は4行目、データ行は5〜32行目
- ガントの色付けエリアはI列(9列目)から始まる
- 同じシートの39行目から、もう1店舗分の同じ構造のブロックがある
「ガントチャートに色を付けるGAS」という抽象的な依頼との差は歴然です。特に効いたのは最後の1行で、1枚のシートに2店舗分のブロックが縦に並ぶ変則構造は、伝えなければ絶対に推測できません。ここを省くと、1ブロック目だけ動くコードが返ってきて、2ブロック目の対応で結局往復することになります。
列は「D列」だけでなく「D列(4列目)」と番号併記にしておくと、getRange系のコードで列番号のズレが起きにくくなります。
2. 入出力の実データ例を貼る
月次シートコピーのGASでは、シート名の実例をそのまま渡しました。「26/03」「26/04」という年/月形式であること、最新月のシートをコピー元にして12月分まで作ること、数式は3行目のP列からW列にIMPORTRANGEが入っていること。
データ例があると、Claudeは正規表現やパースの処理を実物に合わせて書けます。「日付っぽいシート名」という説明だけでは、「2026-03」形式を想定したコードが返ってくるかもしれません。実例を1つ貼るほうが、形式の説明を何行書くより確実です。
3. 実行方法を指定する:手動・トリガー・Webアプリ
同じ処理でも、実行方法によってコードの書き方が変わります。
- 手動実行: スクリプトエディタやメニューから人が実行する。完了メッセージを出す
- トリガー実行: onEditで特定列の編集時だけ動かす、時間主導で毎朝動かすなど
- Webアプリ: doPost/doGetで外部からのリクエストを受ける
ガントチャートGASでは「開始日・終了日・進捗の列が編集されたら自動で色付け」というトリガー前提を伝え、タスク自動登録GASでは「外部からJSONをPOSTで受けるWebアプリ」と指定しました。ここを書かないと、手動実行前提の関数だけが返ってきがちです。動くコードではあるものの、「毎回手で実行するつもりはなかった」という食い違いが起きます。
4. 既存環境を伝える:新規か、既存スクリプトへの追加か
見落としやすいのがこの要素です。すでに動いているスクリプトがあるプロジェクトに新しいコードを追加する場合、その旨と既存コードを渡さないと、関数名の重複や古いコードとの混在が起きます。
実際にガントチャートGASの改修では、古いバージョンのスクリプトが残ったまま新しいコードを貼ったために「getColor is not defined」という参照エラーが出たことがあります。原因は新旧コードの混在で、プロジェクト内を全削除してから貼り直すことで解決しました。改修を依頼するときは、いま動いているコードを丸ごと貼って「これを前提に修正して」と渡すのが確実です。
また、スプレッドシートに紐づいたコンテナバインド型か、単体のスタンドアロン型かも伝えます。紐づき型ならgetActiveSpreadsheet()で書けますが、スタンドアロン型はIDでシートを開く必要があり、コードが変わります。
5. 制約を書く:消してはいけないもの・重複時の挙動
一発で「動く」コードと、一発で「使える」コードの差は、この要素で決まります。
月次シートコピーGASでは、「G列はプルダウン設定を残して、入力された値だけ消す」という制約を渡しました。これを書かないと、列ごと削除したりプルダウン設定ごと消したりするコードでも「動く」ことになってしまいます。実装ではclearContent()が使われ、データ入力規則は残して値だけがクリアされる動きになりました。
重複時の挙動も同じです。「すでに同名の月シートがあればスキップ」「カレンダーに同名イベントがあれば登録しない」という1行があるだけで、2回実行したときにシートやイベントが二重に増える事態を防げます。自動化は繰り返し実行される前提なので、「もう一度実行されたらどうなるか」を制約として先に書いておくのが安全です。
そのまま使えるプロンプトの型
5要素をまとめると、次の型になります。月次シートコピーを例にした実物に近い形です。
以下の条件でGoogle Apps Scriptを書いてください。
【目的】
月別シートを最新月からコピーして、12月分まで自動作成する
【シート構造】
- シート名は「26/03」「26/04」のような年/月形式
- 3行目のP列〜W列(16〜23列目)にIMPORTRANGEの数式がある。
数式内の「26/〇〇」をコピー先のシート名に置き換えてほしい
- G列の3行目以降はプルダウン。設定は残して値だけ消す
【実行方法】
スプレッドシートの「拡張機能→Apps Script」に貼って手動実行。
完了したらメッセージを表示する
【既存環境】
このスプレッドシートに他のスクリプトはない(新規)
【制約】
- すでに同名シートがある月はスキップ
- 数式内の日付の置き換えは固定文字列でなく正規表現で行う
【完成後】
関数名と実行手順を教えてください
最後の「関数名と実行手順を教えて」も実務では効きます。コードだけ返されても、どの関数をどこから実行するのか、初回の承認画面で何を許可するのかが分からず止まりがちだからです。
動いた後に壊れやすい箇所も、先に指示で潰す
一発で動いたコードが、運用の中で壊れることがあります。経験上、壊れやすい箇所は先回りして指示に入れておくのが正解です。
**日付の置換は固定値でなく正規表現で。** 「26/05を26/06に置換」のような固定値置換だと、コピー元の数式に古い月の参照が残っていた場合に一致せず、置換漏れが起きえます。「26/に続く2桁の数字のパターンを正規表現で置換」と指示しておくと、どの月から実行しても正しく動きます。
**日付をカレンダーに渡すときは正規化を指示する。** シートの日付をそのままカレンダー登録に使うと、時刻や書式のズレで「開始日が終了日より後」というエラーが起きることがあります。実際にガントチャートのカレンダー連携でこのエラーに当たり、Utilities.formatDateで日付を正規化する処理を入れて解決しました。最初から「日付はフォーマットを揃えてから渡す」と指示しておけば防げる類のものです。
**Webアプリ化するなら、呼び出し側の実装まで含めて依頼する。** GASのWebアプリはリクエストがリダイレクトされる仕様があり、呼び出し方によってはPOSTがGETに変わって届き、送ったデータが落ちます。タスク自動登録GASの構築ではここに当たり、呼び出し側をこの仕様を前提にした送信処理に書き直して解決しました。「GAS側と、それを呼び出す側のコードをセットで書いて。GASのリダイレクト仕様を考慮して」と一文入れておくと、この種の落とし穴をClaude側が先に処理してくれます。GAS連携の詰まりどころはLINEに送った文章をClaudeに処理させる|GAS中継の実装コードと詰まりどころ4つで詳しく書いています。
**保存だけで反映されるか、再デプロイが必要かを確認する。** シート紐づきの関数やトリガー実行はコードを保存すれば次回実行から反映されますが、Webアプリとして公開している場合はバージョンの更新が必要です。「修正したのに動きが変わらない」ときは、まずここを疑います。
どこまで細かく書くかの判断基準
5要素すべてを毎回フルに書く必要はありません。判断基準はシンプルで、「そのGASの動作に影響する事実か」です。
シートの見た目の色や処理と関係ない列の説明は不要です。逆に、処理対象の行・列、シート名の形式、実行のされ方、二重実行時の挙動は、どんなに小さなGASでも必ず影響します。迷ったら「新しく入ったスタッフにこの作業を引き継ぐとしたら何を伝えるか」を書き出すと、ちょうど必要な粒度になります。
なお、ここまで書いても一発で完璧にならないことはあります。その場合も、エラーメッセージをそのまま貼って返すだけで、Claudeは自分の書いたコードを前提に修正できます。最初のプロンプトが具体的であるほど、この修正ループも短くなります。
まとめ:プロンプトの型は「仕様書の最小形」
ClaudeにGASを書かせるプロンプトの型は、突き詰めると小さな仕様書です。シート構造・データ例・実行方法・既存環境・制約。この5つが揃っていれば、月次のシートコピーもガントチャートの色付けもタスクの自動登録も、実用レベルのコードが最初の応答で返ってきます。
GASでどんな業務が減らせるかはスプレッドシート業務はGASでここまで減らせる。月次コピーとカレンダー連携の実例で、LINEと組み合わせた実装はClaude×LINE連携をGASで実装|送るだけでタスク自動登録で紹介しています。
graciautoでは、スプレッドシート・LINE・カレンダーをつなぐ業務自動化の構築と、自社で運用を回せるようになるための伴走支援を行っています。「この作業、自動化できるのか」という段階のご相談もお受けしています。