1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GAS】3分でできるカレンダー処理がchatGPTで2時間かかったので共有しておく

Last updated at Posted at 2023-09-14

情けない失敗談なんですが、ググっても意外と答えが得られなくて、
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はきちんと理解していないようです。
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?