GAS를 사용하여 Google 캘린더의 특정 이벤트를 linebot flex 메시지로 표시했습니다.

본 기사의 내용



작성한 linebot에 사용자가 특정 메시지를 보내면 Google 캘린더에서 일주일 이내에 특정 이벤트만 추출하여 flex 메시지로 표시하는 프로그램을 만들었습니다.
(※코드를 적게 하면, linebot을 등록한 타이밍에 자동적으로 이벤트의 일정을 통지할 수도 있습니다)
이를 통해 linebot에 등록한 사람에게 수동으로 일정을 가르칠 필요가 없으며 일정 알림을 자동화할 수 있습니다.



↑의 화상은 유저가 「일정」이라고 메세지를 보내면, 제휴한 Google 캘린더에 등록하고 있는 일주일 이내의 「설명회」의 일정을 표시하고 있습니다.

운영 환경


  • Windows10 Home
  • GAS V8 엔진
  • linebot
  • flex 메시지

  • 코드 내용 (GAS V8 엔진)



    gas.js
    // googleカレンダーのIDを取得
    const cal = CalendarApp.getCalendarById('連携したいGoogleアカウントのメールアドレス(Gmail)');
    
    //チャネルアクセストークンを設定する
    const channel_access_token = 'ここにlinebotのチャネルアクセストークンを入れる';
    
    //現在時刻から7日後の同時刻までの間に存在する予定の中で追加条件に一致する予定をすべて取得してjsonに追加しそれを返す
    function getEvents() {
      // json形式のオブジェクト
      const json = {
        "type": "flex",
        "altText": "this is a flex message",
        "contents": {
          "type": "bubble",
          "body": {
            "type": "box",
            "layout": "vertical"
          }
        }
      }
      const startTime = new Date();
      const endTime = new Date(Date.parse(startTime) + (7 * 60 * 60 * 24 * 1000));
      const options = {
        search: "Googleカレンダーから抽出したいイベントの名前"
       }
      const events = cal.getEvents(startTime, endTime, options);
      const contents = [];
    
      for (let i in events) {
        const date = Utilities.formatDate(events[i].getStartTime(), "JST", "MM月dd日"); /*それぞれのイベントの日付を○○月××日に変更*/
        const title = events[i].getTitle(); /*イベントのタイトルを取得*/
    
    // jsonにcontentsを追加
        const contentsItem = {
          "type": "text",
          "text": date + title
        }
    
        contents.push(contentsItem);
    
        json.contents.body.contents = contents;
      }
    
      return json;
    }
    
    // post関数
    function doPost(e) {
     const events = JSON.parse(e.postData.contents).events;
     const textMessage = getEvents();
    
     events.forEach(function(event) {
       const replyToken= event.replyToken;
       if (typeof replyToken === 'undefined') {
         return; // エラー処理
       }
       if(event.message.text === 'トリガーとなるlinebotに対してユーザーが送るメッセージ') { 
         // ユーザーからbotに特定のメッセージが送られた場合に起きる処理
         const ExplanationMessage = textMessage;
          const ExplanationMessageData = {
            "replyToken" : event.replyToken,
            "messages" : [ExplanationMessage]
          }
          const Eoptions = {
            "method" : "post",
            "headers" : {
              "Content-Type" : "application/json",
              "Authorization" : "Bearer " + channel_access_token
            },
            "payload" : JSON.stringify(ExplanationMessageData)
          };
          UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", Eoptions);
       }
     })
    }
    

    코드 내용 설명



    gas는 현재(2020년 10월 13일 시점) V8엔진이 구현되어 있어 js에 가까운 쓰는 방법을 할 수 있으므로 구문은 거의 JavaScript입니다.
    먼저 CalendarApp.getCalendarById('連携したいGoogleアカウントのメールアドレス(Gmail)') 에서 추출할 Google ID를 가져옵니다.
    그리고, channel_access_token 에 linebot 작성시에 얻을 수 있는 (없는 경우는 별도 발행할 필요가 있습니다) 채널 액세스 토큰을 설정합니다.

    getEvents 함수



    이 함수는 flex 메시지에 대한 정보인 json를 설정하여 사용자가 특정 메시지를 보낸 시점부터 일주일 내에 Google 캘린더에 등록된 특정 이벤트를 추출합니다.
    그 후에 json 에 추출한 이벤트의 정보를 순차적으로 추가해 가고, 마지막에 jsonreturn 로 돌려줍니다.

    doPost 함수



    이 함수는 사용자가 취한 액션을 취득하고, 그 안에서 행해진 액션 내용(유저가 linebot를 팔로우 하거나, 메세지를 보내거나 등)으로 조건 분기해 처리를 실시합니다.
    이 함수 내에서 앞에서 설명한 getEvent 함수에서 반환 한 json를 사용하여 flex 메시지를 사용자에게 보냅니다.

    코드를 작성한 후 수행하는 작업




    코드를 gas에 쓰면 '공개'에서 '웹 애플리케이션으로 배포'를 클릭하여 게시된 웹 앱의 URL을 복사합니다.
    그런 다음 '앱 액세스'를 '모든 사용자(익명 포함) [anyone even anonymous]'로 설정합니다.



    그런 다음 linebot의 관리 화면에서 webhook에 방금 복사한 웹 앱의 URL을 붙여 넣습니다.
    (※Use webhook에 체크를 넣어 주세요)

    감상



    GAS는 JavaScript 기반이므로 JavaScript를 쓸 수 있는 사람은 자연스럽게 쓸 수 있다고 생각합니다.
    또, 코드를 쓰고 나서 구현까지가 간단하기 때문에 별로 큰 정보량을 사용하는 것이 아니면 GAS로 충분하다고 생각합니다.
    그리고, 정말 재미있었습니다! 자신이 쓴 코드가 제대로 움직여 flex 메시지가 표시되었을 때의 감동이나 바!
    이 기사를 읽어 주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기