見出し画像

【コストゼロ】GASと連携してGPTsでカレンダーのイベントを確認・編集する方法


はじめに


こんにちは。前回は、GoogleカレンダーAPIとGPTsを連携させてみました。
https://note.com/jun_ichikawa/n/n653fb2e28199

本記事では、Google Apps ScriptでGoogleカレンダーと連携するAPIを作成し、GPTsから呼び出そうと思います。今回では、GPTで自分のGoogleカレンダーで以下のことができます。

  • 予定の確認

  • 予定の追加

  • 予定の更新

  • 予定の削除

GoogleカレンダーAPIを使用する場合とは違い、GASを使った場合だとコストをゼロにできるためお得です。

この記事の対象者:

  • GPTsのCustom Actionsを自作したい方

  • Google Calendar APIやGPTsの基本的な使い方を学びたい方

  • Zapierの連携よりも複雑な処理を求めている方

手順① GASを準備する


自分のカレンダーからイベントを確認・更新できるようにGASのコードを作成します。

以下のページに移動し、GASを作成します。
https://script.google.com/home

以下のコードをコピーして貼り付けます。

function doGet(e) {
  var date = e.parameter.date;
  return ContentService.createTextOutput(JSON.stringify(getCalendarEventsForDate(date)))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  var payload = JSON.parse(e.postData.contents);
  switch (payload.operation) {
    case 'addEvent':
      return ContentService.createTextOutput(JSON.stringify(addCalendarEvent(payload)))
        .setMimeType(ContentService.MimeType.JSON);
    case 'updateEvent':
      return ContentService.createTextOutput(JSON.stringify(updateCalendarEventByTitleAndDate(payload)))
        .setMimeType(ContentService.MimeType.JSON);
    case 'deleteEvent':
      return ContentService.createTextOutput(JSON.stringify(deleteCalendarEventByTitleAndDate(payload)))
        .setMimeType(ContentService.MimeType.JSON);
    default:
      return ContentService.createTextOutput(JSON.stringify({ 'status': 'error', 'message': 'Invalid operation' }))
        .setMimeType(ContentService.MimeType.JSON);
  }
}

function getCalendarEventsForDate(dateString) {
  var calendar = CalendarApp.getDefaultCalendar();
  var date = new Date(dateString);
  var events = calendar.getEventsForDay(date);
  return events.map(function(event) {
    return {
      'summary': event.getTitle(),
      'start': event.getStartTime().toISOString(),
      'end': event.getEndTime().toISOString()
    };
  });
}

function addCalendarEvent(eventDetails) {
  var calendar = CalendarApp.getDefaultCalendar();
  var start = new Date(eventDetails.start);
  var end = new Date(eventDetails.end); 
  var event = calendar.createEvent(eventDetails.summary, start, end);
  return {
    'status': 'success',
    'message': 'Event added',
    'event': {
      'summary': event.getTitle(),
      'start': event.getStartTime().toISOString(),
      'end': event.getEndTime().toISOString()
    }
  };
}


function findEventByTitleAndDate(title, startDate) {
  var calendar = CalendarApp.getDefaultCalendar();
  var events = calendar.getEventsForDay(new Date(startDate), { search: title });
  if (events.length > 0) {
    return events[0];
  }
  return null;
}

function updateCalendarEventByTitleAndDate(eventDetails) {
  var event = findEventByTitleAndDate(eventDetails.summary, eventDetails.start);
  if (event) {
    var newTitle = eventDetails.newSummary || eventDetails.summary;
    event.setTitle(newTitle);
    event.setTime(new Date(eventDetails.newStart), new Date(eventDetails.newEnd));
    return {
      'status': 'success',
      'message': 'Event updated',
      'event': {
        'summary': event.getTitle(),
        'start': event.getStartTime().toISOString(),
        'end': event.getEndTime().toISOString()
      }
    };
  } else {
    return { 'status': 'error', 'message': 'Event not found' };
  }
}


function deleteCalendarEventByTitleAndDate(eventDetails) {
  var event = findEventByTitleAndDate(eventDetails.summary, eventDetails.start);
  if (event) {
    event.deleteEvent();
    return { 'status': 'success', 'message': 'Event deleted' };
  } else {
    return { 'status': 'error', 'message': 'Event not found' };
  }
}

    

手順② 作成したGASをWebアプリとしてデプロイする


手順①でGASの作成が完了したら、それらをデプロイします。

「デプロイ」のドロップボタンを開き、「新しいデプロイ」を選択します。

「⚙️」を選択し、ウェブアプリを選択します。

以下の情報を設定欄に入れます。

新しい説明文:適当な文章
次のユーザとして実行:
自分
アクセスできるユーザー:
全員

「完了」を選択し、デプロイをします。アクセス承認を求められた場合、承認するようにします。

デプロイが完了したら、URLをコピーして「完了」を選択します。
ここまでで、デプロイ完了です。

手順③ GPTsを作成する。


GPTsの設定欄には以下の情報を入力します。
設定リンク:https://chat.openai.com/gpts/editor

名前:適当な名前
説明:適当な説明
Instructions:全てのタスクを日本時間で表示してください。
Knowledge:アップロードなし
Capabilities:選択なし

Actionsを作成画面に移動し、「Scheme」に以下をコピペする。

{
  "openapi": "3.0.0",
  "info": {
    "title": "Google Calendar API",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec"
    }
  ],
  "paths": {
    "/exec": {
      "get": {
        "summary": "Get Calendar Events for a Specific Date",
        "operationId": "getCalendarEvents",
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "summary": {
                        "type": "string"
                      },
                      "start": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "end": {
                        "type": "string",
                        "format": "date-time"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Perform Calendar Operations",
        "operationId": "calendarOperations",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "operation": {
                    "type": "string",
                    "enum": ["addEvent", "updateEvent", "deleteEvent"]
                  },
                  "summary": {
                    "type": "string"
                  },
                  "start": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "end": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "newSummary": {
                    "type": "string"
                  },
                  "newStart": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "newEnd": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "required": ["operation", "summary", "start"]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calendar Operation Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

9行目の`https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec`に、実際に手順②で作成したデプロイURLを貼り付けます。

以上で、GPTsの設定は完了です。

手順④ 実際に作成したGPTsを使ってみる


実際に、「2/2の予定を教えて。」などと命令を出すとその日の予定をおしえてくれます。

またその他にもGoogleカレンダーのイベントの追加・更新・削除ができるようになっています。

コードの解説


GASスクリプト解説

  1. doGet関数

    • パラメータとして日付を受け取り、その日のカレンダーイベントを取得して返します。

    • JSON形式でイベントの詳細(概要、開始時間、終了時間)を返します。

  2. doPost関数

    • イベントの追加、更新、削除の操作を処理します。

    • リクエストボディから操作の種類と必要なデータを取得し、対応する関数を呼び出します。

  3. getCalendarEventsForDate関数

    • 指定された日付のイベントを取得し、それらの概要と時間を配列として返します。

  4. addCalendarEvent関数

    • 新しいイベントをカレンダーに追加し、追加されたイベントの詳細を返します。

  5. findEventByTitleAndDate関数

    • タイトルと日付に基づいてイベントを検索し、見つかった場合はそのイベントを返します。

  6. updateCalendarEventByTitleAndDate関数

    • 指定されたタイトルと日付でイベントを検索し、見つかった場合はそのイベントを更新します。

  7. deleteCalendarEventByTitleAndDate関数

    • 指定されたタイトルと日付でイベントを検索し、見つかった場合はそのイベントを削除します。

カスタムアクション定義(OpenAPI)

  • OpenAPI仕様に基づいて、ウェブサービスのエンドポイントと操作の仕様が定義されています。

  • 2つの主要な操作があります。

    • GET /exec: 特定の日付のカレンダーイベントを取得するためのエンドポイント。

    • POST /exec: カレンダーに関連するさまざまな操作(イベントの追加、更新、削除)を行うためのエンドポイント。

終わりに


今回は、GASを使用することによって、コストをゼロにしてGPTsでGoogleカレンダーのイベントを確認・編集できるようにしてみました。

この記事を参考にご自身でCustom ActionsのAPIを開発する際の一助になれば、幸いです。

最後までご精読いただき、ありがとうございました。

私のXのフォローもお願いします!
https://twitter.com/junichikawaAI

Image Credit: Open AI Inc. and Google LLC

この記事が参加している募集

GPTsつくってみた

この記事が気に入ったらサポートをしてみませんか?