Bolt.newなどから予定を操作するためにGASを作成しました。
/**
* カレンダーの取得
* - リクエストで「date」パラメータ指定(無ければ当日)
* - その日から1か月先までの全イベントを取得し、
* - イベントの前後30分をバッファにして[
* { title: "予定あり", start: ..., end: ... }
* ]形式で返す
*/
function doGet(e) {
var targetDate = e.parameter.date || (new Date()).toISOString().slice(0,10); // YYYY-MM-DD
var calendar = CalendarApp.getDefaultCalendar();
var start = new Date(targetDate);
var end = new Date(start);
end.setMonth(end.getMonth() + 1);
var events = calendar.getEvents(start, end);
var eventList = [];
for (var i = 0; i < events.length; i++) {
var ev = events[i];
var evStart = new Date(ev.getStartTime().getTime() - 30 * 60000);
var evEnd = new Date(ev.getEndTime().getTime() + 30 * 60000);
eventList.push({
title: "予定あり",
start: evStart.toISOString(),
end: evEnd.toISOString()
});
}
return ContentService.createTextOutput(JSON.stringify(eventList))
.setMimeType(ContentService.MimeType.JSON);
}
/**
* 予定の追加
* - start, end, title に加え、
* - company, name, email の情報をリクエストパラメータで受け取り
* - 詳細(description)欄にまとめて追記する
*/
function doPost(e) {
var start = new Date(e.parameter.start);
var end = new Date(e.parameter.end);
var title = e.parameter.title || "新しい予定";
var company = e.parameter.company || "";
var name = e.parameter.name || "";
var email = e.parameter.email || "";
var description = "会社名: " + company + "\n" +
"氏名: " + name + "\n" +
"メールアドレス: " + email;
var calendar = CalendarApp.getDefaultCalendar();
calendar.createEvent(title, start, end, {description: description});
// 送信元メールアドレス(ご自身のメールアドレスに変更してください)
var myEmail = "your-email@example.com";
// メール件名
var subject = "予約完了のお知らせ";
// メール本文(予約内容の概要を記載)
var body = "以下の内容で予約が完了しました。\n\n" +
"タイトル: " + title + "\n" +
"開始日時: " + start.toLocaleString("ja-JP") + "\n" +
"終了日時: " + end.toLocaleString("ja-JP") + "\n\n" +
"会社名: " + company + "\n" +
"氏名: " + name + "\n" +
"メールアドレス: " + email + "\n\n" +
"ご確認ください。";
// 自分にメール送信
GmailApp.sendEmail(myEmail, subject, body);
// 予約者のメールアドレスにも送信(空文字や無効なアドレスでない場合)
if (email && email.indexOf("@") > 0) {
GmailApp.sendEmail(email, subject, body);
}
return ContentService.createTextOutput(JSON.stringify({
result: "予定を追加し、メールを送信しました",
detail: {
start: start.toISOString(),
end: end.toISOString(),
title: title,
company: company,
name: name,
email: email
}
})).setMimeType(ContentService.MimeType.JSON);
}
例えばフロントエンドからJavaScriptで操作する場合のサンプル
1.予定の取得
// 例: 2025-08-19を基準日付に予定を取得
const deployUrl = "https://script.google.com/macros/s/【ここにデプロイID】/exec";
const params = new URLSearchParams({ date: "2025-08-19" }); // date=YYYY-MM-DD
fetch(`${deployUrl}?${params.toString()}`)
.then(response => response.json())
.then(data => {
// dataは [{title, start, end}, ...] の予定リスト
console.log(data);
})
.catch(error => {
console.error("取得エラー:", error);
});
2.予定の追加
// 新規予定 {開始, 終了, イベント名} を追加
const deployUrl = "https://script.google.com/macros/s/【ここにデプロイID】/exec";
const postParams = new URLSearchParams({
start: "2025-08-20T14:00:00+09:00",
end: "2025-08-20T15:00:00+09:00",
title: "打ち合わせ"
});
fetch(deployUrl, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: postParams.toString()
})
.then(response => response.json())
.then(data => {
// dataは { result: "予定を追加しました" }
console.log(data);
})
.catch(error => {
console.error("追加エラー:", error);
});