AIサービス

【GPTs】初心者でも簡単に作れる!Googleカレンダー × ChatGPTで自分専用AI秘書を作ろう!

最近、プライベートの予定と仕事の予定をダブルブッキングさせてしまうかずきです。

「飲み会ですか?大丈夫ですよー」

と軽い気持ちで返事をして、後になって予定が入ってることに気づき、結局プライベートの予定を諦めることがたびたびあります 笑
カレンダーはちゃんと確認しているつもりなのに、なぜかダブルブッキングしてしまうんです。。。(泣)

自分でカレンダー見ても予定をかぶせてしまうなら、もう自分の予定を教えてくれる秘書がいればイイのでは?

そう考えて、ChatGPTのGPTsを使って、自分のスケジュールを教えてくれる「AI秘書」を作りました!

せっかく作ったので、備忘録も兼ねて作り方を紹介したいと思います!
慣れれば簡単に作れるので、ぜひ参考にしてみてください。

それではよろしくお願いします!

AI秘書の仕組み

GoogleカレンダーのAPIを使用して作成

今回はGoogleカレンダーのAPIを使用して作成しました。
APIとはアプリ同士を繋げて便利にやり取りできるような仕組みのことです。

人で例えると通訳のイメージです。
日本人とアメリカ人が会話をする場合、お互いの言語が違うため、直接話しても噛み合いません。

そこで「通訳さん」が間に入って、日本語と英語をお互いに翻訳して伝えます。
これにより、日本人とアメリカ人も意思疎通ができるようになります。

今回はChatGPTからGoogleカレンダーを操作するので、GoogleカレンダーのAPIが必要になります。

図にすると次のような図になります。
赤文字の部分がAPIとなります。

AI秘書イメージ図

APIはどこで確認できるの?

APIはアプリケーション間で会話する通訳だけでなく、やりとりのルールを決める役割も持っています。
そして、そのルールや手順がまとめられている「ガイドブック」のようなものが存在します

それが「API仕様書」です。

仕様書は「使用したいサービス名 API」とGoogleで検索すると簡単に見つかります。
もし見つからない場合は、ChatGPTに「GoogleカレンダーAPIの日本語の仕様書を教えてください」と質問すると、参考になるリンクを教えてくれます。

今回の場合はGoogleカレンダーを使用するので、「Googleカレンダー API」と検索します。
以下がGoogleカレンダーAPIのガイドブックです。

仕様書をざっくり確認しよう

会話するためのガイドブックのため、本来であればすべて読んで理解する必要があります。

ですが、最近はChatGPTにわかりにくい箇所を解説してもらったり、ポイントをようやくしてもらうこともできます。

必要に応じてChatGPTも上手に活用しましょう!

AI秘書を作成しよう!

GoogleカレンダーAPIを使えるようにする

まず、ChatGPTからGoogleカレンダーAPIを使用できるように、Google側での設定を行います。

1. Google Cloudにログインする

  1. APIの設定はGoogle Cloudから行いますので、下記からサイトにGoogle Cloudにアクセスします。

  1. ログイン画面が表示される方は、自分のアカウントでログインください。
  1. ログインするとウェルカムページに移動します。

2. プロジェクトを作成する

  1. 左上の「プロジェクトの選択」をクリックします。

    プロジェクトを作成したことがある方は、以前に作成したプロジェクト名になっているかもしれません。
  1. ダイアログが表示されたら、右上の「新しいプロジェクト」を選択します。
  1. 新しいプロジェクトの画面に遷移したら「プロジェクト名」と「場所」を入力して「作成」をクリックします。
    プロジェクト名は任意ですが、使用したいツールやサービスの名前を書いておくとわかりやすいです。

  1. 作成が終わると「プロジェクトを選択」ダイアログに作成したプロジェクトが表示されるので選択して開いておきましょう。

3. Google Calendar APIを有効にする

  1. ウェルカム画面から「APIとサービス」をクリックします。
    ウェルカム画面が開いていない場合は、左上の「Google Cloud」のアイコンをクリックするとウェルカム画面に移動できます。
  1. 左のリストの中から「ライブラリ」をクリックして、「APIライブラリ」画面を表示します。
  1. 「APIとサービスを検索」に「Google Calendar API」と入力して検索します。
  1. 検索結果の中から「Google Calendar API」をクリックして、「製品の詳細画面」に移動します。
  1. 製品の詳細画面の「有効にする」をクリックして、「API/サービスの詳細画面」に遷移するまで待機します。

4. Google Calendar APIの設定

  1. API/サービスの詳細画面の「認証情報を作成」を選択します。
  1. 認証情報の作成画面が表示されるので、以下の設定を行い、「次へ」をクリックします。
  • 使用するAPI:Google Calendar API
  • アクセスするデータの種類:ユーザーデータ
  1. OAuth同意画面が開いたら次の通りに設定して、「保存して次へ」へクリックします。
  • アプリ名:任意
  • ユーザーサポートメール:自分のメールアドレス
  • デベロッパーの連絡先情報:自分のメールアドレス
  1. 「スコープ画面」が表示されたら「スコープを追加または削除」をクリックして、「選択したスコープの更新」を開きます。
  1. 今回はカレンダーの取得と編集ができたら十分なので、一覧の中から「Google Calendar API」の「…/auth/calendar.event」を選択します。
    どのスコープを選択するかはAPI仕様書に記載がありますが、めんどくさい方は「ユーザー向けの説明」を読むと何となくわかるかと思います。
  1. 設定が終わったら「更新」をクリックして閉じます。
  1. 「機密性の高いスコープ」に設定したスコープが書かれているのを確認して、「保存して次に」をクリックします。
  1. 「OAuth クライアント ID」を下記の通りに設定して「次へ」をクリックします。
  • アプリケーションの種類:ウェブアプリケーション
  • 名前:任意
  1. 「完了」をクリックしてAPIの設定を終了します。
  1. 左のリストの中から「認証情報」をクリックして、認証情報画面に移動します。
  1. OAuth2.0 クライアント IDの中から作成したプロジェクトをクリックして、「ウェブ アプリケーション のクライアント ID画面」に移動します。
  1. Additional informationに記入されている「クライアントID」と「クライアントシークレット」をメモしておきます。
    この後のGPTsを作成するで使用します。

GPTsを作成する

ここまでできたらようやくGPTsを作成できるようになります。
ここからはChatGPT側の解説をしていきます。

1. GPT作成画面を開く

  1. ChatGPT画面を開き、右上の自分のアイコンをクリックしてメニューを開きます。
    メニューの中から「マイGPT」を選択します。
  1. 「GPTを作成する」をクリックします。

2. 作成するGPTの基本情報を入力する

  1. GPT作成画面が表示されたら、以下を入力していきます。
    これらの項目は好きなものを入力ください。
    ※「指示」の入力は最後に行うので、後で解説します
  • 画像:GPTの画像を選択します
  • 名前:GPTの名前を入力します
  • 説明:GPTに対する説明を入力します
  1. 「会話の開始者」を入力します。わかりにくいですが、会話開始の質問のことです。
    今回は自分用のGPTを作っているので、自分がよく聞く質問を入力しておくと良いかもしれません。
    以下にいくつか例をあげておきます。
  • 今日のスケジュールを教えてください
  • 明日の予定を調整しください
  • 1週間の予定を確認してください
  • 今日の予定に会議を追加してください
  1. 下にスクロールして使用する「機能」を選択します。
    今回はどれも使用しないため、すべてのチェックを外します。

3. アクションを入力する

ここが今回の肝であり、一番めんどくさいAPIの設定部分になります。

  1. 「新しいアクションを作成する」をクリックして、「アクションを追加する画面」に移動します。
  1. 「認証」をクリックします。
  1. 「認証」ダイアログが表示されたら下記をして「保存」をクリックします。
  1. スキーマに下記を入力します。
    今回はカレンダー情報を取得するスキーマのみ作成します。
スキーマ
{
    "openapi": "3.1.0",
    "info": {
      "title": "Google Calendar Custom GPT API",
      "version": "1.0.0",
      "description": "This API allows the retrieval and insertion of events in Google Calendar using get and insert methods.",
      "contact": {
        "name": "Google",
        "url": "https://developers.google.com/calendar"
      }
    },
    "servers": [
      {
        "url": "https://www.googleapis.com/calendar/v3"
      }
    ],
    "paths": {
      "/calendars/[カレンダーID]/events/": {
        "get": {
          "summary": "List all events in the Google Calendar.",
          "operationId": "getEventsFromCalendar",
          "description": "This endpoint allows the AI agent to fetch a list of events from the user's Google Calendar, which can be used to review upcoming events or to synchronize with external systems.",
          "parameters": [
            {
              "name": "timeMin",
              "in": "query",
              "required": false,
              "description": "Lower bound (inclusive) for an event's start time to filter by.",
              "schema": {
                "type": "string",
                "format": "date-time"
              }
            },
            {
              "name": "timeMax",
              "in": "query",
              "required": false,
              "description": "Upper bound (exclusive) for an event's end time to filter by.",
              "schema": {
                "type": "string",
                "format": "date-time"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "Provides a detailed list of events from the primary calendar, filtered by the specified time range if provided, including information such as event IDs, titles, descriptions, and timing details.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/EventList"
                  }
                }
              }
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "Event": {
          "type": "object",
          "description": "A schema defining the structure of an event in the Google Calendar. It includes all the necessary details such as identifiers, timing, and participant information.",
          "properties": {
            "id": {
              "type": "string",
              "description": "A unique identifier for the event. This is used to reference the event in API calls."
            },
            "summary": {
              "type": "string",
              "description": "A brief summary or title of the event."
            },
            "description": {
              "type": "string",
              "description": "A detailed description of the event. This can include the agenda, topics to be discussed, or any other relevant information."
            },
            "start": {
              "type": "object",
              "description": "The start time of the event, including the date, time, and timezone.",
              "properties": {
                "dateTime": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The date and time when the event starts, in ISO 8601 format."
                },
                "timeZone": {
                  "type": "string",
                  "description": "The timezone in which the start time is specified."
                }
              }
            },
            "end": {
              "type": "object",
              "description": "The end time of the event, including the date, time, and timezone.",
              "properties": {
                "dateTime": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The date and time when the event ends, in ISO 8601 format."
                },
                "timeZone": {
                  "type": "string",
                  "description": "The timezone in which the end time is specified."
                }
              }
            },
            "location": {
              "type": "string",
              "description": "The location where the event is taking place. This can be a physical address or a virtual meeting link."
            }
          }
        },
        "EventList": {
          "type": "object",
          "description": "A schema representing a list of events, as would be retrieved from a 'list' operation on the Google Calendar API.",
          "properties": {
            "items": {
              "type": "array",
              "description": "An array of event objects, each representing an individual event in the Google Calendar.",
              "items": {
                "$ref": "#/components/schemas/Event"
              }
            }
          }
        }
      }
    }
  }
全文表示
  1. 正常に入力ができていれば、「利用可能なアクション」に入力したoperationIdが表示されます。
    問題がなければ「<」で前の画面に戻ります。
  1. コールバックURLをコピーします。
  1. Google Cloudの「ウェブ アプリケーション のクライアント ID」に戻ります。
    「承認済みのリダイレクト URI」の「URIを追加」をクリックします。
  1. URI 1に⑤でコピーしたURIを入力し、「保存」をクリックします。
  1. 左のリストから「OAuth同意画面」をクリックして、「OAuth同意画面」に移動します。
  1. テストユーザーの「ADD USERS」をクリックします。
  1. アクセスするカレンダーのオーナーのメールアドレスを入力して保存をクリックします。
  1. ユーザー情報に保存したメールアドレスが表示されていれば成功です。
    本来、テストユーザーは使用しませんが、今回GPTsを使用するのは自分だけなのでテストユーザーで運用します。

4. 指示を入力

最後に指示を入力します。
GPTsへ何をして欲しいか・してはいけないのかを指定する部分になりますので、基本的には自由に入力すれば良いです。
例を下記に記しておきます。

AIアシスタントはGoogleカレンダーAPIを利用してイベントの取得を行います。
取得したイベントの日時を表示するときは、以下のフォーマットで通知してください。
フォーマット:”2024年1月1日(月)13:00〜14:00″

5. GPTsを保存

ここまでの作業が終われば、右上の「更新する」(初めて保存する場合は「作成する」)をクリックして内容を保存します。

GPTsを使ってみよう!

最後に作成したGPTsを使ってみましょう。

  1. 「マイGPT画面」を開いて作成したGPTsを選択します。
  1. スケジュールに関する質問をします。
    質問をすると、googleカレンダーへのアクセスを求められるので、「googleapis.com でサインインする」をクリックします。
  1. 「テストユーザー」に入力したユーザーでログインを行います。
  1. ChatGPTに戻り、結果が表示されたら成功です!

まとめ

今回はGoogleカレンダーAPIを使用したGPTsの作成方法を解説しました。

基本的にはどのAPIを使用するときも似たような作り方なので、今回の方法を覚えておけば他のAPIを使用したGPTsも作成できるようになります。

とはいえ、プログラミングに慣れていない方には、スキーマが一番ややこしい部分だと思います。
この部分についてはまたどこかで解説したいと思います。

まずは自分でGPTsが作れるという感覚を味わっていただければ幸いです。