0. 背景:なぜこれを作ったのか
2026年7月1日から休職に入りました。産業医から指摘された課題は以下の3点です。
- 睡眠リズムの乱れ
- 中途覚醒の多さ
- 中途覚醒後の再入眠の困難
Pixel Watch 4は詳細な睡眠ステージを記録してくれますが、標準アプリでは「点」のデータしか見えず、「線」としての分析(中途覚醒の頻度や傾向)が困難でした。
「暇(?)だし、APIでスプレッドシートに書き出して、徹底的に分析してやろう」と思い立ったのがきっかけです。
更に、GeminiやClaude等、各種LLM AIが新旧入り混じった情報を出してくるので、この記事(リンクの公式リファレンス)を読ませておけば、間違いないという備忘録も兼ねています。
1. 実現したいこと(MySleepDashboardの要件)
単なる「睡眠時間の記録」ではなく、以下の分析ができる環境を構築することをゴールに設定しました。
- 中途覚醒の可視化: 何時に目が覚め、その後どれくらいの時間「覚醒状態」だったかの抽出。
- データの連続性: 7月1日の休職開始日から今日までの全データをスプレッドシートへ一括取得。
- 相関分析: 睡眠の質と、日中の体調や活動量の相関をグラフ化し、回復の兆しを客観的に捉える。
2. 実装のキモ:Google Health API (v4) への到達
Google Fit APIのサポート終了(2025年)に伴い、後継のGoogle Health API (v4) への移行が必須となりましたが、日本語のGAS連携情報はまだ極めて少ないのが現状です。ネット上には古い Google Fit API や Fitbit API の情報が混在していますが、2026年8月現在の Google Health API (v4) での正解はこちらです。
認証とURLの正解
-
APIバージョン:
v1ではなくv4を使用。 -
エンドポイント:
https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints -
リクエスト:
startTimeなどのパラメータは使えません。filterパラメータ 一本で指定します。
filterパラメータによるデータ抽出
startTime などの直感的なパラメータは廃止されており、全て filter 文字列で指定する独特な仕様になっています。
// フィルタの構文が独特。sleep.interval.end_time を指定するのがコツ
const filterStr = `sleep.interval.end_time >= "${startTimeStr}" AND sleep.interval.end_time < "${endTimeStr}"`;
const url = `https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints?filter=${encodeURIComponent(filterStr)}`;
3. 遭遇したエラーと解決策
-
404 (Not Found):
古いドキュメントのURL(/v1/users/me/sleepなど)を叩くと、ロボットの絵のHTMLページが返ってきます。公式リファレンスを読み込み、/v4/.../dataPointsが正解だと判明しました。 -
400 (Bad Request):
APIリファレンスのQuery parametersを見ると、startTimeという項目が存在しませんでした。すべてfilter文字列の中に含めるルールに変更されていました。 -
パースエラー:
APIのレスポンス階層が想像以上に深かった(result.dataPoints[0].sleep.interval...)のですが、これもリファレンスのJSON構造と照らし合わせることで解決しました。
4. 今後の展望
ようやく「データがシートに届く」というスタートラインに立てました。
現在はデータの詳細化(sleepStages の解析)と、スプレッドシート上でのダッシュボード構築を進めています。
「自分の体調をデータで管理し、改善のサイクルを回す」というプロセス自体が、回復への大きな一歩だと感じています。
5. 参考にした公式リファレンス
おわりに
執筆段階ではダッシュボードの完成はしておりません。
また、今後の更新はGoogleスプレッドシートを弄るほうが多いので、記事にする予定も今のところありません。
それでもこの記事が、技術的な不便を感じている人だけでなく、同じように自身の体調管理のためにデータを活用したいと考えている誰かの助けになれば幸いです。