GoogleスプレッドシートにOura Ring APIデータを表示する方法

Oura ring

前回の記事では、Oura Ring APIのパーソナルアクセストークンの設定方法を詳しく説明しました。今回は、そのアクセストークンを使用して、Oura Ringから取得したデータをGoogleスプレッドシートに表示する方法をご紹介します。この方法を利用することで、睡眠パターンや活動データなどをより視覚的に分析し、健康管理やパフォーマンスの向上に役立てることができます。

ステップ1: Googleスプレッドシートの準備

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

Googleアカウントでログインができたら、新しいGoogleスプレッドシートを開き、データを記録するための「空白のスプレッドシート」を新しく作成してください。

上記のように新しくスプレッドシートを作成したら、とりあえずシートの名前を変更します。
(※今回はスクリプトの中で、どのスプレッドシートを操作するかということは明記しないので、名前は変更しなくても特に問題ないです。)

次にスプレッドシートのスクリプトエディタを開き、Google Apps Scriptを使用してデータを取得するコードを記述するための準備をしていきます。

上記のように、スプレッドシートのツールバーの「拡張機能」タブを選択し、「Apps Script」をクリックします。すると下記のようなスクリプトを書き込むエディタが表示されます。

ここでもとりあえず、スクリプトの名前を変更しておきます。

これで、Googleスプレッドシートの準備と、実際にスクリプトを書き込むためのエディタの準備は完了です。

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

ここからは先ほど作成したエディタに実際にスクリプトを書き込んでいきます。

まずは、前回の記事で取得したパーソナルアクセストークンを使用して、Oura ringのAPIから指定した日付の自分自身のデータを取得するために下記のようにエディタにスクリプトを貼り付けます。

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

function main(){
  let token = '***********' //ここにOuraAPI Tokenを記載※コード管理も注意
  let parameters = {
    start_date: '2023-11-27',  //ここにデータを取得したい日付の開始日を記載
    end_date: '2023-11-28'    //ここにデータを取得したい日付の終了日を記載
  }
  let api = 'daily_sleep'
  
  let api_data = ConnectOuraAPI(api, parameters, token)
  console.log(api_data);
  writeToSpreadsheet(api, api_data);
}


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で取得できる活動データ、睡眠データ、準備データなど複数のデータのうち、今回は7行目で指定している’daily_sleep’(日毎の睡眠データ)のデータを取得します。

ステップ3: スプレッドシートにデータを表示

続いて、Google Apps Scriptを使用して、APIから取得したデータをスプレッドシートの適切なセルに自動的に入力するためのスクリプトを記載していきます。

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

function writeToSpreadsheet(apiName, data) {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName(apiName);

  // シートが存在しない場合は新しく作成
  if (!sheet) {
    sheet = spreadsheet.insertSheet(apiName);
  }
  let rowIndex = 1;

  // 'data'キーの処理
  if (data.hasOwnProperty('data')) {
    data['data'].forEach(item => {
      let cellIndex = 1;
      let itemString = JSON.stringify(item);

      // ',' と ':' を基にデータを分割し、適切なセルに配置
      itemString.split(',"').forEach(subItem => {
        let splitItems = subItem.split('":');
        splitItems.forEach((value, index) => {
          sheet.getRange(rowIndex, cellIndex).setValue(value.replace(/[\{\}\[\]"]+/g, ""));
          if (index < splitItems.length - 1) cellIndex++;  // ':' があれば横のセルに移動
        });
        rowIndex++;  // ',' があれば縦のセルに移動
        cellIndex = 1;
      });
    });
  }
}

この部分では、指定したAPIの名前のシートを新しく作成し、スプレッドシートのA列にデータのラベルを記載し、B列以降に実際にOura ringが測定したデータを記載するようなものになっています。

ステップ4: スプレッドシートの結果を確認

ここまでで作成したスクリプトを保存して、実行してみます。

実行してみると下記のようにスプレッドシートに指定した日付の’daily_sleep’(日毎の睡眠データ)のデータが記載されていることが確認できます。

今回は、11月27日から11月28日までのデータを表示するように日付指定したので、2日分の睡眠データが記載されました。日付やAPIのエンドポイント(取得するデータの種類)を変更することで、欲しい日付の欲しいデータを取得することが可能です。

まとめ

Oura Ring APIから取得したデータをGoogleスプレッドシートに表示する方法は、個人の健康管理やデータ分析に非常に有用です。今回紹介した手順に従って、自分だけのカスタマイズされたデータ管理システムを作成し、健康やパフォーマンスの最適化に役立ててください。次回は、Googleカレンダーに取得した睡眠やワークアウトのデータを表示する方法について、ご紹介していきます。

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

function main(){
  let token = '***********' //ここにOuraAPI Tokenを記載※コード管理も注意
  let parameters = {
    start_date: '2023-11-27',  //ここにデータを取得したい日付の開始日を記載
    end_date: '2023-11-28'    //ここにデータを取得したい日付の終了日を記載
  }
  let api = 'daily_sleep'
  
  let api_data = ConnectOuraAPI(api, parameters, token)
  console.log(api_data);
  writeToSpreadsheet(api, api_data);
}

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 writeToSpreadsheet(apiName, data) {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName(apiName);

  // シートが存在しない場合は新しく作成
  if (!sheet) {
    sheet = spreadsheet.insertSheet(apiName);
  }
  let rowIndex = 1;

  // 'data'キーの処理
  if (data.hasOwnProperty('data')) {
    data['data'].forEach(item => {
      let cellIndex = 1;
      let itemString = JSON.stringify(item);

      // ',' と ':' を基にデータを分割し、適切なセルに配置
      itemString.split(',"').forEach(subItem => {
        let splitItems = subItem.split('":');
        splitItems.forEach((value, index) => {
          sheet.getRange(rowIndex, cellIndex).setValue(value.replace(/[\{\}\[\]"]+/g, ""));
          if (index < splitItems.length - 1) cellIndex++;  // ':' があれば横のセルに移動
        });
        rowIndex++;  // ',' があれば縦のセルに移動
        cellIndex = 1;
      });
    });
  }
}

コメント