ふかふかブログ

興味のあることについてゆる~く書きます

スプラトゥーン3のスケジュールをGoogleカレンダーに登録してみなイカ

こちらの記事の令和最新版です。 www.nohara.dev ↑上の記事にある方法では現在動きません。

前回はGoogleカレンダーの更新/インポート間隔が調整できない(1日?)問題があったためスプラトゥーンのスケジュールとは相性が合わずでした。 そこで今回は自分のカレンダーに登録する形で実装したいと思います。

2024/02/04追記

他人にカレンダーを見られたとき大変な反応をされることに気づいたので過去分を削除する処理を入れました。 一度過去分を削除したあとはoneDayBeforeを使うことで前日のものだけを削除できます。

実行環境

完成イメージ

画像では例としてXマッチのガチエリアのみ表示しています。 バンカラマッチのスケジュールを登録したい場合の方法は後述します

作成手順

  1. Googleドライブを開き、右クリック→その他→Google App Scriptを選択

  2. 今あるコードをすべて削除し、以下のコードをコピーペースト

     function getSplatoon3Schedule() {
       const headers = {
           "user-agent" : "twitter@fukafuka_ningen"
       }
       const options = {
           'headers' : headers
       }
       const response = UrlFetchApp.fetch('https://spla3.yuu26.com/api/x/schedule', options);
       const calendar = CalendarApp.getDefaultCalendar();
    
       if (response.getResponseCode() == 200) {
         const schedule = JSON.parse(response.getContentText());
         const events = Array.from(schedule.results);
    
         for (const event of events) {
           const startTime = new Date(event.start_time);
           const endTime = new Date(event.end_time);
           const rule = event.rule.name;
           const stages = event.stages;
           const stage1 = stages[0].name;
           const stage2 = stages[1].name;
           const title = `${rule} ${stage1} ${stage2}`; 
           createEvent(calendar, startTime, endTime, title, rule)
         }
       } else {
         console.log("Request failed with status code " + response.getResponseCode());
       }
       deletePastEvents(calendar)
     }
    
     function createEvent(calendar, startTime, endTime, title, rule){
           // 重複登録しない
           const registered_events = calendar.getEvents(startTime, endTime);
           for (const registerd_event of registered_events){
             if (registerd_event.getTitle() === title)
               return;
           }
    
           if (rule == "ガチエリア") {
             console.log(`${title} ${startTime} has been registerd.`);
             calendar.createEvent(title, startTime, endTime);
           } 
           // else if (rule == "ガチアサリ") {
           //   console.log(`${title} ${startTime} has been registerd.`);
           //   calendar.createEvent(title, startTime, endTime);
           // }
     }
    
     function deletePastEvents(calendar) {
       var now = new Date(); // 現在の日時
       //var events = calendar.getEvents(new Date('20023-01-01T00:00:00Z'), now); // 2023年から現在までのイベントを取得
       var oneDayBefore = new Date(now.getTime() - (24 * 60 * 60 * 1000)); // 現在時刻から24時間(1日)前
        var events = calendar.getEvents(oneDayBefore, now); // 昨日から現在までのイベントを取得
    
       for (var i = 0; i < events.length; i++) {
         var event = events[i];
         var title = event.getTitle(); // イベントのタイトルを取得
         if (event.getEndTime() < now) { // イベントの終了時刻が現在時刻より前の場合
           if (title.startsWith("ガチエリア") || title.startsWith("ガチアサリ")) {
             event.deleteEvent(); // イベントを削除
             Logger.log('Deleted: ' + event.getTitle()); // ログに削除したイベントのタイトルを記録
           }
         }
       }
     }
    
  3. Ctrl-sまたは上部アイコンからプロジェクトを保存し、実行します

  4. 権限の承認を求められるので承認します 警告が出ますが詳細から承認できます

  5. 実行ログをみて xx has been registerd. と出ていればうまくカレンダーに登録されています

  6. 続いて定期実行のために、画面左のメニューからトリガーを選択し、時間の間隔を選択(時間)を2時間に変更します

  7. 2時間以上経過後、スケジュールが自動で登録されていれば成功です

Xマッチ、エリア以外の情報が欲しい場合

  • バンカラマッチの情報が欲しい場合
    • コードの冒頭にあるURLのx部分をbankara-challengeまたはbankara-open に変更する
  • エリア以外の情報が欲しい場合
    • コード後ろのほうにあるガチエリア部分をガチヤグラ, ガチホコバトル, ガチアサリに変更する
  • 詳細は Spla3 API - スプラトゥーン3のステージ情報API を参照
  • サーモンランのスケジュールも登録できますがサーモンランの場合はそこまでリアルタイム性が求められないと思うのですでに有志の方が作られたサーモンランカレンダーを利用するのがお勧めです。

splamp.info