前回のおさらい
前回、新たなスマホアプリを作り、Google HealthConnectから情報を取得し、Google Apps Scriptを介してGoogle SpreadSheetへ記載するルートを開通しました。以下の赤いルートです。

但し、現在登録できたのは以下のような表で歩数も実際よりはかなり多く、他の項目が空欄になっています。おそらく収集した数値がすべてstepsに偏っていたり、余分な数字が計上されていたりとすると考えられます。

健康DXツールの改善
今回、前述のトラブルを解消し、歩数、体重、体脂肪率、睡眠時間をHealthConnectから正しく収集し、SpreadSheetへ記載できるようにする。その他、以下のような改善も行う。
- 計測値の問題確認と改善
- UI開発
最終的には、以下の図のようにもともと手でデータを入力していた左側の2か所(Appsheet, Google Fit)特にAppsheetにはすべての項目を手入力していました。Google FitやFitbitにも体重や体脂肪を個別に入力し、それぞれのアプリ用に使っています。それを改め、HealthConnectからの取得とアプリ上での入力に集約し、データ入力負担を軽減することを目的としています。

第一段階: 問題の原因把握
問題: 複数種類のデータ発生源(Origin)のデータを集計していた。
前回歩数だけ実感を上回るデータが書かれていた問題は、複数のデータ発生源(Origin)のデータを合算していたことでした。
私の環境はスマートウォッチ(Fitbit)とスマートフォン本体の両方で歩数が計測されている状態であり、この場合、データ発生源(Origin)別にHealthConnect上に記録されている。前回の結果は、複数のデータ発生源(Origin)のデータを合計したことによって実態より大きい数字となっていた。
Android Studioに自身のスマートフォンをつないでデバッグ機能を使ってみてみると、Fitbit、android.apps.fitness、androidの3種類のデータ発生源(Origin)があることが分かりました。androidで始まる二つはどちらも同じ値でHealthConnectとAndroid OSとしてとの2つだと想像します。

HealthConnectに書き込み権限のあるスマートウォッチや歩数計などがあるとデータ発生源(Origin)が増える為、必要に応じてどれかを選択する必要があります。今回の場合は、専用デバイスを優先するとしてFitbitを採用したいが、もう一つ課題がありました。以下の別日のデータを見てください。

この日はFitbitの値がかなり小さく見えますが、実は、スマートウォッチの電源がきれて計測できない時間があったためです。私のデバイスは数日に一度充電を必要とする為、充電を忘れると日中に電池がきれて計測できなくなります。また、充電中も置きっぱなしの為、計測できない状態となります。その間は、スマートフォン本体の計測値を優先したくなります。
ただこの6108歩も実感よりかなり小さい、実はトレッドミル上で歩いたり、走ったりする場合、私はスマートフォンを置いていたため、歩数か計上されていないこともあり、その点も課題です。
解決策: Originの優先度を決める、手入力補正画面を設ける。
こられの問題については、以下の仕様で対応を行うことにします。
- (仕様1) 基本、複数のOriginの内、日単位に最も大きな値を計測したOriginを採用する。
- (仕様2) 本アプリでもHealthConnectに直接データ入力を可能とし、新たなOriginでデータを追加する。※いずれのOriginのデータもおかしい時の補正目的。
その他の問題についても、まずは仕様を明確にし、それらをバックログとして抜け漏れなく開発を進めることとする。
Tips: ChatGPTにバックログを管理してもらう
対応すべき内容の管理としてバックログをChatGPTに管理してもらいます。私の場合は以下のようなプロンプトで管理と状況確認をしています。
バックログへの追加
この項目をバックログとして管理してください。
・複数のOriginの内、日単位に最も大きな値を計測したOriginを採用する。
・本アプリでもHealthConnectに直接データ入力を可能とし、新たなOriginでデータを追加する。
バックログの状況確認(完了、未着手、保留などのステータス単位にバックログを表示)
現在のバックログの状況をステータス毎に示してください。
次の取り組みを検討(残っているバックログのなかで何に手を出すか示してくれる)
次に手を付けるべきタスクはどれですか?
相変わらず使っているプロンプトはシンプルに語りかけているような使い方ですが、おおよそ期待通り頑張ってくれています。
第二段階: 値の取り込み方
第一段階で歩数にOrigin毎に値があることが分かり、他の項目について改めて値を見つつ取り込み方を考えます。
問題: 項目別の特徴と解決すべき課題
| 項目 | Origin | セッション有無 | 課題(後述) |
| 歩数 | Fitbit, 本体 | あり | (前述) 複数Origin、手入力 |
| 睡眠時間 | Fitbit | あり | 日の区切り、複数セッション |
| 体重 | Google Fit(手入力) | なし | 手入力 |
| 体脂肪率 | Google Fit(手入力) | なし | 手入力、小数点入力 |
前述の歩数のようにデバッグログを見ると上のような特徴で特に「セッション有無」や課題に書いた内容への対応が必要でした。以下に課題について補足します。
- セッション有無: 歩数や睡眠時間は、値だけでなく07:00-09:00などの時間の開始終了と共に記載されており、これをセッションと称します。歩いたり、休んだり、寝たり、起きたり(例えばトイレに起きるなど)、昼寝だったりで日中に何度も区切りが入ります。複数のセッションの値を合算する必要があります。体重や体脂肪は日時を指定し日に何度も記録はできますが、日ごとの結果を集めたい目的では最新の値を集めればよいため簡単です。
- 複数Origin: 前述の歩数のところで記載したデータ発生源(Origin)毎に値が記録される為、どの値を採用するか選択が必要です。
- 手入力: 私の環境では自動的に記録されない体重と体脂肪率の入力手段として、電池が切れたり充電中は記録できない、歩数と睡眠時間の入力をする手段が必要です。
- 日の区切り: 睡眠時間をどこで区切るか。夜10:00に寝て朝6:00に起きる場合をどう区切るかの問題。前日の睡眠時間として8時間とするか、0時で区切って2時間と6時間と日を分けて記録するか。
- 小数点入力: 体重と体脂肪率はGoogle Fitで手入力も可能でHealthConnectにも記録されるのですが、体脂肪率は整数値(例22%)しか入力できず、少数点を含む値(例21.8%)を入力したかった為、入力手段が必要です。
解決策: 値毎の特徴を踏まえデータの取り込み方を検討
前述の仕様1,2も改めて記載しています。
- (仕様1) 基本、複数のOriginの内、日単位に最も大きな値を計測したOriginを採用する。
- (仕様2) 本アプリでもHealthConnectに直接データ入力を可能とし、新たなOriginでデータを追加する。
- (仕様3) 歩数と睡眠は、複数セッションの値を合計を行う。
- (仕様4) 睡眠時間は、区切りの時刻を決めて前日に値を集計できるようにする。例6:00区切り等。
- (仕様5) 手入力時、体脂肪率は少数点を含むデータの入力を可能とする。
- (仕様6) 手入力の値を最優先とする為、Originの優先度を見直す。
- (仕様7) 睡眠と歩数を入力時は、セッション情報を作らずHealthConnectには入力せず一時的なデータとして本体に管理する。
仕様7についてはセッション付きの情報作りが複雑になる為、日に何歩歩いた、日に何時間寝たかを知りたい程度ですので、セッション情報を作らない方針としました。
実際の開発は、Android Studioでデバッグログを見ながら仕様を理解し、ChatGPTでソースを出力しつつ、またAndroid Studioでソースを改変しリビルド、スマホと接続しデバッグの繰り返しで徐々に改善をしていきました。最終的には以下のように値をSpreadsheetに記録するところまでたどりつきました。

今回、バックログをChatGPTで管理しながら部分的に作っていく方法は、現状の把握と何をするかを明確にすることができ進めやすいと感じました。ただ、会話にソースやログを貼ったり、ソースを生成してもらったりと情報量が多くなるにつれ、対話がどんどん重たくなってきているのは課題を感じています。今時のAIエージェントを使った方法ではもっとうまくできるのか今後トライしてみたいと思っています。
第三段階: UI, GAS作り込み
ユーザーインターフェイス(UI)は、主に以下の機能を作りました。動作確認用の物から必要な機能を随時足しながら改善を加えた結果です。
| 画面 | 機能 |
| 初期画面 | GAS通信設定と動作確認 |
| メイン画面 | 日々のメイン画面、同期機能、入力や設定の呼び出し |
| 入力画面 | 体重、体脂肪率、歩数、睡眠時間を必要に応じて入力する機能 |
| 設定画面 | GAS通信機能の設定、睡眠時間の区切り時刻等 |
メイン画面は、現在以下のような形です。起動直後は、HealthConnect上のデータの読み書きに関する設定が出たのち、初期画面でGAS通信に必要な項目の設定を行います。以下のような項目です。
・GAS URL
・シークレット(合言葉)
・スプレッドシートID
・シート名
相対するGASのスクリプトも生成し、GASで設定を行います。接続テストがうまく行ったら右のメイン画面が表示され、表示期間(3,7,14日)に応じてデータが表示されます。
補正入力ボタンで4項目の入力画面が表示され、日時を決めて必要な箇所だけ入力を行います。手入力した個所は、下線と*をつけて補正値であることを分かるようにしています。

体重と体脂肪率は毎日入力する為、すべて補正値となります。3/12の歩数についてはFitbitの電池も切れ、スマホを置いていたこともあり凡その値を入れています。
最後に
今回作ったスマホアプリHc2Spread(HealthConnect to Spreadsheet)を使ってFitbitやGoogle Fitから入ってくる歩数、睡眠時間を取得。入ってこない体重と体脂肪率は、本アプリからHealthConnectに書き込み。値がおかしい時は、本アプリで変更を加えてGASを介してSpreadsheetにデータを更新できるようになりました。

Appsheet上のアプリが不要にできればよかったのですが、グラフでの可視化など優れているので入力項目だけ削減し利用を継続しています。果たして改善できているのかは難しいところですが、生成AIを使ってHealthConnectに接続しデータを活用しやすいようにSpreadsheetに格納できるようになったのはかなり満足です。
今後、さらに効果を高められるように「自動化」などにも取り組んでいきたいと思います。