ChatGPTで業務マニュアルを自動作成する方法|30分で完成・無料テンプレ付き

ChatGPTで業務マニュアルを自動作成する方法|30分で完成・無料テンプレ付き

1. この記事でできること

この記事では「フォームに項目を入力して送信するだけ」で、ChatGPTが業務マニュアルを自動整形し、Googleドキュメントに保存してリンクを返す仕組みを30分で作ります。
無料のGoogleツール(フォーム/スプレッドシート/ドキュメント)と、OpenAI API(少額課金・クレカ登録が必要)だけで完結します。まずは“動く自動化”を一緒に作り切りましょう。

テンプレート付きなので、初めての方でもコピペ中心で進められるはずです。一緒に手を動かしていきましょう。

2. 今回作る自動化の仕組みの全体像

  • Googleフォームに「業務名・目的・前提・元の手順メモ」を入力→送信
  • スプレッドシートに回答が入ると、Apps Scriptが自動起動
  • Apps ScriptがOpenAI(ChatGPT API)に投げ、読みやすいマニュアルに整形
  • Googleドキュメントに自動保存し、URLをシートに書き戻し(任意でメール通知)

 

3. 事前に必要なアカウント・準備物

ツール/アカウント 用途 無料/有料 必要な登録・取得 クレカ
Googleアカウント フォーム/シート/ドキュメント/Apps Script 無料 ログインのみ 不要
OpenAI API(ChatGPT) 文章整形(生成AI) 有料(従量課金) APIキー発行 必要

費用目安:軽量モデル(gpt-4o-mini)を使えば、1回のマニュアル生成は約0.5円以下の想定です(入力3千tokens/出力3千tokensの場合の概算)。月に数十本でも数百円程度に収まります。

4. 必要なツール、アカウントの設定

4-1. OpenAI APIアカウント作成とAPIキー取得(5分)

  1. OpenAIのAPIサイトにアクセスし、アカウントを作成・ログインします。
  2. Billing(支払い)画面でクレジットカードを登録します。APIは従量課金のため、上限管理と課金先が必須です。
    「Payment methods」ページで「Add payment method」からクレジットカードを登録できます。

  3. API Keysのページで「Create new secret key」を押し、キーを発行して安全な場所に保管します(後でApps Scriptに設定)。

 

4-2. Googleドライブに保存フォルダを作る(1分)

  1. ドライブで「マニュアル自動生成」というフォルダを作成。
  2. 画像のページを開いてURLの末尾にある「フォルダID」(/folders/の後ろ)をメモしておきます。スクリプトから保存先を指定するために使います。

4-3. Googleフォームを作る(5分)

新規Googleフォームを作成し、以下の設問を追加します。

  • 業務名(短文)
  • 対象者(誰向け?新人/派遣/外注など)(短文)
  • 目的・ゴール(段落)
  • 前提条件・必要ツール(段落)
  • 使用するシステム/画面名(任意・段落)
  • 元となる手順メモ(段落)
  • 注意点・頻出ミス(任意・段落)


フォーム設定で「メールアドレスを収集」をオンにすると、完成リンクを自動送信できます(任意)。


4-4. 回答先スプレッドシートを作る(1分)

  1. フォームの「回答」からスプレッドシートを作成。


  2. シートの一番右に「生成ドキュメントURL」という列を1つ追加。


4-5. Apps Scriptを開く(1分)

  1. シート上部メニュー「拡張機能」→「Apps Script」を開く。


  2. 出てきたコードをすべて削除して、次のスクリプトを貼り付けます。
// === 設定値(Script Propertiesに入れる推奨)===
// OPENAI_API_KEY: OpenAIのAPIキー
// OUTPUT_FOLDER_ID: 保存先フォルダID(省略可:未設定ならマイドライブ直下)
// MODEL: 既定値は gpt-4o-mini(低コスト・高品質)

function onFormSubmit(e) {
  try {
    const sheet = e.range.getSheet();
    const row = e.range.getRow();
    const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    const get = (name) => (e.namedValues[name] ? String(e.namedValues[name][0]) : "");

    const email = get("メールアドレス"); // フォームで収集をONにしている場合
    const bizName = get("業務名");
    const audience = get("対象者(誰向け?新人/派遣/外注など)");
    const goal = get("目的・ゴール");
    const prereq = get("前提条件・必要ツール");
    const systems = get("使用するシステム/画面名");
    const rawSteps = get("元となる手順メモ");
    const cautions = get("注意点・頻出ミス");

    const systemPrompt = "あなたは日本語の業務マニュアル作成アシスタントです。初心者にもわかる見出し、番号付き手順、注意・チェックリストを含め、冗長さを避けて簡潔に出力してください。最終出力はMarkdownで。";

    const userPrompt = manualPromptTemplate({
      bizName, audience, goal, prereq, systems, rawSteps, cautions,
    });

    const content = callOpenAI(systemPrompt, userPrompt);

    const docUrl = saveToGoogleDoc(bizName, content);

    // URLを書き戻す
    const urlCol = headers.indexOf("生成ドキュメントURL") + 1;
    if (urlCol > 0) sheet.getRange(row, urlCol).setValue(docUrl);

    // 任意でメール送信
    if (email) {
      const subject = `【自動生成】${bizName} マニュアル`;
      const body = `以下のリンクからご確認ください。\n${docUrl}\n\n必要に応じて加筆修正してください。`;
      MailApp.sendEmail(email, subject, body);
    }
  } catch (err) {
    Logger.log(err);
    // エラー内容を最終列に書いておくと原因追跡が楽
    const sheet = e.range.getSheet();
    const row = e.range.getRow();
    sheet.getRange(row, sheet.getLastColumn()).setNote("Error: " + err.message);
  }
}

function manualPromptTemplate(d){
  return `以下の情報から、社内配布可能な日本語の業務マニュアルを作ってください。Markdownで出力し、構成は以下に厳密に従ってください。

# タイトル: ${d.bizName}

## 想定読者
${d.audience}

## 目的(完了条件)
${d.goal}

## 前提条件・必要ツール
${d.prereq}

## 使用するシステム/画面
${d.systems}

## 手順
- 以下のメモを根拠に、番号付きで具体化し、各手順に「確認ポイント」を1行付けてください。
${d.rawSteps}

## 注意点・頻出ミスと対策
${d.cautions}

## チェックリスト(実施前/実施後)
- 実施前: 5項目
- 実施後: 5項目

## 更新履歴(初期)
- 初版作成(自動生成・日付は現在日付)`;
}

function callOpenAI(systemPrompt, userPrompt){
  const props = PropertiesService.getScriptProperties();
  const apiKey = props.getProperty('OPENAI_API_KEY');
  if (!apiKey) throw new Error('OPENAI_API_KEY が未設定です');
  const model = props.getProperty('MODEL') || 'gpt-4o-mini';

  const payload = {
    model,
    messages: [
      { role: 'system', content: systemPrompt },
      { role: 'user', content: userPrompt }
    ],
    temperature: 0.2
  };
  const res = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });
  if (res.getResponseCode() >= 400) throw new Error('OpenAI API error: ' + res.getContentText());
  const data = JSON.parse(res.getContentText());
  return data.choices[0].message.content.trim();
}

function saveToGoogleDoc(bizName, markdown){
  const props = PropertiesService.getScriptProperties();
  const folderId = props.getProperty('OUTPUT_FOLDER_ID');
  const docTitle = `【マニュアル】${bizName}`;
  const doc = DocumentApp.create(docTitle);
  const file = DriveApp.getFileById(doc.getId());
  if (folderId) {
    DriveApp.getFolderById(folderId).addFile(file);
    DriveApp.getRootFolder().removeFile(file);
  }
  // 簡易:Markdownのまま貼り付け(まずは動かす)。
  // 後でアドオンや独自パーサで整形可能。
  doc.getBody().appendParagraph(markdown);
  doc.saveAndClose();
  return doc.getUrl();
}

// テスト用:フォームを待たずに動かす
function debugRun(){
  const fake = {
    range: SpreadsheetApp.getActiveSheet().getRange(2,1),
    namedValues: {
      'メールアドレス': ['you@example.com'],
      '業務名': ['請求書発行手順'],
      '対象者(誰向け?新人/派遣/外注など)': ['経理新人'],
      '目的・ゴール': ['月末締め翌月5日までに請求書PDFを送付する'],
      '前提条件・必要ツール': ['会計ソフトA・テンプレExcel・社判PNG'],
      '使用するシステム/画面名': ['会計ソフトA>売上>請求書作成'],
      '元となる手順メモ': ['売上データ確認→テンプレ入力→PDF出力→取引先へメール送付'],
      '注意点・頻出ミス': ['宛名・金額の誤字/税率ミス・締め日の勘違い']
    }
  };
  onFormSubmit(fake);
}

ここではまだ実行せずに保存だけして次の手順に進んでください。

4-6. Script Propertiesにキーを保存(1分)

  1. Apps Script左メニューの「歯車」→「プロジェクトの設定」→「スクリプト プロパティを追加」して「スクリプト プロパティを保存」。
  2. 以下を追加して保存:
    OPENAI_API_KEY = 取得したキー
    OUTPUT_FOLDER_ID = 4-2で控えたID
    MODEL = gpt-4o-mini

 

4-7. 権限付与とトリガー設定(3分)

  1. エディタに戻って上部の関数を debugRun にして「デバッグ」し、求められる権限(ドライブ/メール/外部接続)を許可。


  2. 次に「トリガー」→「トリガーを追加」→ 実行関数に onFormSubmit、イベントのソースを「スプレッドシートから」、イベントの種類を「フォーム送信時」にして保存する。
    権限を求められたら同じように許可してください。


フォーム回答を受け取った瞬間に自動実行するためにこの設定にしています。

5. 自動化ツールの設定(テンプレート付き)

5-1. プロンプト(指示文)テンプレート

上のコードに含まれる manualPromptTemplate がテンプレートです。見出しの順番・粒度が安定するため、まずはそのまま使いましょう。モデルは MODEL プロパティで変更可能です(迷ったら gpt-4o-miniでテストするのが安くておすすめ)。

5-2. フォーム設問テンプレート(再掲)

  • 業務名 / 対象者 / 目的・ゴール / 前提条件・必要ツール / 使用するシステム/画面名 / 元となる手順メモ / 注意点・頻出ミス

 

6. 動作確認(実際の質問例)

6-1. 入力例(フォームにそのまま貼り付けOK)

  • 業務名:請求書発行手順(定期請求)
  • 対象者:経理新人
  • 目的・ゴール:月末締め、翌月5日までに全取引先へ請求書PDFを送付し、金額・宛名ミスをゼロにする。
  • 前提条件・必要ツール:会計ソフトA、請求書テンプレExcel、社判PNG、取引先マスタ
  • 使用するシステム/画面名:会計ソフトA>売上>請求書作成
  • 元となる手順メモ:「売上データ確認→テンプレ入力→PDF出力→取引先へメール送付」
  • 注意点・頻出ミス:宛名/税率/金額桁のミス、締め日の勘違い

6-2. 期待される出力(要点)

  • タイトル、想定読者、目的、前提条件が明示される
  • 番号付き手順に「確認ポイント」が1行ずつ付与される
  • 注意点・頻出ミス、チェックリスト(実施前/後 各5項目)が付く
  • Googleドキュメントに保存され、シートの「生成ドキュメントURL」にリンクが入る(任意でメール通知)

 

7. うまく動かないときのチェックポイント

  • APIキー未設定:Apps Script「スクリプトのプロパティ」にOPENAI_API_KEYがあるか確認。
  • 権限未許可:debugRunを実行して、ドライブ/メール/外部接続の許可を与えたか。
  • トリガー種類の誤り:「スプレッドシート」「フォーム送信時」になっているか。
  • 列名の不一致:シートのヘッダーがコードの名称と一致しているか(全角・記号含めて完全一致)。
  • 「生成ドキュメントURL」列が存在するか:無ければ作成し、列名を正確に。
  • フォルダIDの誤り:OUTPUT_FOLDER_IDが空なら直下保存、ID指定時はアクセス権限があるか。
  • APIエラー:シートの最終列のノートやApps Scriptのログにエラーメッセージが出ていないか(課金上限・キー失効など)。
  • メールが届かない:迷惑メール、Gmail送信上限(無料アカウントは日次制限あり)を確認。

多くの不具合は「プロパティ未設定」「権限未許可」「列名不一致」です。1つずつ潰せば必ず動きます。

8. 次にできる改善アイデア

  • Markdown→Googleドキュメントの書式変換:簡易パーサを追加し、見出し/箇条書きを自動装飾。
  • Slack/Chat通知:生成完了をWebhookで通知(担当者メンション)。
  • 版管理:ドキュメントの先頭に「版数」と「更新履歴」を自動追記。
  • 承認フロー:生成後にGoogleフォームで「承認/差戻し」を受け付け、状態列を更新。
  • 画像キャプチャ添付:フォームで画像URLを受け取り、ドキュメントに貼り付け(Apps Scriptの画像挿入API)。
  • モデル最適化:長文・高難度が多い場合のみ gpt-4o を使い、通常は gpt-4o-mini に切替えてコスト最適化。
  • セキュリティ:機微情報はマスキングし、外部送信しない項目を分離。必要に応じて社内LLMに切替も検討。

まずは今日「動く」形を作れたら成功です。改善はいつでも少しずつ重ねられます。