GAS에서 Google 캘린더 삭제 이벤트를 감지하고 LINE 그룹에 알리는 bot를 만들었습니다.

만든 이유





저는 대학원에서 실험계의 연구실에 소속하고 있습니다.
대학내 여러 연구실에서 공동으로 이용하고 있는 실험장치가 있어 반년 전까지는 심야에서도 사용할 수 있었지만 안전관리가 엄격해져 8:00~20:00까지만 사용할 수 있다. 사라졌습니다.
따라서 Google 캘린더에서 관리하는 기기의 예약이 언제나 묻혀있어 일주일에 두 번 정도 밖에 사용할 수 없기 때문에 모두의 실험이 전혀 진행되지 않는 상태였습니다.



이런 식으로 1주일 대부분의 시간이 묻혀 있기 때문에 전혀 실험이 진행되지 않는다. . .

이것을 조금이라도 해결하기 위해 "Google Calendar에서 기기 예약이 삭제되면 실험실 그룹 LINE에 알리는 LINE Bot"을 GAS와 LINE Bot에서 만들었습니다.

요구사항




  • Google Calendar 실험실 예약이 삭제되면 그룹 LINE에 알립니다.
  • 예정 변경 이벤트를 감지하면 알림 폭풍우가 될 것입니다. 삭제 이벤트 만 감지합니다.
  • 무료로 사용할 수 있고 관리도 편한 GAS로 가동시킨다.
  • 실험실 Google 계정에서 GAS 사용
  • 실험실 메리스에 흘리는 것보다 그룹 LINE이 더 쉽게 볼 수 있으므로 LINE Bot 사용
  • 알림 내용은 '캘린더 제목', '캘린더 시작 시간 및 종료 시간'

  • 완성 코드


    var scriptProperties = PropertiesService.getScriptProperties();
    var nextSyncTokenKey = 'NEXT_SYNC_TOKEN';
    
    function calendarUpdatedSample(e) {
      var calendarId = e.calendarId;
    
      // 予定取得時にsyncTokenを指定して差分イベントを取得
      var optionalArgs = {
        'syncToken': getNextSyncToken(calendarId),
        'showDeleted': true
      };
      var events = Calendar.Events.list(calendarId, optionalArgs);  
      // 差分イベントを処理
      for (var i = 0; i < events.items.length; i++) {
        var event = events.items[i];
        if (event.status === 'cancelled') {
          title = event.summary
    
          start = new Date(event.start.dateTime)
          start = start.toLocaleDateString() + ' ' + start.toLocaleTimeString();
          end = new Date(event.end.dateTime)
          end = end.toLocaleDateString() + ' ' + end.toLocaleTimeString();
          time = start.replace('JST', '') + '\n~\n' + end.replace('JST', '')
    
          message = '削除報告\n\n【タイトル】\n' + title + '\n\n【日時】\n' + time 
          sendLineNotification(message, scriptProperties.getProperty('LINE_GROUP_ID'));
        }
      }
    
      // 今回処理したイベントを対象外とするためsyncTokenを更新
      saveNextSyncToken(events.nextSyncToken);
    }
    
    function getNextSyncToken(calendarId) {
      // ScriptPropetiesから取得
      var nextSyncToken = scriptProperties.getProperty(nextSyncTokenKey);
      if (nextSyncToken) {
        return nextSyncToken
      }
    
      // ScriptPropetiesにない場合は、カレンダーから取得
      // 最後の予定を取らないといけないみたいなのでtimeMinを指定
      var events = Calendar.Events.list(calendarId, {'timeMin': (new Date()).toISOString()});
      nextSyncToken = events.nextSyncToken;
      return nextSyncToken;
    }
    
    function saveNextSyncToken(nextSyncToken) {
      scriptProperties.setProperty(nextSyncTokenKey, nextSyncToken);
    }
    
    function sendLineNotification(message, toId) {
      var url = 'https://api.line.me/v2/bot/message/push';
      var LINE_ACCESS_TOKEN = ScriptProperties.getProperty('LINE_ACCESS_TOKEN');
    
      UrlFetchApp.fetch(url, {
        'headers': {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
        },
        'method': 'post',
        'payload': JSON.stringify({
          'to': toId,
          'messages': [{
            'type': 'text',
            'text': message,
            'notificationDisabled': false
          }],
        }),
        }
      );
    }
    

    GAS 사용법



    GAS의 기본적인 사용법은 여러가지 기사가 구그면 나오므로 그쪽을 참고로 해 주시는 것으로.
    이번에 만든 bot에서 중요한 것은 Google Calendar 삭제 이벤트를 감지하는 기능입니다.

    GAS에 Google 캘린더의 이벤트 변경 감지 기능이 구현되었으므로 시도했습니다.

    이쪽의 기사에 상세하게 묶여 있었으므로 참고로 했습니다.
    이번에는 변경 이벤트는 데리지 않고 삭제 이벤트만 탐지하고 싶었으므로 그 부분만 다시 작성했습니다.
    해당 코드는 여기입니다.
    if (event.status === 'cancelled') {
    
    
      var optionalArgs = {
        'syncToken': getNextSyncToken(calendarId),
        'showDeleted': true
      };
    

    이렇게 하면 삭제 이벤트만을 감지하여 대량의 통지가 그룹 라인에 투하되지 않도록 했습니다.
    또한 option에 showDeleted: true를 넣지 않으면 삭제 된 이벤트가 응답에 포함되지 않습니다.

    LINEbot과의 제휴



    LINE bot과의 연계에 관해서도 꽤 기사가 있습니다.
    그룹에 메시지를 게시하려면 그룹 ID를 가져와야 하지만 이는 개인 계정에 메시지를 게시하는 것과 거의 다르지 않습니다.

    LINE Messaging API에서 groupId를 가져와 Push API로 그룹에 메시지 보내기

    실제로 사용해도 어땠습니까?




  • 다른 실험실 예약이 사라지면 5 분 이내에 열려있는 예약을 할 수있게되었습니다
  • 같은 실험실 내에서도 예약을 지웠을 때 일일이, 보고하지 않아서 좋아졌다

  • 개인 개발로 사람에게 사용할 수 있는 레벨의 앱을 만들려고 하면, 프런트, 서버 등 여러가지 준비할 필요가 나와 힘듭니다.
    GAS와 LINE bot나 slack등을 조합하면, 간편하게 도움이 되는 어플리를 만들 수 있으므로, 숨막히게 실장해 보세요.

    Slack에 번역bot 추가
    키 관리 시스템을 만들면 칭찬받은 이야기
    Hangout Chat에서 에어컨 앙케이트 집계 Bot을 만들면 여러가지 배운 이야기

    좋은 웹페이지 즐겨찾기