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が呼ばれるため、意図せずコストが膨らむ可能性があります。大量のセルで使う場合は、前述のループ処理方式のほうが安全です。
エラー対策とコスト管理のポイント
よく発生するエラーと対処法
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分の実行制限はトリガーによる分割処理で回避でき、数千行規模のデータも処理可能
※本記事の情報は2026年4月時点のものです。