Gmail에서 수신한 예약 완료 이메일에서 Google 캘린더에 이벤트를 추가하는 GAS 스크립트

경위



Skype 영어 대화 예약 완료 이메일에서 Google 캘린더에 추가하는 스크립트를 작성하여 작년부터 사용하고 있습니다.
거기의 메일이 조금 포맷이 바뀌거나 하는 것과 새롭게 피트니스에도 다니기 시작해 그쪽의 예약 메일에도 대응하고 싶었으므로 조금 재작성해 보았습니다.

참고한 기사



【GAS】DMM영화의 예약 완료 메일로부터 자동적으로 캘린더 이벤트를 작성하는 스크립트

이 사람은 모든 메일에서 대상 메일을 검색하는 스크립트를 쓰고 있었지만, 자신의 환경에서는 메일 수가 너무 많았기 때문에 잘 돌아 가지 않았기 때문에 Gmail의 라벨을 검색용 + 처리된 플래그에 사용 같이 해 보았습니다.

사전 준비


  • Google 캘린더에서 이벤트 추가를위한 캘린더 만들기 → 참고
  • Gmail에서 예약 메일에 일시적으로 붙이는 라벨과 자동화 설정 → 참고

  • 사용법


  • Google Drive를 열고 새 Google Apps Script를 만듭니다


  • 아래 코드를 붙여 넣고 실행

  • 코드



    calendar.gs
    /*
     * Gmailに受信した予約完了メールから自動的にGoogle Calendarにイベント登録する
     * サービス/会社ごとに微妙に日時・タイトルフォーマットが違うので設定できるようにしてみた
    */
    
    
    // 日時の正規表現パターン
    var RegExpPattern = {
      1: { // 例: FeelCycleの予約完了メールパターン
        regExp_date: /(\d{4}年\d{1,2}月\d{1,2}日)/gm,// 日時形式(ex: 2016年6月25日)
        regExp_time: /(\d{2}:\d{2})/gm,// 時刻書式(ex: 20:15)
        regExp_replace: /[年月日]/gm, // 日時に含まれる、「年,月,日」を「/」に置換する
        regExp_pos: 0 // 本文中何回目に出てくる日時・時刻を開始日・時刻とするか(通常は0=1回目)
      },
      2: { // 例: QQ Englisの予約完了メールパターン
        regExp_date: /(\d{4}-\d{2}-\d{2})/gm,// 日時形式(ex: 2016-06-25)
        regExp_time: /(\d{2}:\d{2})/gm, // 時刻書式(ex: 20:15)
        regExp_replace: /-/gm, // 日時に含まれる、「-」を「/」に置換する
        regExp_pos: 1 // 以下の文例のように、受付日時が最初に来るので1(2回目)を指定
      }
    }
    
    
    // QQ Englishのメール文例
    // 日頃はQQイングリッシュをご利用頂き、ありがとうございます。
    // 下記の内容でご予約を受け付けました。内容をご確認下さい。
    // 
    // 【ご予約内容】受付日時: 2016-07-28 15:56
    // ------------------------------------------------
    // 日付: 2016-08-06
    // 時間: 07:30-08:00
    // 教師: Saravi
    // カリキュラム: ビジネスイングリッシュ
    // ------------------------------------------------
    
    
    
    function main(){
      createEventFromGmail("QQENG","English", "レッスン予約完了", 2,30)  
      // イベント名: QQENG
      // カレンダー名:English
      // タイトルに含まれるキーワード: 予約
      // 日時の正規表現パターン: 1
      // 一回あたりのレッスン時間: 30分
      createEventFromGmail("FeelCycle","Excercise", "予約", 1,45)
      // イベント名: FeelCycle
      // カレンダー名:Excercise
      // タイトルに含まれるキーワード: 予約
      // 日時の正規表現パターン: 2  
      // 一回あたりのレッスン時間: 45分  
    }
    
    
    function createEventFromGmail (EventName, CalendarName, Keyword,RegExpPatternNo,DurationMin) {
    
     // EventNameのラベルがついているメールスレッドを取り出す 
     var threads = GmailApp.getUserLabelByName(EventName).getThreads();
    
    // それぞれのスレッドに関して
     for (var i = 0,thread; i<threads.length; i++) { 
       thread = threads[i]        
    
       // 含まれるメッセージを取り出し、
       var messages = thread.getMessages();
       for(var j = 0,message; j<messages.length; j++){
         var message = messages[j]
         // メッセージのタイトルにKeywordが含まれていた場合は
         if(message.getSubject().indexOf(Keyword)>0){
    
           // 本文を取り出して、
           var body = message.getBody();      
    
           // 設定したパターンにマッチする日時を探して、
           var regExp_date = RegExpPattern[RegExpPatternNo].regExp_date;
           var regExp_time = RegExpPattern[RegExpPatternNo].regExp_time;
           var regExp_replace = RegExpPattern[RegExpPatternNo].regExp_replace;
           var regExp_pos = RegExpPattern[RegExpPatternNo].regExp_pos;       
    
           var date = body.match(regExp_date);
           var time = body.match(regExp_time); 
    
           // イベント開始時刻
           var from = new Date(date[regExp_pos].replace(regExp_replace,'/')+" "+time[regExp_pos])        
           // イベント終了時刻 = 開始時刻 + レッスン時間
           var to = new Date(+from + DurationMin*60*1000);
    
    
    
           // 追加したいCalendarNameという名前のカレンダーを取得し、
           var myCalendar = CalendarApp.getCalendarsByName(CalendarName)[0];       
    
           // ちゃんと存在したら
            if(myCalendar){
              // 同じ時刻に、同じイベント名で登録されているイベントを探してみて、
              var existingEvents = myCalendar.getEvents(from, to, {search: EventName})
              // なかったらイベントを作成する
              if(existingEvents.length == 0){            
                myCalendar.createEvent(EventName, from,to, {description: body});            
              } else {
                Logger.log(from)
                Logger.log("イベント登録済みです");
              }
            }else{       
              Logger.log("カレンダーが見つかりませんでした: "+CalendarName);
            }
        }
      }
      // 繰り返し処理がされないためにラベルを削除
      thread.removeLabel(GmailApp.getUserLabelByName(EventName)); 
     }
    }
    
    
    
    

    좋은 웹페이지 즐겨찾기