Google Apps Script使ってシネマシティの予約をGoogleCalendar上で把握する

4月多忙すぎてこのブログも放置していてすいません。そして、そんな状況なので映画も見にいけてなくてストレス! ということでなんか新しいことをやろう、と思い立ち、前々からやろうやろうと思っていてできていなかった、Google Apps Scriptでのメール→スケジュール連携をやってみました。

参考にさせて頂いたたのはコレ。

tomono.hatenadiary.com

TOHOシネマズは基本的に行かないので、やはり頻度の高いシネマシティを最初に作ろうということで。

  • 発券はSuicaタッチで済むので、予約番号がわかる必要はない
  • キャンセルを頻繁にするので、それをGoogleCalendarに反映できると嬉しい

といったところを踏まえてふにふにコーディング。

function cinemacity() {
  var calendar = CalendarApp.getDefaultCalendar();
  var start = 0;
  var max = 10;   //こんなに一気に予約しないけど。
  var threads = GmailApp.search('from:webmaster@cinemacity.co.jp  newer_than:2d ',start,max);
  threads.reverse();    //古いほうから処理
  
  for(var i in threads){
    var thread = threads[i];
    var msgs = thread.getMessages();
    
    for(var j in msgs){
      var msg = msgs[j];
      var subject = msg.getSubject();
      var body = msg.getPlainBody();
      rowbody = body;
      body =  body.replace(/[\n\r]/g,"");   //正規表現に改行コード入れると見づらいので削除しておく

      if (subject.match(/【シネマシティ】チケットご予約.+のお知らせ/)){
        var title = body.match(/■作品名([^■]+)■/)[1];
        var theatre = body.match(/■劇場([^■]+)■/)[1]; //そいえばイオンシネマだと記載がないよね
        var seat = body.match(/■座席([^■]+)■/)[1];
        var match=null;
        if(match = body.match(/■上映時間([^■]+)年([^■]+)月([^■]+)日\(.+\) ([^■]+:[^■]+) \- ([^■]+:[^■]+)■/)){
          var start_date_time = new Date(match[1]+ "/" + match[2] + "/" + match[3] + " "+match[4]+":00");
          var end_date_time = new Date(match[1]+ "/" + match[2] + "/" + match[3] + " "+match[5]+":00");        
        } //シネマシティは終映時刻も予約メールに入っている。えらい!
      
        Logger.log("Title  : " + title);
        Logger.log("Theatre: " + theatre);
        Logger.log("Seat   : " + seat);
        Logger.log("From   : " + start_date_time);
        Logger.log("To     : " + end_date_time);
      
        var registed_events = calendar.getEvents(start_date_time, end_date_time, {search: title + " シネマシティ " + theatre + seat});
      
        if(subject.match(/【シネマシティ】チケットご予約完了のお知らせ/)){

          if(registed_events.length == 0) {
            var event = calendar.createEvent(title,
                                           start_date_time,
                                           end_date_time,
                                           {description: rowbody, location: "シネマシティ " + theatre + seat});
            Logger.log("Calendar Registered: " + event.getId());
          } else {
            Logger.log("Already registered. (count:"+registed_events.length+") ("+registed_events[0].getTitle()+")");
          }
        }else if(subject.match(/【シネマシティ】チケットご予約削除のお知らせ/)){
      
          if(registed_events.length > 0) {
            registed_events[0].deleteEvent();
            Logger.log("Calendar Deleted " );
          } else {
            Logger.log("Already deleted. ");
          }
        
        }
        Logger.log("----------------------------------");    
      }
    }
  }
  
}  

正規表現がちょいダサいというところはあるものの、目的は足すだけならこんなもんだろ、というところで。使い方は最初に書いたリンク先参照。

あとはイオンシネマチネチッタを作れば8割カバーできるかな。

(4/30追記)会員期限のお知らせとか届くとエラーになることが判明したので直しました