FEELCYCLEの予約メールを自動でgoogleカレンダーに登録(GAS)

2025年5月5日 | からふみ | ファイル: FeelCycle, tech.

全部無料でできました!コードは貼っておくけどサポートはしないので自力で出来る人は使ってください。

手順

  1. FC予約メールをGメールにする
  2. 1のアカウントでログインしてgoogle apps scriptを新規作成
  3. 以下のコードを貼る
  4. トリガーを設定する(addFEELCYCLEReservationsToCalendar, Head, 時間主導型、時間ベースのタイマー)

注意事項:予約メールを拾って登録するのでキャンセルした時は自動で反映されない。バイクを変更した場合は二通目がくるのでカレンダーに重複登録される。

その他tips

outlookカレンダーに表示したい場合は上記で作ったgoogleカレンダーをひたすらコピーするoutlookカレンダーを作ればOK

え、めっちゃ便利〜ありがとう!って思った人はこのサイトのアフィリエイトから何か商品を買ってネ!

function addFEELCYCLEReservationsToCalendar() {
  var searchQuery = 'from:feelcyclem@feelcycle.com subject:"【FEELCYCLE】ご予約登録" -label:FEELCYCLE_Processed';
  var threads = GmailApp.search(searchQuery, 0, 5);  // 最新5件のメールを検索
  var calendar = CalendarApp.getDefaultCalendar();
  
  // ラベルを取得または作成
  var processedLabel = GmailApp.getUserLabelByName('FEELCYCLE_Processed');
  if (!processedLabel) {
    processedLabel = GmailApp.createLabel('FEELCYCLE_Processed');
  }

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var body = message.getPlainBody();
      
      // 日時、レッスン名、店舗名を抽出
      var dateTimeMatch = body.match(/日時: (\d{4}年\d{2}月\d{2}日\(.+?\) \d{2}:\d{2}~\d{2}:\d{2})/);
      var lessonMatch = body.match(/レッスン: (.+)/);
      var storeMatch = body.match(/店舗: (.+)/);
      
      if (dateTimeMatch && lessonMatch && storeMatch) {
        var dateTimeStr = dateTimeMatch[1];
        var lessonName = lessonMatch[1];
        var storeName = storeMatch[1];
        
        // 日時文字列をDateオブジェクトに変換
        var dateTimeParts = dateTimeStr.match(/(\d{4})年(\d{2})月(\d{2})日\(.+?\) (\d{2}):(\d{2})~(\d{2}):(\d{2})/);
        var startDate = new Date(dateTimeParts[1], dateTimeParts[2] - 1, dateTimeParts[3], dateTimeParts[4], dateTimeParts[5]);
        var endDate = new Date(dateTimeParts[1], dateTimeParts[2] - 1, dateTimeParts[3], dateTimeParts[6], dateTimeParts[7]);
        
        // カレンダーに予定を追加(場所情報を含む)
        calendar.createEvent(lessonName, startDate, endDate, {
          description: body,
          location: storeName
        });
        
        Logger.log('予定を追加しました: ' + lessonName + ' at ' + storeName + ' on ' + startDate);

        // 処理済みラベルを付ける
        threads[i].addLabel(processedLabel);
      }
    }
  }
}


タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.