【コストゼロ】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スクリプト解説
doGet関数
パラメータとして日付を受け取り、その日のカレンダーイベントを取得して返します。
JSON形式でイベントの詳細(概要、開始時間、終了時間)を返します。
doPost関数
イベントの追加、更新、削除の操作を処理します。
リクエストボディから操作の種類と必要なデータを取得し、対応する関数を呼び出します。
getCalendarEventsForDate関数
指定された日付のイベントを取得し、それらの概要と時間を配列として返します。
addCalendarEvent関数
新しいイベントをカレンダーに追加し、追加されたイベントの詳細を返します。
findEventByTitleAndDate関数
タイトルと日付に基づいてイベントを検索し、見つかった場合はそのイベントを返します。
updateCalendarEventByTitleAndDate関数
指定されたタイトルと日付でイベントを検索し、見つかった場合はそのイベントを更新します。
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
この記事が気に入ったらサポートをしてみませんか?