健康DX進捗確認
今回も健康DXツール利用者の進捗状況と課題を抽出します。前回から1か月程度経過しています。

- 体重: 継続して1kg/月ペースで減少中。比較的順調。
- 体脂肪率: 途中で体組成計を切り替えて数値が変化している。
- 歩数: 8,000歩前後で少し下回る日が増えている。
- 睡眠: 継続して5h未満が多く、少な目。
前回、各グラフに目標値を設定し、体重には移動平均を追加されており、目標を目安として分かりやすくなり、移動平均で日々の数値に一喜一憂しない意識も変わってきています。
健康DXツールとしての良い点と課題
前回の取り組みで実施したことを含めて良い点と課題を実感としてまとめます。
- 良い点
- ボタンで食事を入力できる操作性の改善は、日々の入力を軽減できている。
- 各グラフの目標値は、日々の目安として目標が分かりやすい。
- 体重の加重平均追加で、日々の体重の増減に一喜一憂しにくくなった。
- 課題
- スマホ上にすでにある値の再入力(歩数など)は負担
今回もトレーナーと相談しつつ改善を進めますが、今回は健康DXでのダイエットのアドバイスは割愛します。比較的安定して進んでもおり、トレーナーも現状のまま続けることを推奨しているためです。今回は主にツールの改善を進めていきます。
健康DXツールの改善
今回は「スマホ上にすでにある値の再入力」の改善を考えます。例えば歩数や睡眠時間は、スマートウォッチやスマホ自身で取得され、Androidスマホの場合は、Google Health Connectに蓄積されています。機能構成を図に示します。

その値を、FitbitやGoogle Fitのアプリで値を確認し、Appsheetに転記し、Appsheetを介して最終的にGoogle Spreadsheetに記録しています。ここの転記作業の軽減を行いたいと考えています。具体的には下の図のようにスマホ内に新たなアプリを開発し、そのアプリがHealth Connectからデータを取得し、Google Apps Scriptを経由してSpreadsheetに値を登録するようにします。

今回の対策は、この対策ルートの構築を行います。ただし、今回はこのルート構築にはかなりの苦難があり、生成AIを活用し改善を進めてきましたのでその問題と対処をまとめて行きます。
第一の壁:ビルドと依存関係の構造理解
今回、初めてのAndroidアプリの開発(Android Studio)、初めてのKotlin、Gradleと初めて尽くしでした。ChatGPTを使ってプログラム開発も進めていきますが、あまりにも基礎知識が足りずビルドができるまでかなりの時間を要しました。Health Connectヘアクセスするためのソースと依存関係について出力されたものをAndroid Studioの最もシンプルな画面アプリにくみこんだものの、コンパイルを通せずはまりましたが、主に以下のような問題でした。
- SDKバージョンの指定 (compileSdk, targetSdk, minsdk)
- 依存関係を最小構成に整理
- Gradle Syncを行わないことによる未反映状態
1.SDKバージョンの指定 (compileSdk, targetSdk, minsdk)
メインのソースは MainActivity.kt、依存関係は build.gradle.kts に記載し、Android Studio でビルド、ビルドエラーをChatGPTに渡して改善を繰り返します。上記2つは3つのSDKバージョンを指定することで対応が可能でした。
- compilesdk = 36 #コンパイル時に利用するSDKバージョン
- targetsdk = 34 #実行時のSDKバージョン、ビルドエラーを解消するためにcompilesdkより少し下げた
- minsdk = 26 #下限の動作保証SDKバージョン、今回はHealth Connectが利用可能なバージョンを指定
細かくバージョンを指定することが大事でした。しかし、各値の根拠を細かく追及はしていません。ChatGPTに考えてもらい、ビルドが通らない為、targetsdkを下げたりとした次第です。
2.依存関係を最小構成に整理
こちらもChatGPTとの試行錯誤です。最初に生成されたソースには含まれていたimplimentation内で衝突が発生したようです。改めて別のチャットにソースを渡してみてもらうと以下の2つに結果絞り込まれました。
implementation("androidx.health.connect:connect-client:1.1.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
1行目はヘルスコネクトのライブラリ、2行目はGAS(Google Apps Script)の呼び出しに利用するライブラリです。
3.Gradle Syncを行わないことによる未反映状態
こちらは不慣れにより気づかなかったのですが、Gradleの定義を更新すれば随時依存関係は最新化され、必要なライブラリが読み込まれると考えていました。しかし “Gradle sync” の操作が必要でした。
Android Studioでは、以下の画面操作で “Gradle sync” が可能です。
- 画面右上の象のアイコン “Sync Project with Gradle Files” をクリック
- 又は “CTRL + SHIFT + O”
第二の壁:実行環境と権限モデルの理解不足
こちらも不慣れと生成AI依存により、知識不足が招いたこともあるのですが、生成AIが出力したコードはそのまま動くというより動かして障害を解消して動かす必要がありました。当然、分かっていたつもりでしたが、いろいろとてこずりました。
特に、Health Connectが動いているか判定するところは、SDKバージョンによって数字の意味が違うところには気が付かず、しばらくHealth Connectが使えないと勘違いしていたことです。最終的にはHealth Connectの判定は以下のようになりました。
val status = HealthConnectClient.getSdkStatus(this, HC_PROVIDER)
val statusLabel = when (status) {
HealthConnectClient.SDK_AVAILABLE -> "SDK_AVAILABLE"
HealthConnectClient.SDK_UNAVAILABLE -> "SDK_UNAVAILABLE"
HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED -> "SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED"
else -> "UNKNOWN($status)"
}
Log.d("HC", "Health Connect SDK status = $statusLabel ($status)")
これにて Health Connectが利用可能な状態であると分かり、先に進むことが判断できました。
第三の壁:非同期処理とネットワーク設計
知らないと気付かないことは多々あります。例えば 「ボタン操作の延長で通信をしてはならない。」 というようなルールもあるとのことで、こちらもChatGPTで最初に生成されたソースではボタン操作の延長での通信としていましたが、上に書いたような問題が指摘され、さらにChatGPTで対処法を確認し改善しました。
具体的には、以下の3点の対処を行いました。
- post処理を suspend 関数へ変更
- withContext(Dispatchers.IO) でラップ
- Coroutineのimport追加
書くと簡単なのですが、自身では解決には至ることはなく、ChatGPTがなければ改善はできないものでした。もう少し最初から問題が出ないようにしてくれればと思うものの、解決ができ満足です。
Google Apps Scriptを追加し、Spreadsheetを更新
こちらも生成AIでソースを生成し、登録を行いました。Spreadsheetの認識する処理がなくその点を指摘すると追加してくれ、意外とスムーズに実行できました。ソースの行数は20~30行程度のシンプルなものです。

実行すると、A列のdate、B列のstepsのところに数値が記録されました。F列を見ると4日ほど経過して2回実行していることが分かると思います。その都度、過去3日分のデータを集計して記録しています。
最後に
無事、Health Connectと連携し、Google Spreadseetにデータの登録はできましたが、実はこのデータは間違っています。実際よりかなり大きな数字になっていますし、体重、体脂肪率、睡眠時間がとれていいないのでさらに改善が必要です。祖のあたりは次の機会に対応を進めたいと考えています。
今回は、一連の処理の穴あけができてことを良しとして、終わりたいと思います。