【発展】iPhoneヘルスケアの睡眠データをCSVに|区間データの扱い方とハマりどころ

IT・自動化
この記事は約10分で読めます。

前回 iPhoneヘルスケアの歩数データをCSVに書き出すショートカット を作りました。歩数を眺めて運動不足に気が滅入ったところで、「ついでに睡眠も書き出して、寝不足ぐあいもAIに見てもらおう」と思い立ちました。

歩数のショートカットを複製して睡眠用に改造したのですが、睡眠データは数値ではなく「就寝〜起床の区間」が並ぶ区間データなので、いくつか歩数とは違うクセがありました。最終的に動いた構成と、途中で詰まったポイントを残しておきます。

この記事でわかること

  • iPhone標準の「ショートカット」アプリで、ヘルスケアの睡眠データをCSV化する手順
  • 歩数ショートカットを複製して睡眠用に改造する3つの変更点
  • ヘッダー行追加・日付フォーマット整形までやって、扱いやすいCSVにする方法
  • 睡眠データの「値」(コア/深い/レム/覚醒)の意味と、Apple Watch有無による出方の違い

環境・前提

  • iPhone(iOS 17以降)
  • 標準アプリ「ショートカット」「ファイル」が使える状態
  • ヘルスケアに睡眠データがすでに記録されていること
  • 前回の歩数ショートカットを作っていること(ない場合は 前回記事 を先に)

完成版はこちら

先に完成形を載せておきます。アクションは上から下へ、5枚のスクショで全体が見えます。

完成版1:日付入力部分
完成版2:終了日に1日追加とヘルスケア検索(種類は睡眠)
完成版3:繰り返しと開始日のフォーマット
完成版4:終了日のフォーマットとテキスト組み立て
完成版5:改行で結合・ヘッダー追加・名前変更・保存

歩数のときと骨格は同じで、太字で示した3か所だけ睡眠用に変えています。

順番 アクション 役割
1 入力を要求(日付) 書き出し開始日を選ぶ
2 テキスト+テキストから日付を取得 開始日を日時として確定
3 入力を要求(日付) 書き出し終了日を選ぶ
4 テキスト+テキストから日付を取得 終了日を日時として確定
5 日付に1日を追加 終了日を含めるよう範囲を1日後ろにずらす
6 ヘルスケアサンプルを検索(種類:睡眠) 期間内の睡眠サンプルを取得
7 各項目を繰り返す 1区間ずつ処理
8 開始日を取得 + 日付をフォーマット 開始日時を yyyy-MM-dd HH:mm:ss に整形
9 終了日を取得 + 日付をフォーマット 終了日時を整形(睡眠用に追加)
10 値を取得 睡眠ステージ(コア/深い等)を取得
11 テキスト [開始日_整形],[終了日_整形],[値] の1行を作る
12 テキストを改行で結合 全行をまとめる
13 テキスト(ヘッダー追加) 先頭に 開始日,終了日,睡眠ステージ を付ける
14 名前を変更 睡眠_開始日-終了日.csv というファイル名にする
15 ファイルを保存 ファイルアプリに書き出す

以下、歩数ショートカットからの改造ポイントを順に説明します。

手順1:歩数ショートカットを複製する

ショートカットの一覧画面で「歩数データ取得」を長押し → 「複製」 を選びます。複製されたタイルをタップして名前を 「睡眠データ取得」 に変えておくと、あとから一覧で迷いません。

複製してから改造することで、歩数版を壊さずに済みます。試行錯誤しても元に戻れる安心感があります。

手順2:種類を「睡眠」に変える

「ヘルスケアサンプルを検索」アクションをタップして、種類 を歩数から睡眠に変えます。

複製直後はこのように歩数の設定が残っています。

複製直後は種類がSteps(歩数)のまま

種類の「Steps」をタップ → 一覧から 「睡眠」 を選びます(iOSのバージョンによっては「Sleep」と英語表記で出ることもあります。同じ項目です)。すると変更後はこうなります。

種類を睡眠に変更後

ここで気づいたのですが、種類を睡眠に変えた瞬間、「単位」と「グループ分け」の項目が消えました。これはバグではなく仕様で、ヘルスケアのデータは2種類に分かれていて設定項目が違うようです。

データの型 設定項目
数値型(Quantity) 歩数・体重・心拍数 単位・グループ分けあり
カテゴリ型(Category) 睡眠・マインドフルネス 単位・グループ分けなし

睡眠は「7,000歩」のように数値で集計するものではなく、「この区間はこの状態」というラベル付き区間データです。だから単位もグループ分けも要らない、というわけです。なるほど、と納得しました。

手順3:ループ内に「終了日を取得」を追加する

歩数のときは1区間に「歩数の値」しかなかったので、ループ内では「開始日」と「値」の2つだけ取り出していました。睡眠は 区間データ なので、就寝(開始日)と起床(終了日)の両方が必要です。

「アクションを追加」から 詳細を取得 で検索 → 「ヘルスケアサンプルの詳細を取得」 を追加します。設定は次のとおりです。

  • 入力:繰り返し項目
  • 取得する項目:終了日

ここでひとつ詰まりました。アクションを追加した直後、入力欄に「繰り返し項目」が候補として出てきません。よく見ると追加されたアクションが ループの外 に挿入されていて、その位置からは「繰り返し項目」が変数として参照できない状態でした。アクションを長押ししてループの内側にドラッグしたら、無事「繰り返し項目」が候補に並びました。

ショートカットは その時点で利用できる変数しかサジェストに出さない 仕様です。ループの中で使いたい変数は、必ずループの中にアクションを置いてから設定する、と覚えておくと詰まりにくくなります。

完成版に合わせるなら、「開始日を繰り返し項目から取得」のすぐ下 に並べるのが見た目もきれいです。このあとの手順4で日付フォーマットを差し込む位置とも噛み合います。

手順4:日付フォーマットを yyyy-MM-dd HH:mm:ss に揃える

睡眠は1日に何十区間も発生します。日付の書式が揃っていないと、あとから扱うときに地味に手間がかかります。「日付をフォーマット」アクションをループ内に追加して、開始日と終了日それぞれを整形しておきます。

「開始日を繰り返し項目から取得」の直下に 「日付をフォーマット」 を追加し、設定を次のようにします。

  • 日付:開始日
  • 日付の書式:カスタム
  • 文字列をフォーマット:yyyy-MM-dd HH:mm:ss
日付をフォーマットアクションの設定

同じく終了日のあとにも「日付をフォーマット」を追加します。これで両方の日付が整形済みになります。

手順5:テキストアクションを3列に書き換える+変数をリネームする(ハマりどころ)

ここまででアクションは揃いましたが、ループ末尾の「テキスト」アクションは 歩数ショートカットを複製したときのまま で、中身は [開始日],[値] の2列だけです。これを3列の [開始日_整形],[終了日_整形],[値] に書き換える必要があります。

中身を一度クリアして変数を入れ直す

ループ末尾の「テキスト」アクションをタップして、

  1. 既存の [開始日],[値]すべて消す(青いタイルもまとめて削除)
  2. 空になったテキスト欄に、変数とカンマを次の順で入れ直す:
  3. 変数「フォーマット済みの日付」(開始日用)
  4. 半角カンマ ,
  5. 変数「フォーマット済みの日付」(終了日用)
  6. 半角カンマ ,
  7. 変数「値」

ここでハマりました。「日付をフォーマット」を2つ並べた都合で、どちらも出力の名前が 「フォーマット済みの日付」 になっており、変数選択画面で どっちがどっちか区別できません

開始日用と終了日用、両方とも「フォーマット済みの日付」

変数の挿入と改名のコツ

しばらく試行錯誤して、どうも次のやり方が確実なようです。

  1. キーボード横に出る雑なサジェストではなく、「変数を選択」 をタップして全体一覧を出す
  2. スクロールして 「フォーマット済みの日付」 をタップ(順番で開始日用と終了日用が分かれて並んでいます。上が開始日用、下が終了日用)
  3. 挿入された青いタイルを 長押し → 名前を変更開始日_整形終了日_整形 とつけ直す
  4. 入力後にEnter(または完了)をタップして確定 する

特に最後の Enter 確定が重要で、入力中のまま画面を切り替えると変更が破棄されて元の名前に戻ります。何度かこれで戻ってしまって、変わらないなあと首をかしげていました。

変数を長押しして名前を「終了日_整形」に変更

リネームできれば、テキストアクションの中身は [開始日_整形],[終了日_整形],[値] という見やすい形になります。以降、この変数は名前で識別できるようになり、迷いません。

手順6:ヘッダー行を追加する

歩数CSVはヘッダーなしでもなんとかなりましたが、睡眠は3列あるので どの列が何か を明示しておきたいところです。

「テキストを改行で結合」と「名前を変更」の をタップしてカーソルを置き、「テキスト」アクションを追加します。中身はこうします。

開始日,終了日,睡眠ステージ
[結合済みのテキスト]

1行目はキーボードで直接入力、Enterで改行、2行目は変数として 「結合済みのテキスト」 を挿入します。

ヘッダー行と本文を結合したテキスト

ここでもうひと詰まりしました。新しいテキストを追加しただけだと、「名前を変更」アクションの入力が 「結合済みのテキスト」のまま で、せっかくのヘッダーがファイルに反映されません。「名前を変更」の入力部分をタップして、新しく作った「テキスト」 に差し替える必要があります。

名前を変更の対象を新しいテキストに差し替え

「名前を変更」の対象差し替えを忘れて「あれ?ヘッダーが入ってない?」と一周まわって気づきました。前後にアクションを挿入したときは、その出力を使う後続アクションが古い変数のままになっていないか、必ず見直すクセをつけておきたいです。

手順7:ファイル名を「睡眠_」に変えて保存

「名前を変更」アクションで、ファイル名の先頭の 歩数_ の部分だけ 睡眠_ に書き換えます。日付の変数(青いタイル)と .csv はそのままで、睡眠_[日付]-[調整済みの日付].csv という形にします。

最後に「ファイルを保存」アクションが置かれていれば完成です。

手順8:実行してCSVを確認する

右上の再生ボタンで実行 → 開始日と終了日を選びます。睡眠データは1日でも何十行にもなるので、まずは 直近2〜3日 くらいの短い範囲で試すのがおすすめです。

実際に出力されたCSVがこちらです。

出力された睡眠CSV(4/23-4/27、3列)

ヘッダーが先頭に入っていて、日付が 2026-04-23 00:08:03 形式に揃っていて、3列目に「コア」「深い」「レム」「覚醒」と日本語で睡眠ステージが入っています。狙ったとおりの形になりました。

出力された「値」の意味

iOS 16以降、Apple Watchで取った睡眠は次のラベルで返ってきます。

値(日本語ラベル) 意味
コア コア睡眠(軽い眠り)
深い 深い睡眠
レム レム睡眠
覚醒 睡眠中の一時的な覚醒

事前に調べた段階では HKCategoryValueSleepAnalysisAsleepCore のような英語の内部値が出ると思っていましたが、最新のOSでは自動で日本語化された状態で取れていました。これは思いのほか嬉しい誤算で、CSVをそのまま読んで意味が分かります。

Apple Watchを着けて寝ていない場合は、これらのステージは出ず「ベッドにいた時間」だけが記録されます。逆に着けて寝ていれば4種類のステージが詳細に取れます。私はApple Watchを着けて寝ているので4種類すべて出ています。

CSVを眺めていて気づいたのは、夜中の「覚醒」区間がやけに細かく挟まっていることでした。これはおそらく、夜間授乳で起きている時間です。眠い目をこすりながら淡々とこどもにミルクをあげている毎晩の頑張りが、こうして数行の区間データとして淡々と可視化されているのを見ると、なんだかちょっと労われた気がしました。数字にしてもらえると、自分でも自分のことを少し褒められます。

詰まったポイントと教訓

詰まり 原因 対処
種類変更後に単位・グループ分けが消えた カテゴリ型データには元々ない項目 仕様なので気にせず進める
「繰り返し項目」が変数候補に出ない 追加したアクションがループ外にある アクションをループ内にドラッグしてから設定
「フォーマット済みの日付」が2つあって区別できない 同名の変数が2つできる テキスト挿入時に長押しで名前を変更
名前を変更しても元に戻ってしまう Enter で確定していなかった 入力後に必ず Enter(または完了)をタップ
ヘッダー行を足したのにCSVに反映されない 「名前を変更」の入力が古いまま 後続アクションの入力変数を新しいものに差し替える

ショートカットでアクションを 間に挿入したとき は、後続のアクションが古い変数を参照したままになっていないか、ひとまわりチェックする習慣がついた気がします。

発展:合計睡眠時間を計算したい

ここまでで「区間データの一覧」はCSVに出せましたが、本当に知りたいのは 「昨日は何時間寝たのか」 だったりします。区間の長さを足し算する処理がもうひとステップ必要になります。

ショートカットだけで合計睡眠時間を計算するなら、ループ内で各区間の 「終了日 − 開始日」 を秒数として計算し、それをどこかに溜めて、ループ外で時間に変換する流れになります。「日付の差を取得」「数式」「時間を加算」 あたりを組み合わせれば作れますが、ショートカット内で時間計算を組むのはかなりひとクセあって、ブロックが見るからに複雑になりました。

そこで割り切って、集計はCSVを書き出した先で別ツールに任せる ことにしました。具体的には次の3パターンが使えます。

  1. Numbersでピボット集計:CSVをNumbersで開いて、日付ごとに区間の長さを合計するピボットを組む
  2. PythonでCSVを読み込みpandas で読んで (終了日 - 開始日).sum() を1日ごとに集計
  3. AIに丸投げ:ChatGPTやClaudeにCSVを貼り付けて「日ごとの合計睡眠時間と、レム睡眠の割合を出して」と頼む

私はいま3番のAI丸投げを試しています。「最近の睡眠の傾向と、改善したほうがよい点を指摘して」と添えると、グラフ化までしてくれることもあって、なかなか実用的です。ショートカット側は データを取り出すところまで に責任を絞り、集計と分析はCSV以降に任せる、という分担にすると詰まりにくいです。

まとめ

  • iPhoneの標準ショートカットだけで、睡眠データを期間指定でCSV化できました
  • 歩数ショートカットを複製して、種類変更・終了日取得追加・日付整形+ヘッダー追加の3点を改造する形が早かったです
  • 同名の変数(フォーマット済みの日付が2つ)はテキスト挿入時に長押しで改名するのが確実です
  • 値はApple Watchありなら「コア/深い/レム/覚醒」の日本語ラベルで取れて、そのまま読んでわかる形になります
  • 合計睡眠時間の計算はショートカット内で組むより、CSVを書き出してNumbersやAIに渡すほうがシンプルです

睡眠データはApple Watchの有無で出方がかなり変わるので、まずは直近数日で試してみるのがおすすめです。AIに食べさせて寝不足にダメ出ししてもらう次のステップは、別記事で書く予定です。

コメント

タイトルとURLをコピーしました