ChatGPT APIをGASから呼び出してメール文を自動生成する

Google Apps ScriptからChatGPT APIを呼び出して、業務メールの文章を自動生成する仕組みを最短で構築する方法を解説します。

「返信メールを毎回ゼロから書くのが面倒」「定型文にはしたくないが、一から考える時間もない」——そんな悩みを持つビジネスパーソンは多いでしょう。ChatGPT APIとGoogle Apps Script(GAS)を組み合わせると、スプレッドシートに入力した件名や概要を元に、自然な文体のメール本文を自動生成できます。

本記事では、OpenAI APIキーの取得からGASのコード実装、実際のメール送信まで、ブラウザとGASだけで完結する手順を丁寧に説明します。プログラミング初心者でも、この記事を読み終えた後には実際に動作する自動化を手に入れられます。

この記事でできること

  • GASからChatGPT API(gpt-4o-mini)を呼び出してメール文を生成する
  • スプレッドシートの入力内容をもとに宛先・件名・本文を自動作成する
  • 生成したメールをGmailで送信する(または下書き保存する)
  • APIキーをスクリプトプロパティで安全に管理する

事前準備

以下のものを用意してください。

  • Googleアカウント(GmailとGoogleスプレッドシートが使えるもの)
  • OpenAIアカウントとAPIキー(platform.openai.comで取得)
  • APIの利用料金:gpt-4o-miniは非常に安価(1000トークン約$0.00015)なので、1通あたり数円以下です

OpenAI APIキーはOpenAIダッシュボードの「API keys」メニューから「Create new secret key」で発行できます。発行したキーは一度しか表示されないため、必ずメモしておいてください。

STEP1: スプレッドシートを準備する

新しいGoogleスプレッドシートを作成し、以下の列を設定します。

  • A列: 送信先メールアドレス
  • B列: 件名のキーワード(例: 「打合せ日程の確認」)
  • C列: メールの概要・ポイント(例: 「来週月曜の14時に会議室Aで打合せしたい。参加者3名。アジェンダを事前に送ってほしい」)
  • D列: 生成されたメール本文(GASが書き込む列)
  • E列: 送信ステータス(GASが「送信済み」などを書き込む列)

1行目にヘッダー(「メールアドレス」「件名キーワード」「概要」「生成本文」「ステータス」)を入力し、2行目以降にデータを入力しておきましょう。

STEP2: GASプロジェクトを作成してAPIキーを設定する

スプレッドシートのメニューから「拡張機能」→「Apps Script」を開きます。GASエディタが開いたら、まずAPIキーをスクリプトプロパティに安全に保存します。

左のメニューから「プロジェクトの設定」(歯車アイコン)をクリックし、「スクリプトプロパティ」セクションで「プロパティを追加」をクリックします。プロパティ名を「OPENAI_API_KEY」、値を取得したAPIキーに設定して保存します。コード内に直接APIキーを書くと、スクリプトを共有した際に漏洩する危険があるためこの方法を使います。

STEP3: ChatGPT APIを呼び出す関数を書く

GASエディタのコードエリアに以下のコードを貼り付けます。

function generateEmailContent(subject, summary) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  const url = 'https://api.openai.com/v1/chat/completions';

  const prompt = `以下の情報をもとに、ビジネスメールの本文を日本語で作成してください。
件名のキーワード: ${subject}
メールの概要・要点: ${summary}

条件:
- 丁寧なビジネス敬語を使う
- 書き出しは「お世話になっております。」から始める
- 署名部分は「以上、よろしくお願いいたします。」で締める
- 本文のみを出力し、件名や宛名は不要`;

  const payload = {
    model: 'gpt-4o-mini',
    messages: [
      { role: 'system', content: 'あなたはビジネスメールの文章作成を支援するアシスタントです。' },
      { role: 'user', content: prompt }
    ],
    max_tokens: 800,
    temperature: 0.7
  };

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

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

  if (json.error) {
    throw new Error('API Error: ' + json.error.message);
  }

  return json.choices[0].message.content.trim();
}

この関数はOpenAI APIにリクエストを送り、生成されたメール本文の文字列を返します。プロンプトで「ビジネス敬語」「書き出し・締めの形式」を指定することで、品質の安定した文章が生成されます。

STEP4: スプレッドシートを読み取ってメールを送信するメイン関数を書く

先ほどのコードの下に、以下のメイン処理関数を追加します。

function sendAIGeneratedEmails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    const emailAddress = sheet.getRange(i, 1).getValue();
    const subjectKeyword = sheet.getRange(i, 2).getValue();
    const summary = sheet.getRange(i, 3).getValue();
    const status = sheet.getRange(i, 5).getValue();

    if (!emailAddress || !subjectKeyword || !summary) continue;
    if (status === '送信済み') continue;

    try {
      const body = generateEmailContent(subjectKeyword, summary);
      sheet.getRange(i, 4).setValue(body);
      GmailApp.sendEmail(emailAddress, subjectKeyword, body);
      sheet.getRange(i, 5).setValue('送信済み');
      Utilities.sleep(1000);
    } catch (e) {
      sheet.getRange(i, 5).setValue('エラー: ' + e.message);
    }
  }

  SpreadsheetApp.getUi().alert('処理完了');
}

スプレッドシートの2行目から最終行まで順番に処理し、ChatGPT APIで生成した本文をD列に書き込んでからGmailで送信します。APIのレート制限を避けるため、各行の処理後に1秒待機しています。

STEP5: 下書き保存モードと実行ボタンを追加する

本番送信の前に下書きで確認したい場合は、sendEmailの代わりにGmailApp.createDraftを使います。以下のように切り替え可能な設計にすると安全です。

// 送信モード: true=即時送信 / false=下書き保存
const SEND_MODE = false;

if (SEND_MODE) {
  GmailApp.sendEmail(emailAddress, subjectKeyword, body);
  sheet.getRange(i, 5).setValue('送信済み');
} else {
  GmailApp.createDraft(emailAddress, subjectKeyword, body);
  sheet.getRange(i, 5).setValue('下書き保存');
}

また、スプレッドシートのメニューから実行できるカスタムメニューを追加すると便利です。

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('メール自動化')
    .addItem('AIメール生成・送信', 'sendAIGeneratedEmails')
    .addToUi();
}

このonOpen関数はスプレッドシートを開くたびに自動実行され、「メール自動化」というカスタムメニューが追加されます。

うまくいかないときのチェックリスト

  • 「Exception: Request failed」→ OpenAI APIキーが正しいか、スクリプトプロパティの名前が「OPENAI_API_KEY」と完全一致しているか確認
  • 「Insufficient quota」エラー → OpenAIの残高が0になっている。ダッシュボードでクレジットを追加する
  • 「You do not have permission」→ GASの実行権限でGmailへのアクセスを許可していない。初回実行時に表示される権限承認ダイアログで「許可」をクリック
  • メール本文が空欄になる → APIレスポンスのjson.choices[0]が存在しない場合。console.logでレスポンス全体を確認する
  • APIのレート制限に引っかかる → Utilities.sleep(2000)に増やして処理間隔を広げる

応用・発展

この仕組みをベースに、さらに高度な自動化も実現できます。たとえば、Gmailで受け取った問い合わせメールを自動で読み取り、内容を解析して返信案を生成するシステムに発展させることができます。また、HTMLメール形式(GmailApp.sendEmailのオプションでhtmlBodyを指定)にすることで、見栄えの良いメールマガジンを自動生成することも可能です。さらに、Googleカレンダーと連携して打合せ日程の候補を自動的に含めたアポイントメールを生成するなど、データソースを増やすことでよりインテリジェントなメール自動化が実現します。

まとめ

  • GASのUrlFetchApp.fetchを使えばChatGPT APIを簡単に呼び出せる
  • APIキーはスクリプトプロパティで管理することでセキュリティを確保できる
  • スプレッドシートの入力情報をプロンプトに組み込むことで、状況に応じたメール文を生成できる
  • SEND_MODEフラグで「下書き保存」と「即時送信」を切り替えることで、安全に運用できる
  • gpt-4o-miniは低コストで高品質なため、日常的な業務メール自動化に最適なモデル

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA