GAS業務自動化

GASでChatGPT APIを呼び出す方法|初心者向けステップバイステップ

GASでChatGPT APIを呼び出す方法のイラスト

OpenAI APIの月間リクエスト数は2025年だけで前年比300%超の伸びを記録しました。この成長を支えている大きな要因のひとつが、Google Apps Script(GAS)からの呼び出しです。Googleスプレッドシートやフォームと連携できるGASは、プログラミング経験がなくても業務自動化ツール開発サービスのような高度な仕組みを自力で構築できる手段として注目されています。本記事では、GASからChatGPT API(OpenAI API)を呼び出す方法を、環境構築からコード実装まで完全にステップバイステップで解説します。

GASでChatGPT APIを使うメリットと全体像

なぜGAS × ChatGPT APIの組み合わせが選ばれるのか

GASはGoogleが無料で提供しているサーバーレスの実行環境です。サーバー契約もデプロイ作業も不要で、Googleアカウントさえあればブラウザ上でコードを書いてすぐに動かせます。ここにChatGPT APIを組み合わせると、スプレッドシートの入力値をAIに渡して要約・分類・翻訳などを一括で処理する仕組みが、最短30分で完成します。

外部サーバーを用意する方式と比較した場合、GASには「Google Workspace製品とネイティブに統合されている」「トリガー機能で定期実行できる」「JavaScriptベースで学習コストが低い」という3つの優位性があります。特にスプレッドシートとの連携は、関数を呼ぶだけでセルの値を読み書きできるため、非エンジニアでも実装しやすい点が大きな強みです。

処理フローの全体像

GASからChatGPT APIを呼び出す処理は、大きく3つのステップに分かれます。まずGAS側でリクエスト用のJSONを組み立て、次にUrlFetchAppを使ってOpenAIのエンドポイントにPOSTリクエストを送信し、最後に返ってきたJSONレスポンスからAIの回答テキストを取り出します。この流れはモデルがGPT-4o、GPT-4.1、GPT-3.5のいずれであっても共通です。

ステップ 処理内容 使用するGAS関数
1. リクエスト構築 モデル名・プロンプト・temperatureなどをJSON形式で組み立てる JSON.stringify()
2. API送信 OpenAIのChat Completionsエンドポイントへ送信 UrlFetchApp.fetch()
3. レスポンス解析 返却されたJSONからAIの回答テキストを抽出 JSON.parse()

事前準備 ― OpenAI APIキーの取得とGASプロジェクトの作成

OpenAI APIキーを取得する手順

OpenAIの公式サイト(platform.openai.com)にアクセスし、アカウントを作成します。ログイン後、左メニューの「API keys」を開き、「Create new secret key」ボタンをクリックすると、sk-から始まるAPIキーが発行されます。このキーは一度しか表示されないため、必ずコピーして安全な場所に保管してください。

APIの利用には課金設定が必要です。「Settings」から「Billing」に進み、クレジットカードを登録します。2026年4月時点でGPT-4oの料金は入力100万トークンあたり2.50ドル・出力100万トークンあたり10.00ドル、GPT-4.1は入力2.00ドル・出力8.00ドルです。日常的なスプレッドシート処理であれば、月額数百円から数千円程度に収まるケースがほとんどです。

GASプロジェクトを作成してAPIキーを安全に保管する

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」を選択します。エディタが開いたら、まずAPIキーの保管場所を設定します。コードに直書きすると漏洩リスクがあるため、GASの「スクリプトプロパティ」を使います。

左メニューの歯車アイコン「プロジェクトの設定」を開き、「スクリプトプロパティ」セクションで「プロパティを追加」をクリックします。プロパティ名に「OPENAI_API_KEY」、値に先ほどコピーしたAPIキーを貼り付けて保存します。これでコード内からPropertiesService.getScriptProperties().getProperty(‘OPENAI_API_KEY’)で安全に取得できるようになります。

セキュリティ上の注意点

APIキーをソースコードに直書きしたり、スプレッドシートのセルに入力したりするのは絶対に避けてください。GASのスクリプトプロパティは暗号化されて保存されるため、第三者がスプレッドシートを閲覧してもキーは見えません。チームで共有する場合も、プロパティ経由のアクセスに統一することを推奨します。

基本コード ― UrlFetchAppでAPIを呼び出す

最小構成のリクエストコード

ここからは実際のコードを見ていきます。以下が、GASからChatGPT APIを呼び出す最小構成のコードです。

function callChatGPT() {
  var apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  var url = 'https://api.openai.com/v1/chat/completions';

  var payload = {
    model: 'gpt-4o',
    messages: [
      { role: 'system', content: 'あなたは優秀なアシスタントです。' },
      { role: 'user', content: 'Google Apps Scriptとは何ですか?100文字以内で説明してください。' }
    ],
    temperature: 0.7,
    max_tokens: 500
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    headers: { 'Authorization': 'Bearer ' + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(url, options);
  var json = JSON.parse(response.getContentText());
  var answer = json.choices[0].message.content;

  Logger.log(answer);
  return answer;
}

このコードでは、まずスクリプトプロパティからAPIキーを取得し、OpenAIのChat Completionsエンドポイントに対してPOSTリクエストを送信しています。payloadの中でmodel、messages、temperature、max_tokensの4つのパラメータを指定しています。

パラメータの詳細と調整方法

APIリクエストのパラメータを理解しておくと、用途に応じて出力品質を調整できます。主要なパラメータは以下のとおりです。

パラメータ 役割 推奨値
model 使用するAIモデルを指定 gpt-4o(高性能)/ gpt-4.1-nano(低コスト)
messages 会話履歴をrole+content形式で渡す systemで役割設定、userで質問
temperature 出力のランダム性(0〜2) 正確性重視なら0.2、創造性重視なら0.8
max_tokens 出力の最大トークン数 用途に応じて300〜2000

messagesのroleには「system」「user」「assistant」の3種類があります。systemロールはAIの振る舞いを定義するもので、ここに「あなたはマーケティングの専門家です」のように書くと、その後の回答がマーケティング視点に寄ります。userは人間からの質問、assistantはAIの過去の回答をセットすることで、会話の文脈を引き継がせることもできます。

レスポンスの構造と取り出し方

APIから返ってくるJSONレスポンスには、AIの回答のほかに使用トークン数などの情報が含まれています。回答テキストはjson.choices[0].message.contentで取り出せます。トークン使用量はjson.usage.total_tokensで確認でき、コスト管理に役立ちます。

// レスポンスから必要な情報を取り出す
var json = JSON.parse(response.getContentText());
var answer = json.choices[0].message.content;       // AIの回答
var totalTokens = json.usage.total_tokens;           // 合計トークン数
var promptTokens = json.usage.prompt_tokens;         // 入力トークン数
var completionTokens = json.usage.completion_tokens; // 出力トークン数

Logger.log('回答: ' + answer);
Logger.log('使用トークン: ' + totalTokens);

実践応用 ― スプレッドシートと連携して一括処理する

セルの値を読み取ってAIに渡す

GASの真価は、スプレッドシートとの連携にあります。たとえばA列に商品説明文が100行入っているとき、それぞれの説明文をAIに渡して要約をB列に自動入力する、という処理がわずか数十行のコードで実現できます。

function summarizeColumn() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  var url = 'https://api.openai.com/v1/chat/completions';

  for (var i = 2; i <= lastRow; i++) {
    var inputText = sheet.getRange(i, 1).getValue();
    if (!inputText || sheet.getRange(i, 2).getValue()) continue;

    var payload = {
      model: 'gpt-4o',
      messages: [
        { role: 'system', content: '以下のテキストを50文字以内で要約してください。' },
        { role: 'user', content: inputText }
      ],
      temperature: 0.3,
      max_tokens: 200
    };

    var options = {
      method: 'post',
      contentType: 'application/json',
      headers: { 'Authorization': 'Bearer ' + apiKey },
      payload: JSON.stringify(payload),
      muteHttpExceptions: true
    };

    var response = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(response.getContentText());

    if (json.choices && json.choices.length > 0) {
      sheet.getRange(i, 2).setValue(json.choices[0].message.content);
    }

    Utilities.sleep(1000); // レート制限対策で1秒待機
  }
}

ポイントは2つあります。1つ目は、B列にすでに値がある行はスキップする処理です。これにより、途中でエラーが起きても再実行時に処理済みの行を飛ばせます。2つ目は、ループの最後にUtilities.sleep(1000)で1秒の待機を入れている点です。OpenAI APIにはレート制限があるため、連続リクエストを送ると429エラーが返る可能性があります。

カスタム関数として使う方法

GASではスプレッドシートのカスタム関数を作ることもできます。セルに=ASK_GPT(“この商品を3行で紹介して”)と入力するだけでAIの回答が返るため、関数に馴染みがある方には直感的です。

function ASK_GPT(prompt, model) {
  if (!prompt) return '';
  model = model || 'gpt-4o';
  var apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  var url = 'https://api.openai.com/v1/chat/completions';

  var payload = {
    model: model,
    messages: [{ role: 'user', content: prompt }],
    temperature: 0.7,
    max_tokens: 500
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    headers: { 'Authorization': 'Bearer ' + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(url, options);
  var json = JSON.parse(response.getContentText());
  return json.choices[0].message.content;
}

ただしカスタム関数には注意点があります。シートを再計算するたびにAPIが呼ばれるため、意図せずコストが膨らむ可能性があります。大量のセルで使う場合は、前述のループ処理方式のほうが安全です。

無料ダウンロード

業務自動化・効率化100選

GASや生成AIを活用した業務自動化のアイデアを100件厳選。すぐに使えるテンプレートとコード例付きです。

資料を見てみる

エラー対策とコスト管理のポイント

よく発生するエラーと対処法

GASからOpenAI APIを呼び出す際に遭遇しやすいエラーは、大きく3つに分類できます。

エラーコード 原因 対処法
401 Unauthorized APIキーが無効または未設定 スクリプトプロパティの値を再確認。キーを再発行して貼り直す
429 Too Many Requests レート制限に到達 Utilities.sleep()で待機時間を挿入。Tier昇格も検討
500 / 503 OpenAI側のサーバー障害 リトライ処理を組み込む(指数バックオフ推奨)

特に429エラーは、ループ処理で大量のリクエストを送る際に頻出します。対策として、エラーが返った場合に一定時間待ってからリトライする「指数バックオフ」を実装しておくと安定します。

function fetchWithRetry(url, options, maxRetries) {
  maxRetries = maxRetries || 3;
  for (var attempt = 0; attempt < maxRetries; attempt++) {
    var response = UrlFetchApp.fetch(url, options);
    var code = response.getResponseCode();
    if (code === 200) return response;
    if (code === 429 || code >= 500) {
      var wait = Math.pow(2, attempt) * 2000; // 2秒, 4秒, 8秒
      Utilities.sleep(wait);
    } else {
      throw new Error('APIエラー: ' + code + ' ' + response.getContentText());
    }
  }
  throw new Error('最大リトライ回数を超えました');
}

コストを抑える3つの方法

APIのコストを最適化するには、以下の3点を意識してください。

1つ目は、用途に応じたモデル選択です。高い推論能力が必要な分析タスクにはGPT-4oやGPT-4.1を使い、単純な分類や定型文生成にはGPT-4.1-nanoやGPT-4o-miniを選ぶことで、品質を維持しながらコストを10分の1以下に削減できます。

2つ目は、max_tokensの適切な設定です。必要以上に大きな値を設定すると、出力が長くなりコストが増えます。要約なら200、分類なら50のように、タスクに合わせて上限を絞りましょう。

3つ目は、systemプロンプトの最適化です。systemメッセージは毎回のリクエストで送信されるため、冗長な指示を書くとトークンが無駄になります。端的かつ明確な指示に絞ることで、入力トークンを抑えられます。

GASの実行時間制限への対応

GASには1回の実行で6分間という制限があります。数百行のスプレッドシートを一括処理する場合、この制限に引っかかる可能性があります。対策としては、処理済みの行数をスクリプトプロパティに記録しておき、トリガーで数分おきに関数を再起動する方法が有効です。こうすることで、数千行のデータでも時間制限を回避しながら処理を完走できます。

よくある質問(FAQ)

Q.GASからChatGPT APIを無料で使えますか?

A.GAS自体は無料ですが、OpenAI APIは従量課金制のため利用料金が発生します。ただし、GPT-4.1-nanoであれば入力100万トークンあたり0.10ドルと非常に安価で、日常的な業務利用であれば月額数百円程度に収まることが多いです。

Q.APIキーが漏洩した場合はどうすればよいですか?

A.直ちにOpenAIのダッシュボードでそのキーを無効化(Revoke)してください。その後、新しいキーを発行し、GASのスクリプトプロパティを更新します。漏洩期間中に不正利用がないか、Usage画面で利用状況を確認することも重要です。

Q.GPT-4oとGPT-4.1はどちらを選べばよいですか?

A.GPT-4.1は100万トークンのコンテキストウィンドウを持ち、料金もGPT-4oより約20%安価です。大量のテキストを処理する場合や長い文脈を保持したい場合はGPT-4.1、画像入力や音声との連携が必要な場合はGPT-4oが適しています。

Q.GASの6分制限を超える大量データはどう処理すればよいですか?

A.処理済みの行番号をスクリプトプロパティに保存し、時間ベースのトリガー(例:5分おき)で関数を再実行する分割処理方式が定番です。1回の実行で5分を超えそうになったら処理を中断し、次回のトリガーで続きから再開します。

まとめ

この記事のポイント

  • GASからChatGPT APIを呼び出すには、OpenAI APIキーの取得・スクリプトプロパティへの保管・UrlFetchAppによるPOSTリクエストの3ステップで完結する
  • APIキーは必ずスクリプトプロパティに保管し、コードへの直書きは漏洩リスクがあるため厳禁
  • スプレッドシート連携ではループ処理とUtilities.sleep()によるレート制限対策が安定運用の鍵
  • コスト最適化にはモデル選択(GPT-4o / GPT-4.1-nano等)、max_tokens制限、systemプロンプトの簡潔化が有効
  • 6分の実行制限はトリガーによる分割処理で回避でき、数千行規模のデータも処理可能

吉元大輝

よしもとひろき

株式会社BoostX 代表取締役社長

中小企業の生成AI導入を支援する「生成AI伴走顧問」サービスを提供。業務可視化から定着支援まで、一気通貫で企業のAI活用を推進している。

※本記事の情報は2026年4月時点のものです。

SNSで共有する
無料個別相談

貴社の業務に、 AIという確かな選択肢を。

「何から始めればいいか分からない」という段階でも構いません。現状の課題を伺い、最適な導入計画をプロと一緒に整理します。

\ 専門家による30分のヒアリング /

無料相談を予約する

オンライン対応可能・強引な勧誘なし

まずは資料で情報収集したい方へ

サービス概要・料金・導入事例をまとめた資料を無料でお送りします。

資料をダウンロード