「会議の日程をカレンダーに手動で登録するのがめんどくさい」——正直、これだけで十分な動機だと思う。

メール本文やSlackのメッセージから予定情報を拾い上げて、カレンダーに手入力する作業。週に10件もあれば、じわじわとストレスが積み上がる。

この記事では、ChatGPT APIとGoogle Apps Script(GAS)を組み合わせて、自然言語の文章から予定を自動抽出→Googleカレンダーに登録→リマインド通知まで飛ばす仕組みを作る。コードはコピペで動く最小構成から始めるので、GAS初心者でも手を動かしながら読み進められる。


GASでやる理由|ZapierやMakeより何がいいのか

ぶっちゃけ、Zapierでも同じようなことはできる。だから最初に「なぜGASなのか」を整理しておく。

Zapier / Makeのデメリット

  • 無料プランはタスク数の上限がきつい(Zapierは月100タスク)
  • 複雑な条件分岐を組むと月額コストが跳ね上がる
  • カスタマイズの自由度に限界がある

GASの優位点

  • Googleアカウントがあれば無料で使える
  • GoogleカレンダーやGmailとの連携がAPIなしで書ける
  • コードで細かく制御できる(条件分岐、エラー処理、通知先の切り替えなど)

コスト面で言うと、ChatGPT APIの料金は現実的にかなり安い。gpt-4o-miniを使えば、入力$0.15・出力$0.60(各100万トークンあたり)。月に予定を100件登録しても$0.01未満で収まる計算だ。

一方で、GASには制限があるのも事実なので正直に書いておく。

制限項目 上限値
スクリプト実行時間(1回) 最大6分
トリガー実行時間(1日) 90分(無料)
URLフェッチ(1日) 20,000回
カレンダーイベント作成(1日) 5,000件

個人・小規模チームの用途なら、この制限に引っかかることはほぼない。

Gemini統合との比較について

2025年以降、GoogleカレンダーにはGeminiが統合されている。ただし、「外部のテキストを自動で拾ってパースする」「Slackや独自のwebhookに通知を飛ばす」といった処理はGemini単体ではできない。GASはその「橋渡し役」として今でも有効な選択肢だ。

ノーコードで済ませたい場合は、別記事「Zapier×ChatGPT連携のやり方」も参照してほしい。


💡 関連教材: ChatGPT業務自動化 実践テンプレート集(¥1,480) — API・スプレッドシート・メール・議事録・請求書をコピペで自動化する実装特化型テンプレート集(全22ページ)

事前準備|APIキー取得とGASの初期設定

OpenAI APIキーを取得する

  1. platform.openai.com にアクセスしてログイン
  2. 右上のアカウントアイコン→「API keys」を選択
  3. 「Create new secret key」をクリックし、名前をつけて生成
  4. キーはこの画面でしか確認できないのでメモしておく

APIキーはコードに直書きしない

これ、意外と知られていない落とし穴だ。GASのコード内にAPIキーをそのまま書くと、スクリプトを共有した瞬間にキーが漏洩するリスクがある。

正しい格納方法はPropertiesServiceを使う方法だ。

手順: GASエディタの上部メニューから「プロジェクトの設定」→「スクリプトプロパティ」→「プロパティを追加」

  • プロパティ名:OPENAI_API_KEY
  • 値:取得したAPIキーを貼り付け

コード内では以下のように呼び出す。

const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');

これだけでコードにキーが露出しなくなる。

GASプロジェクトを作成する

  1. Google Driveを開く
  2. 「新規」→「その他」→「Google Apps Script」を選択
  3. プロジェクト名を「カレンダー自動登録」などにしておく

タイムゾーンの確認を忘れずに

GASのデフォルトタイムゾーンとカレンダーのタイムゾーンがズレていると、予定が1時間前後にずれて登録される。これで半日ハマった経験がある。

GASエディタの「プロジェクトの設定」→「タイムゾーン」がAsia/Tokyoになっているか確認しよう。コードでも念のため確認できる。

function checkTimezone() {
  const cal = CalendarApp.getDefaultCalendar();
  Logger.log(cal.getTimeZone()); // Asia/Tokyo と出ればOK
}

実装ステップ|自然言語→JSON変換→カレンダー登録

全体の処理フロー

入力テキスト(自然言語)
    ↓
GAS → OpenAI API(gpt-4o-mini)
    ↓
構造化JSON(title, date, startTime, endTime, description)
    ↓
GAS → Google Calendar API
    ↓
予定登録 + リマインド通知(Gmail or Slack webhook)

Step 1:ChatGPTに予定情報をJSONで返させる

プロンプト設計が精度の9割を決める。曖昧な指示だと出力がブレる。

function extractEventFromText(inputText) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  
  const prompt = `以下のテキストから予定情報を抽出し、JSON形式のみで返してください。
他の文章は一切含めないこと。

フィールド定義:
- title: 予定のタイトル(文字列)
- date: 日付(YYYY-MM-DD形式)
- startTime: 開始時刻(HH:MM形式)
- endTime: 終了時刻(HH:MM形式)
- description: 詳細メモ(文字列、なければ空文字)

入力テキスト:
${inputText}`;

  const payload = {
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: prompt }],
    temperature: 0
  };

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

  const response = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', options);
  const json = JSON.parse(response.getContentText());
  const content = json.choices[0].message.content;
  
  return JSON.parse(content); // 構造化されたオブジェクトが返る
}

temperature: 0にするのがポイント。創造性が不要な抽出タスクは0にすることで出力が安定する。

Step 2:Googleカレンダーに予定を登録する

function addEventToCalendar(eventData) {
  const calendar = CalendarApp.getDefaultCalendar();
  
  // 日付と時刻を組み合わせてDateオブジェクトを生成
  const startDateTime = new Date(`${eventData.date}T${eventData.startTime}:00`);
  const endDateTime   = new Date(`${eventData.date}T${eventData.endTime}:00`);
  
  const options = {
    description: eventData.description
  };
  
  const event = calendar.createEvent(
    eventData.title,
    startDateTime,
    endDateTime,
    options
  );
  
  Logger.log(`登録完了:${event.getTitle()} / ${event.getStartTime()}`);
  return event;
}

Step 3:2つの関数をつなぐメイン関数

function main() {
  // ここに自然言語テキストを入れる
  const inputText = `来週月曜日の午後3時から4時に、田中さんとの進捗確認MTGがあります。
  場所はZoom、アジェンダは第2四半期レポートの確認です。`;
  
  try {
    const eventData = extractEventFromText(inputText);
    Logger.log('抽出されたデータ:' + JSON.stringify(eventData));
    addEventToCalendar(eventData);
  } catch (e) {
    Logger.log('エラー:' + e.message);
  }
}

main()を実行すると、テキストから日時・タイトルが自動抽出されてカレンダーに登録される。初めて動いたときは正直驚いた。


リマインド通知の設定|GmailとSlack webhookに飛ばす

カレンダーへの登録だけでは通知が弱い。GAS側からリマインドを能動的に送る仕組みを追加する。

パターンA:Gmailでリマインド

function sendReminder(eventData) {
  const recipient = Session.getActiveUser().getEmail();
  const subject   = `【リマインド】${eventData.title}`;
  const body      = `予定が近づいています。\n\n`
                  + `タイトル:${eventData.title}\n`
                  + `日時:${eventData.date} ${eventData.startTime}${eventData.endTime}\n`
                  + `詳細:${eventData.description}`;
  
  GmailApp.sendEmail(recipient, subject, body);
}

パターンB:Slack webhookに通知

Slackの「Incoming Webhooks」でURL発行後、以下で通知できる。

function sendSlackReminder(eventData) {
  const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
  
  const message = {
    text: `*【リマインド】${eventData.title}*\n`
        + `📅 ${eventData.date} ${eventData.startTime}${eventData.endTime}\n`
        + `📝 ${eventData.description}`
  };
  
  UrlFetchApp.fetch(webhookUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  });
}

webhook URLもAPIキーと同様に、PropertiesServiceに格納しておくこと。

時間ベースのトリガーで自動実行する

GASエディタの「トリガー(時計アイコン)」→「トリガーを追加」から設定できる。

  • 関数:main
  • イベントのソース:時間主導型
  • 種類:日付ベースのタイマー(毎朝9時など)

これで毎日決まった時間にスクリプトが走る。入力テキストをGmailやスプレッドシートから自動取得するように拡張すれば、完全に手放しで動く。

注意:LINE Notifyは2025年3月にサービス終了している。LINE通知を使いたい場合はLINE Messaging APIへの移行が必要だ。


まとめと次のアクション

ここまでやってきたことを整理する。

  • GASを選ぶ理由:無料・柔軟・月$0.01未満で動く
  • APIキーはPropertiesServiceに格納してコードから切り離す
  • ChatGPTへの指示は「JSON形式のみ返せ」と明示することで出力が安定する
  • タイムゾーンのズレは最初に確認しておく
  • 通知はGmailかSlack webhookで飛ばす

今すぐやるべきことは1つ。GASエディタを開いて、main()関数に自分のテキストを貼り付けて実行してみること。動いた瞬間に「あ、これ本物だ」とわかる。そこからカスタマイズは自然と進む。


関連記事


📘 もっと深く学びたい方へ

この記事で紹介した内容を、さらに体系的に・実務レベルで習得できる教材を販売中です。

ChatGPT業務自動化 実践テンプレート集(¥1,480)

API・スプレッドシート・メール・議事録・請求書をコピペで自動化する実装特化型テンプレート集(全22ページ)

  • 動くGASコード・API設定手順・プロンプトをワンセット収録
  • スプレッドシート連携/メール/議事録/請求書を実務レベルで自動化
  • コピペで即動く実装コード(Python / GAS)付き

👉 今すぐ購入する

ChatGPT&Claude AIプロンプト集50選(¥980)

コピペで即使える実践プロンプト50種を全24ページに凝縮

  • ビジネスメール・企画書・分析・コーディング等 8カテゴリ網羅
  • ChatGPT / Claude / Gemini 全対応
  • 変数を埋めるだけで即実務投入

👉 今すぐ購入する


関連ツール紹介

ブログ記事を効率的に量産するならValue AI Writer byGMOがSEO記事の自動生成に使える。月額1,650円から利用可能。

おすすめツールの一覧はこちらにまとめている。