情けない失敗談なんですが、ググっても意外と答えが得られなくて、
chatGPT(3.5)と一緒に右往左往しました。
犠牲者が増えないようにここに完成したコードをまとめておきます。
なお、以下は前提として、Googleフォームで送られてきたデータについて、スプレッドシートの対象行を読み直した値が formData
に入っています。
/* カレンダーに登録 */
var myCalendar = CalendarApp.getCalendarById(カレンダーのID);
var event = {
summary: formData[イベント名の項目名],
description: formData[イベント概要の項目名]+ "\nイベントID:"+eventId,
location: formData[イベント会場の項目名],
start:new Date(formData[イベント開催日の項目名]),
end:new Date(formData[イベント開催日の項目名])
};
var editEvent = getEventWithKeyword(カレンダーのID, eventId)
if(formData[イベント開演時間の項目名]){
event.start.setHours(formData[イベント開演時間の項目名].getHours());
event.start.setMinutes(formData[イベント開演時間の項目名].getMinutes();
if (formData[イベント閉演時間の項目名]) {
event.end.setHours(formData[イベント閉演時間の項目名].getHours());
event.end.setMinutes(formData[イベント閉演時間の項目名].getMinutes();
} else {
//終了時間が省略されている場合は、とりあえず90分で登録
var tempDate = Moment.moment(event.start);
var tempDate2 = tempDate.add(90, "minutes");
event.end = tempDate2.toDate();
}
Logger.log("event:"+JSON.stringify(event));
if(!modeEdit){
myCalendar.createEvent(event.summary, event.start, event.end, event);
} else if(editEvent) {
// イベント情報を更新
editEvent.setTitle(event.summary);
editEvent.setDescription(event.description);
editEvent.setLocation(event.location);
editEvent.setTime(event.start, event.end);
}
} else{
// 終日イベント
Logger.log("event:"+JSON.stringify(event));
if(!modeEdit){
myCalendar.createAllDayEvent(event.summary, event.start, event);
} else if(editEvent) {
// イベント情報を更新
editEvent.setTitle(event.summary);
editEvent.setDescription(event.description);
editEvent.setLocation(event.location);
editEvent.setAllDayDate(event.start);
}
}
Logger.log("イベントをカレンダーに登録しました。");
登録済みのイベントを見分けるために、イベント概要に特定のキーワードを埋め込みました。以下は対象イベントを検索する関数です。
function getEventWithKeyword(calendarId, keyword) {
// カレンダーを取得
var calendar = CalendarApp.getCalendarById(calendarId);
// 検索範囲=現在起点で後1年間
var now = new Date();
var startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 365);
var endDate = now;
endDate.setDate(startDate.getDate() + 365);
// カレンダー内のイベントを取得
var events = calendar.getEvents(startDate, endDate, {search: keyword});
// キーワードを含む最初のイベントを取得
if (events.length > 0) {
var firstEventWithKeyword = events[0];
return firstEventWithKeyword;
} else {
Logger.log("概要にキーワード '" + keyword + "' を含むイベントは見つかりませんでした。");
return null;
}
}
何がつまりやすいのか
- 上記コードでは、Momentを使っていますが、GASが素のままだと時間系の処理に弱いのを、chatGPT3.5は分からないようで、いろいろ架空のコードを提案してきました。
- GASでカレンダーを登録する関数、引数の組み合わせについても、chatGPTはきちんと理解していないようです。