毎日のOura RingデータをGoogleカレンダーに同期する方法

Oura ring

Oura Ringは、睡眠、活動量、準備度などのデータを提供する革新的なウェアラブルデバイスです。これらのデータを毎日のスケジュールと同期させることで、健康管理や日々の生活の質の向上を図ることが可能になります。今回の記事では、Oura Ring API(V2)を使用してデータを取得し、それをGoogleカレンダーに表示する方法を詳しく解説します。

(※この記事で紹介しているスクリプトは、こちらの記事を参考にさせていただきました。)

ステップ1: Googleカレンダーの準備

まずこちらからGoogleカレンダーを開きます。普段からGoogleスプレッドシートやGoogleカレンダーなど使っている人は、普段使っているGoogleアカウントでログインします。
(※Googleアカウントをまだ持っていない人は、こちらから無料でGoogleアカウントを作成しましょう。)

Googleアカウントでログインができたら、左側の「他のカレンダー」と記載のある部分の「+ボタン」→「新しいカレンダーを作成」の順にクリックしてください。

新しく追加するカレンダーの任意の名前を決めます。今回は睡眠時間を表示するために、新しくカレンダーを作成しているので、「睡眠時間」と名付けてカレンダーを作成。

そうすると、左側の「マイカレンダー」に新しく「睡眠時間」という名前のカレンダーが追加されたことがわかります。

以上で、Googleカレンダーの準備が完了です。

ステップ2: スクリプトを作成するエディタを準備

次にOura ringのAPIからデータを取得し、Googleカレンダーに自動で睡眠時間を記録するスクリプトを書き込むエディタを準備します。

今回はこちらからGoogleドライブを開きます。

Googleドライブを開けたら、左上の「+新規」のボタンをクリックします。

すると、上記のようないろいろなGoogleサービスが表示されるので、「その他」→「Google Apps Script」の順にクリックしてください。

上記のようなエディタが新しく開かれたら、エディタの準備は完了です。

ステップ3: Oura APIからデータを取得

ここからは実際にOura ringのAPIからデータを取得するためのスクリプトを作成し、先ほど作成したエディタに実際にスクリプトを書き込んでいきます。

まずは、以前の記事で取得したパーソナルアクセストークンを使用して、Oura ringのAPIから指定した日付の自分自身のデータを取得するために下記のようにエディタにスクリプトを貼り付けます。
(※下記の画像は別のスクリプトが記載されているイメージ画像です。下記のように、エディタに今回用のスクリプトを貼り付けてください。)

実際に貼り付けるためのスクリプトはこちら↓

function main(){
  let token = '*************' //ここにOuraAPI Tokenを記載※コード管理も注意
  let api = 'sleep'
  let today = new Date()
  let yesterday = new Date()
  yesterday.setDate(yesterday.getDate()-1)

  let parameters = {
    start_date: Utilities.formatDate(yesterday, 'JST', 'yyyy-MM-dd'),
    end_date: Utilities.formatDate(today, 'JST', 'yyyy-MM-dd')
  }
  let sleep = ConnectOuraAPI(api, parameters, token)

  api = 'workout'
  let workout = ConnectOuraAPI(api, parameters, token)
  let activity = workout.data[0].activity

  api = 'daily_sleep'
  let dairySleep = ConnectOuraAPI(api, parameters, token)
  let dairySleepScore = dairySleep.data[0].score
  
  for (let s of sleep.data){
    AddEventGoogleCalendar(dairySleepScore, s.bedtime_start, s.bedtime_end, '4')
  }
  for (let w of workout.data){
    AddEventGoogleCalendar1(activity, w.start_datetime, w.end_datetime, '2')
  }
}

function ConnectOuraAPI(api, parameters, token) {
  const baseUrl = 'https://api.ouraring.com/v2/usercollection/'
  let url = `${baseUrl}${api}?`
  for (let parameter in parameters){
    url += `${parameter}=${parameters[parameter]}&`
    if(Object.keys(parameters).slice(-1)[0] === parameter){
    url = url.slice(0, -1)
    }
  }
  let requestOptions = { 
    muteHttpExceptions: true,
    method: 'GET', 
    headers: {
      'Authorization': `Bearer ${token}`
    }
  }
  let res = UrlFetchApp.fetch(url, requestOptions).getContentText()
  return JSON.parse(res)
}

このスクリプトについてすごく簡単に説明します。
クリプトの2行目で指定したパーソナルアクセストークンを使ってAPIを指定し、4、5行目で最新の日付のデータにアクセスします。Oura ringで取得できるデータのうち、今回は日々の睡眠時間データ(昼寝の時間も含む)と、ワークアウトのデータをGoogleカレンダーに自動で表示するためにAPIを指定し、ConnectOuraAPI関数を呼び出します。

ステップ4: Googleカレンダーへのデータ同期

Googleカレンダーへ自動入力するスクリプトの作成

続いて、Google Apps Scriptを使用して、APIから取得したデータ(時間と睡眠スコアと、ワークアウトの種類)をGoogleカレンダーに自動で入力するためのスクリプトを記載していきます。

実際に貼り付けるためのスクリプトはこちら↓

function AddEventGoogleCalendar(score, bedtime, awakeTime, colorId){
	const CALENDAR_ID = '**************' //ここにGoogleカレンダーIDを記載
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID)
  var event = calendar.createEvent(`睡眠スコア:${score}`, new Date(bedtime), new Date(awakeTime))
  event.setColor(colorId);
}

function AddEventGoogleCalendar1(activity, start, finish, colorId){
	const CALENDAR_ID = '****************' //ここにGoogleカレンダーIDを記載
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID)
  var event1 = calendar.createEvent(`アクティビティ:${activity}`, new Date(start), new Date(finish))
  event1.setColor(colorId);
}

この部分では、指定されたカレンダーIDのカレンダーにAPIから取得したデータを記載するようなものになっています。このスクリプトの上半分が睡眠スコアと睡眠時間をGoogleカレンダーに入力するため、下半分がワークアウトの種類と時間を入力するためのものになっています。(似たような名前の関数を二つ作っているので、すごく冗長的な書き方になってしまいました。)

GoogleカレンダーIDの確認方法

上記スクリプトのGoogleカレンダーIDの部分の確認方法について解説します。

上記のようなGoogleカレンダーの画面に行き、マイカレンダーの中から先ほど作成した「睡眠時間」のカレンダーの右側に表示される「3点が縦に並んだマーク」をクリックします。

すると上記のような表示なるので、「設定と共有」をクリックしていきます。

設定と共有のページが開かれたら、少し下にスクロールしていくと、「カレンダーの統合」の欄が出てくるので、そこに記載されているカレンダーIDをメモしましょう。

以上がGoogleカレンダーIDの確認方法です。

自動実行するためのトリガーの設定

では、実際に作成したスクリプトを毎日定期的に実行されるように設定していきます。

先ほど開いていたエディタの左側を見ると、「トリガー」という欄があるので、そこをクリックします。最初はトリガーが何もない状態なので、画面右下にある「+トリガーを追加」をクリックしましょう。

すると、上記のような画面が開くので、トリガーの中身を変更していきます。
今回のスクリプトでは、実行する関数は「main」、実行されるタイミングは「時間主導型」で「日付ベースのタイマー」の「午前9時〜10時」に設定しておきます。
(※時間の部分を変更することで、どのタイミングで今回のスクリプトが実行されるかを変更できます。)

トリガーの設定ができたら、「保存」をクリックします。

すると、先ほどは何もなかったトリガー一覧の欄に作成したトリガーが追加されています。

これでトリガーの準備も完了です。

ステップ5: Googleカレンダーへの反映結果を確認

最後に今回作成したスクリプトを、1週間実行して見た結果を見て見ましょう。

睡眠の時間とワークアウトの時間がそれぞれ表示されていることがわかります。
(※毎朝9時〜10時に今回のスクリプトが実行される前に、Ouraのアプリを開き、前日の睡眠とワークアウトのデータがアプリ内に同期されていることが前提のようです。そのため、毎朝Ouraのアプリを開く習慣のある人は問題ないですが、そうでない人はもう少し工夫が必要ですね。)

まとめ

Oura Ring APIから取得したデータをGoogleカレンダーに同期することで、自分の健康データを日常生活に簡単に組み込むことができます。この方法を活用することで、健康管理がより効率的かつ効果的になり、生活の質の向上に寄与します。

最後に、今回作成したスクリプト全体です↓

function main(){
  let token = '*************' //ここにOuraAPI Tokenを記載※コード管理も注意
  let api = 'sleep'
  let today = new Date()
  let yesterday = new Date()
  yesterday.setDate(yesterday.getDate()-1)

  let parameters = {
    start_date: Utilities.formatDate(yesterday, 'JST', 'yyyy-MM-dd'),
    end_date: Utilities.formatDate(today, 'JST', 'yyyy-MM-dd')
  }
  let sleep = ConnectOuraAPI(api, parameters, token)

  api = 'workout'
  let workout = ConnectOuraAPI(api, parameters, token)
  let activity = workout.data[0].activity

  api = 'daily_sleep'
  let dairySleep = ConnectOuraAPI(api, parameters, token)
  let dairySleepScore = dairySleep.data[0].score
  
  for (let s of sleep.data){
    AddEventGoogleCalendar(dairySleepScore, s.bedtime_start, s.bedtime_end, '4')
  }
  for (let w of workout.data){
    AddEventGoogleCalendar1(activity, w.start_datetime, w.end_datetime, '2')
  }
}

function ConnectOuraAPI(api, parameters, token) {
  const baseUrl = 'https://api.ouraring.com/v2/usercollection/'
  let url = `${baseUrl}${api}?`
  for (let parameter in parameters){
    url += `${parameter}=${parameters[parameter]}&`
    if(Object.keys(parameters).slice(-1)[0] === parameter){
    url = url.slice(0, -1)
    }
  }
  let requestOptions = { 
    muteHttpExceptions: true,
    method: 'GET', 
    headers: {
      'Authorization': `Bearer ${token}`
    }
  }
  let res = UrlFetchApp.fetch(url, requestOptions).getContentText()
  return JSON.parse(res)
}

function AddEventGoogleCalendar(score, bedtime, awakeTime, colorId){
	const CALENDAR_ID = '**************' //ここにGoogleカレンダーIDを記載
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID)
  var event = calendar.createEvent(`睡眠スコア:${score}`, new Date(bedtime), new Date(awakeTime))
  event.setColor(colorId);
}

function AddEventGoogleCalendar1(activity, start, finish, colorId){
	const CALENDAR_ID = '****************' //ここにGoogleカレンダーIDを記載
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID)
  var event1 = calendar.createEvent(`アクティビティ:${activity}`, new Date(start), new Date(finish))
  event1.setColor(colorId);
}

コメント