問い合わせへの返信文、日報の要約、商品説明の下書き。
文面はほぼ定型なのに、毎回ゼロから書き起こしていないでしょうか。
ChatGPTの画面を開いて元情報を貼り付け、生成された文章をコピーしてシートに戻す。
この往復自体を自動化できれば、手作業はシートに元情報を入れるところだけになります。
この記事では、Google Apps ScriptからChatGPT APIを呼び出し、シートの行ごとに定型文章を自動生成する仕組みを整理しています。
コードは全文をそのまま貼り付けて動く形で載せています。
できることと費用の考え方
シートの各行に元になる情報を入れておき、スクリプトを実行すると隣の列に生成結果が自動で入る仕組みを作ります。
問い合わせ対応の一次返信文、日報の要約、簡単な商品説明文など、型が決まっている文章の下書き生成に向いています。
一方で、ChatGPT APIはブラウザ版のChatGPTと違って無料枠がなく、呼び出しのたびに使った分量に応じて費用が発生する従量課金です。
料金はモデルの種類や改定によって変わるため、具体的な単価はここには書きません。
実行前に必ず公式の料金ページで最新の金額を確認してください。
出典:OpenAI「API Pricing」
手動でChatGPTの画面を使う場合とAPI連携する場合では、向いている場面が変わります。
| 観点 | ChatGPT画面を手動操作 | ChatGPT APIをGoogle Apps Scriptから呼び出す |
|---|---|---|
| 費用 | 契約プランの範囲内で追加費用なし | 呼び出し量に応じた従量課金 |
| 向いている件数 | 1件〜数件を都度確認しながら生成 | 数十件以上をまとめて自動生成 |
| 元情報の入力 | 手作業でコピー&ペースト | シートの値をそのまま読み込み |
| 呼び出し方法 | ブラウザ画面を人が操作 | Google Apps Scriptから呼び出す |
件数が少なく、都度内容を見ながら調整したい場合はChatGPTの画面操作で十分です。
まとまった件数を同じ型で生成したい場合に、API連携の効果が出てきます。
手順
Step1. APIキーを取得してスクリプトプロパティに保存する
OpenAIのアカウントでAPIキーを発行し、コピーしておきます。
このキーはコードやシートに直書きしません。
Apps Scriptの「プロジェクトの設定」から「スクリプト プロパティ」を開き、プロパティ名をOPENAI_API_KEY、値に発行したキーを入力して保存します。
APIキーはWebhook URLと同じく、知っている人なら誰でもそのアカウントの費用でAPIを呼び出せてしまう情報です。
コードのコメント、シートのメモ欄、共有ドキュメントなど、他人の目に触れる場所には絶対に書かないでください。
Step2. コードを貼り付ける(コード全文)
対象のスプレッドシートで「拡張機能」から「Apps Script」を開き、以下のコードを全文貼り付けます。
TARGET_SHEET_NAMEに元情報を入れているシート名を入力してください。
function generateTextWithChatGpt() {
const TARGET_SHEET_NAME = "文章生成";
const SOURCE_COLUMN = 1; // A列: 元になる情報
const RESULT_COLUMN = 2; // B列: 生成結果
const MODEL_NAME = "gpt-4o-mini";
const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
if (!apiKey) {
throw new Error("スクリプトプロパティにOPENAI_API_KEYが設定されていません");
}
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TARGET_SHEET_NAME);
if (!sheet) {
throw new Error(`シート「${TARGET_SHEET_NAME}」が見つかりません`);
}
const lastRow = sheet.getLastRow();
for (let row = 2; row <= lastRow; row++) {
const sourceText = sheet.getRange(row, SOURCE_COLUMN).getValue();
const existingResult = sheet.getRange(row, RESULT_COLUMN).getValue();
if (sourceText === "" || existingResult !== "") continue;
const generatedText = callChatGptApi(sourceText, apiKey, MODEL_NAME);
sheet.getRange(row, RESULT_COLUMN).setValue(generatedText);
}
}
function callChatGptApi(sourceText, apiKey, modelName) {
const promptText = `以下の情報をもとに、丁寧な業務連絡文を作成してください。\n\n${sourceText}`;
const response = UrlFetchApp.fetch("https://api.openai.com/v1/chat/completions", {
method: "post",
contentType: "application/json",
headers: {
Authorization: `Bearer ${apiKey}`,
},
payload: JSON.stringify({
model: modelName,
messages: [{ role: "user", content: promptText }],
}),
});
const responseBody = JSON.parse(response.getContentText());
return responseBody.choices[0].message.content;
} generateTextWithChatGptが行を1行ずつ確認し、元情報があって生成結果がまだない行だけをcallChatGptApiに渡します。
すでに結果が入っている行を飛ばす作りなので、途中で止まっても再実行すれば続きから処理できます。
Step3. 元情報の列と出力先の列を決める
生成される文章の質は、A列に入れる元情報の書き方でほぼ決まります。
「誰宛て」「何を伝えたいか」「トーン」まで書いておくと、後工程での手直しが減ります。
プロンプトの組み方そのものを見直したい場合は、こちらの記事が参考になります。

生成する文章の型を変えたいときは、コード内のpromptTextの文言を書き換えるだけで対応できます。
返信文、要約、商品説明など、用途ごとにシートとスクリプトのコピーを分けておくと管理しやすくなります。
Step4. 少数件でテストしてから本実行する
いきなり全行を対象に実行せず、まずは2〜3行だけ元情報を入れた状態で実行し、生成結果の質と実行時間を確認します。
問題がなければ残りの行にも元情報を入れ、スクリプトを再実行してください。
毎日決まった時間に自動生成したい場合は、時計アイコンの「トリガー」からgenerateTextWithChatGptを時間主導型トリガーに登録します。
呼び出し件数がそのまま費用に直結するため、トリガーの実行間隔は元情報が入る頻度に合わせて広めに設定してください。
費用を暴走させないための注意点
調整できる箇所は主に3か所です。
- 1回の実行で処理する行数に上限を設け、想定外に大量の行が処理される事態を防ぐ
MODEL_NAMEを必要な精度に応じて選び、上位モデルを使う行を絞る- OpenAIの管理画面で利用上限(使用量制限)を設定し、想定を超えた課金を未然に止める
APIキーをスクリプトプロパティで管理していれば、キーが流出した場合もOpenAI側で該当キーを無効化して再発行するだけで対処できます。
シートやコードに直書きしていた場合と違い、影響範囲がそのシートを見た人全員ではなく、キーそのものに限定されます。
ここまでで定型文章の自動生成は完成です。
そもそもどこから自動化に着手すべきかを整理したい場合は、こちらが参考になります。

定型文章の作成、まだ毎回手作業で書いていませんか?
「同じような文面を何度も書いている」「ChatGPTは使っているがコピー&ペーストが面倒」「他にも自動化できそうな文章作成業務がある」
現在、業務自動化に関するお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. APIキーが漏れた場合はどうすればいいですか?
OpenAIの管理画面から該当のAPIキーを無効化し、新しいキーを再発行してスクリプトプロパティを書き換えてください。
無効化した時点で古いキーは使えなくなります。
Q. 生成結果が期待と違う場合はどうすればいいですか?
コード自体を直す前に、A列の元情報の書き方とプロンプトの文言を見直してください。
同じコードでも、渡す情報の粒度とプロンプトの指示次第で結果が大きく変わります。
Q. 個人情報を含む文章を生成させても大丈夫ですか?
送信した内容は外部のAPIに送られるため、氏名や連絡先などの個人情報はできる限り含めない設計にしてください。
やむを得ず含める場合は、OpenAIのデータの取り扱い方針を公式サイトで確認したうえで判断してください。