ChatGPTとスプレッドシートの連携方法|A列入力でB列に自動回答を作る手順

ChatGPTとスプレッドシートの連携方法|A列入力でB列に自動回答を作る手順

この記事はまだ自動化を一度も試したことがない方向けに「ChatGPTとGoogleスプレッドシートを連携し、A列に質問を入れるとB列に自動で回答が書かれる」仕組みを、最後まで作り切るための手順をまとめたものです。

むずかしいことを考えなくても実際に動くところまで30分前後で到達できるよう書いてみました。

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

以下の自動化を完成させます。

  • GoogleスプレッドシートのA列に質問文を入力
  • 数秒後、B列にChatGPTの日本語回答が自動で入る
  • C列には実行時刻(またはステータス)が記録される

この仕組みは社内の定型QA、要約、文案のたたき台作成などにすぐ使えます。
無料プランを中心に進めますが、ChatGPTのAPI利用は少額の従量課金(クレジットカード登録が必要)です。費用は1回の実行あたり数円未満に収まる想定で、後述の「上限設定」で無駄な出費を防げます。

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

仕組みはシンプルです。GoogleスプレッドシートにGoogle Apps Script(GAS)という軽いプログラムを1本入れ、OpenAIのAPI(ChatGPTのエンジン)に質問を送って、返ってきた答えをシートに書き戻します。
ポイントは「編集をきっかけに自動実行」できるように、GASのトリガー(自動で動くスイッチ)を設定すること。これでA列に入力するだけでB列が埋まります。

難しい専門用語は都度補足していきますので、まずは「Aに入れたらBが自動で返る」まで進めてみましょう。

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

  • Googleアカウント(無料)…スプレッドシートとGASを使うため
  • OpenAIアカウント(API用)…ChatGPTのAPIを使うため。クレジットカード登録が必要、従量課金

補足:

  • ChatGPTのWeb版(Plusなど)は今回は不要です。使うのは「OpenAI API」です。
  • 費用は使った分だけ。安価なモデル(gpt-4o-mini 等)を使い、トークン上限を小さめにすれば、テストは数十円以内で収まります。
  • 後述の「Usage limits(利用上限)」で、月額の上限金額を必ず設定しましょう。予想外の請求額になることを防げます!

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

4-1. OpenAI APIの準備(5〜10分)

  1. OpenAIのサイトでアカウントを作成し、ログインします。
  2. Billing(課金設定)の「Payment methods」でクレジットカードを登録します。
  3. Limits(利用上限)で「Edit budget」を小さく設定(例:$1〜$5)。


  4. API keysのページで「Create new secret key」を押してキーを作成し、メモしておきます。キーは他人に絶対に見せないでください。



不安な方へ:上限設定さえしておけば、思わぬ高額請求はまず起きません。最初は$1で十分なのでまずは動作確認して、その後に上げればOKです。

4-2. Googleスプレッドシートの準備(3分)

  1. 新しいスプレッドシートを作成し、シート名は「Chat」としておくと分かりやすいです。


  2. 1行目に見出しを入れます。A1=質問、B1=回答、C1=状態/時刻。

 

4-3. Apps Script(GAS)の準備(10分)

  1. スプレッドシート画面で「拡張機能」→「Apps Script」を開き、新しいプロジェクトが開いたら、コードエディタに以下のコードを貼り付けます。
const MODEL = 'gpt-4o-mini'; // 低コストで十分高品質

function getApiKey_() {
  const key = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  if (!key) throw new Error('OPENAI_API_KEY が未設定です。プロジェクト設定のスクリプトプロパティに追加してください。');
  return key;
}

function askChatGPT_(prompt) {
  const apiKey = getApiKey_();
  const url = 'https://api.openai.com/v1/chat/completions';
  const payload = {
    model: MODEL,
    messages: [
      { role: 'system', content: 'あなたは簡潔に答える日本語アシスタントです。' },
      { role: 'user', content: String(prompt).slice(0, 4000) }
    ],
    temperature: 0.2,
    max_tokens: 600
  };
  const res = UrlFetchApp.fetch(url, {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + apiKey },
    muteHttpExceptions: true,
    payload: JSON.stringify(payload)
  });
  const code = res.getResponseCode();
  if (code >= 300) throw new Error('OpenAI API エラー: ' + code + ' ' + res.getContentText());
  const data = JSON.parse(res.getContentText());
  const text = data.choices && data.choices[0].message.content;
  return (text || '').trim();
}

// シート編集時に自動応答する本体(インストール型トリガーで使う)
function runOnEdit(e) {
  try {
    const sheet = e.source.getActiveSheet();
    if (sheet.getName() !== 'Chat') return; // 対象シートを限定
    const range = e.range;
    if (range.getColumn() !== 1 || range.getRow() === 1) return; // A列・見出し行は無視

    const question = range.getValue();
    if (!question) return;

    const answerCell = sheet.getRange(range.getRow(), 2);
    const statusCell = sheet.getRange(range.getRow(), 3);
    if (answerCell.getValue()) return; // 既に回答があれば何もしない

    statusCell.setValue('処理中…');
    const answer = askChatGPT_(question);
    answerCell.setValue(answer);
    statusCell.setValue(new Date());
  } catch (err) {
    try {
      const sheet = SpreadsheetApp.getActiveSheet();
      const row = (e && e.range) ? e.range.getRow() : 2;
      sheet.getRange(row, 3).setValue('エラー: ' + String(err.message).slice(0, 200));
    } catch (_) {}
    throw err;
  }
}

// 初回の権限付与と動作テスト用のメニュー
function onOpen() {
  SpreadsheetApp.getUi().createMenu('ChatGPT')
    .addItem('APIテストを実行', 'testOnce_')
    .addToUi();
}

function testOnce_() {
  const ans = askChatGPT_('これは接続テストです。1文で返答してください。');
  SpreadsheetApp.getUi().alert('API疎通OK:\n' + ans);
}

// 任意:セル関数としても使いたい場合
function GPT(prompt) { return askChatGPT_(prompt); }
  1. エディタ左の歯車アイコン「プロジェクト設定」を開き、「スクリプトプロパティ」を追加します。キー名に「OPENAI_API_KEY」、値に先ほど発行したAPIキーを貼り付けて保存。


  2. スプレッドシートに戻ってリロードするとメニューに「ChatGPT」が現れます。
    「APIテストを実行」をクリックすると、初回は権限付与の確認画面が出ます。指示に従って許可してください。

 

5. 自動化ツールの設定(トリガーで“自動で動く”にする)

  1. Apps Scriptの画面で左側の「トリガー」→「トリガーを追加」。
  2. 実行する関数に「runOnEdit」を選択。イベントのソースは「スプレッドシートから」、イベントの種類は「編集時」。


  3. 初回は追加時に再び権限確認が出ることがあります。許可してください。

これで「A列に質問→B列に自動回答」の基盤が完成です。

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

  1. スプレッドシートの「Chat」シートで、A2に以下のような質問を入れてみます。例:「社内掲示用に“今週の社内イベントを一文で告知”してください。条件:30文字以内、絵文字なし。」
  2. 数秒待つと、B2に短い日本語の回答が自動で入ります。C2には実行時刻か「処理中…→時刻」の表示が残ります。

他にも試せる例:

  • 「次の文を敬語に直して:明日集まって作業します」
  • 「メール件名案を3つ。条件:短め、営業向け、クリックしたくなる」
  • 「この文章を100文字で要約:…(本文)」

うまくいけば、以降はA列にどんどん質問を入れるだけで自動化完了です。

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

  • APIキーが未設定/タイプミス:GAS「プロジェクト設定」→スクリプトプロパティの「OPENAI_API_KEY」を再確認。先頭末尾の空白にも注意。
  • OpenAIの課金/上限:Billingが未設定、またはUsage limitsで上限に達しているとエラー(例:401/403)。ダッシュボードで確認し、上限を$1〜$5に設定。
  • モデル名の誤り:コードのMODELが存在しないとエラー。まずは gpt-4o-mini をそのまま使いましょう。
  • トリガーの種類違い:runOnEdit が「編集時」になっているか。別の関数や「時間主導」になっていないか確認。
  • 対象シート名:コードは sheet.getName() !== 'Chat' で限定しています。シート名が違うと動きません。揃えるか、その行を削除。
  • 会社のネットワーク制限:まれに外部API通信が制限されている環境があります。自宅回線や別Googleアカウントで再テスト。
  • 429(レート制限):短時間に連投すると制限されることがあります。数分空けて再実行、またはA列の入力を間引く。
  • セル保護/権限:B列やC列が保護されていないか。編集権限のあるアカウントで試す。
  • GASの実行ログを見る:Apps Script画面「実行」→「ログ」や「トリガー」→「実行ログ」でエラー本文を確認。エラー文をそのまま検索すると解決策が出やすいです。

ここで失敗しても大丈夫です。エラー文の多くは「キー未設定」「課金未設定」「トリガー未設定」に集約されます。上から順に落ち着いて確認しましょう。

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

  • プロンプトの型を固定:D1に「共通指示(例:常に敬語・箇条書きで)」を置き、askChatGPT_に追加。回答の一貫性が増します。
  • コスト制御:max_tokensを300程度に下げる、A列の文字数を制限する、短い表現を求める。OpenAIのUsageで上限を厳しめに。
  • 用途別シート:要約用、翻訳用、メール件名用などシートを分け、systemメッセージを用途に合わせて最適化。
  • バッチ処理:編集トリガーの代わりに「時間主導(1分おき)」で、未回答の行だけ順に処理。大量行でレート制限に優しい運用に。
  • セル関数活用:=GPT(A2) でも動かせます(任意)。ただし関数は再計算が多くなるので、トリガー方式のほうが無駄なAPI呼び出しが起きにくいです。
  • ログ/監査:別シートに質問・回答・トークン見積り・時刻を追記して履歴化。月末にざっくり使用量を振り返れます。
  • 禁止語/守秘:機密情報は入れない運用ルールを明記。社外共有のシートではトリガーを無効化するなどのガードを。

さいごに

「A列に質問→B列に自動回答」ができたら、もう立派な自動化の第一歩です。最適解を求めすぎず、まずは1つ動かす。そのあとで指示文の磨き込みやコスト最適化をしていけば十分間に合います。分からないところは、エラー文をそのまま検索、または上のチェックリストに戻って確認してみてください。