::class-exe

トラッキングアプリにGASでカレンダー対応する

September 1, 2019

最後はいつ?というトラッキングアプリはシンプルなUIで使いやすいが、カレンダーに対応していない。GASでカレンダー対応してみる。

https://apps.apple.com/jp/app/id534982023

"1年経過: トイレ掃除"といった内容のカレンダーイベントを作成するのが目標。

同期化の設定を有効にして、Dropboxに保存されるファイルをカレンダーの登録に利用する。

"Dropbox⁩/アプリ/Last Time/⁨MainStore.V2/⁨baselines⁩"に同期するために必要なファイルが保存されていた。

ファイルの中身はJSON形式で、以下のような内容が記載されている(関係ない要素は省いている)。

    "changesByEntity": {
        "Event": [
            {
                "properties": [
                    {
                        "propertyName": "lasttime",
                        "value": [
                            "date",
                            1537707955000
                        ],
                        "type": 0
                    },
                    {
                        "propertyName": "name",
                        "value": "トイレ掃除",
                        "type": 0
                    },
                ],
            },
        ]
    }
}

nameプロパティにはイベント名、lasttimeプロパティには直近のイベント更新時のミリ秒のUNIX timeが記載されていた。

このファイルをDropboxの公開リンクからアクセスして、GASでカレンダ ー登録を処理する。

コードは以下の通り。

function getLastTimeJSON() {
  var url = "Dropbox 公開リンクURL";
  var response = UrlFetchApp.fetch(url);
  var content = response.getContentText("UTF-8");
  var json = JSON.parse(content);
  
  return json;
}

function makeLastTimeEvent() {
  var json = getLastTimeJSON();
  var events = json.changesByEntity.Event;
  
  var calendarEvents = [];
  
  for (var i in events) {
    var properties = events[i].properties;
    var _name;
    var _lasttime;
    for (var j in properties) {
      var property = properties[j];
      if (property.propertyName == "name") {
        _name = property.value;
      }
      if (property.propertyName == "lasttime") {
        _lasttime = property.value[1];
      }
    }
    var calendarEvent = {
      name: _name,
      lasttime: new Date(_lasttime)
    };
    calendarEvents.push(calendarEvent);
  }
  return calendarEvents;
}

function setLastTimeItem(toCalId) {
  var calendarEvents = makeLastTimeEvent();
  var targetCal = CalendarApp.getCalendarById(toCalId);
  
  for (var i in calendarEvents) {
    var next = new Date();
    var lasttime = calendarEvents[i].lasttime;
    var name = calendarEvents[i].name;

    next.setTime(lasttime);
    next.setYear(lasttime.getYear() + 1);

    var title = "1年経過: " + name;
    targetCal.createAllDayEvent(title, next);
}

var lastTimeCalId = "GoogleカレンダーID";
function main(){
  setLastTimeItem(lastTimeCalId);
}

参考