当初 GAS を使って TANITA HealthPlanet のデータを GoogleFit に自動連携してみた
を基に Google Fit へ反映させようとしてみたが、
時刻等で怪しげな挙動があるために修正しようとしてたどり着いたのがこの Hp2Fit
そのままでも動きそうだが、いくつか気になる点を修正・改変
Health Planet から毎回最大3ヶ月のヘルスデータを取得して反映させるのは無駄なため、 取得する最大日数を指定できるようにした
props.gs
のHEALTHDATA_PERIOD
で取得・反映したい日数を指定1
を指定すると昨日からのデータのみ取得反映0
では当日分のみ- 従来と同様に最大限のデータを取得・反映したい場合には
null
を指定
props.gs
のREGIST_GOOGLE_FIT
とREGIST_FITBIT
で指定
私自身は Fitbit を使っていないこともあり
props.gs.template
のデフォルトでは Google Fit のみ反映するようになっている
Health Planet から取得できるモデル名は数字のコード
のため、モデル名への変換テーブル (models.gs
の healthPlanetModels
) を基に変換
ただ、公開されている情報が古いため、最近の機種はテーブルに載っていない
テーブル上に無い機種では Health Planet から返る数字のコードをモデル名として扱う
数字のコードでも動作に影響は無いが、名前にしたい場合にはテーブルに使用している機種名を追記する
healthplanet.gs
の listHPHelthData()
を実行すればコンソールログに以下のようにモデルコード番号が表示されるのでそれを基にする
Please add "01000XXX": "YourModelName" to healthPlanetModels{} in models.gs
最新のヘルスデータの情報を基に決めているので、 機種変更した場合には機種変更前のデータも機種変更後のデータとして取り扱う (実際には切り替え前の数日間分は新旧両方の機種で同じデータが登録された状態になる)
正直なところ実動作には影響がない自己満足的な改善
- 前述 Health Planet 上のヘルスデータを表示する
listHPHelthData()
を追加 - コード内に埋め込んでいた決め打ちのパラメタを
props.gs
内で指定 - Google Fit のデータ処理に関する開発用ツール群を別ファイル
googlefit-devel.gs
に分離・整理 - 時刻形式変換のコードを整理
- いくつかの誤記等を修正
元からあったツール群だが、使い方がよくわからず少し試行錯誤したので参考までに…
Google Fit に登録した情報を削除したい場合には googlefit-devel.gs
内のツール(関数)を使用する
新しい機種のモデル名をテーブルに反映させる前のデータを消す等の用途にも使える
- まず
listGFDataSource()
でデータソースをリストする - データソースのリストを基に冒頭の
GF_DATA_STREAM_ID_WEIGHT
やGF_DATA_STREAM_ID_FAT
を修正する setDataSourceIdToProperty()
でそれを反映させる- 削除したいデータが体重なのか脂肪率なのかにより冒頭近傍の
GF_REMOVE_DATA_NAME
を指定する removeGFHealthData()
でヘルスデータを削除するremoveGFDataSource()
でデータソースを削除するlistGFDataSource()
でデータソースが消えたことを確認
実際には run() を一度実行すれば 2 や 3 のステップは不要なこともある
googleFit.weight
や googleFit.fat
の扱い方はちょっと特殊
- 導入直後の認証部分はわかりづらいので、もうちょっとなんとかしたい
- もうちょっとオブジェクト志向に変えたい
まぁ、今の規模だったらそのままでもいいかもしれない - いずれ Google Fit から Health Connect に移行するという話もあるので、どうすべきか検討が必要になりそう
以下はオリジナルのドキュメント
HealthPlanetの体重と体脂肪率を、Google fit/Fitbitに転送するツール。
Google Apps Script(以下 GAS)を使用しているが、GASにはスケジュール機能があるため、
自動で連動される。
- Google Apps Script (googleアカウントがあれば、無料で利用できる。)
- Githubアカウントを持ってなければ作成。
- Githubで、このリポジトリをForkする。
- Google Apps Script GitHub アシスタント(以下、GASアシスタント)をインストール & setup
https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo
https://tonari-it.com/gas-github-assistant-install/ - Apps Scriptのプロジェクトを作成する。プロジェクト名はお好みで。
https://script.google.com/home - ForkしたGithubリポジトリが、 GASアシスタントから見えるようになるので、そのリポジトリで mainブランチを指定して 【↓】アイコンのpullを実行する。
- 本リポジトリにある props.gs.template を、Apps Scriptのプロジェクトに props.gsとしてコピーペースト実施。
- 各種APIに対応するクライアントキーやシークレットを作成する。
[healthplanet] https://www.healthplanet.jp/create_client_id.do
アプリケーションタイプ = Webアプリケーション
[fitbit] https://dev.fitbit.com/apps/new
OAuth 2.0 Application Type = Personal
,Default Access Type = Read & Write
[Google] 複雑なので、以下参照。
https://qiita.com/potstickers/items/8fa8dce3e31efcde078a#googlefit-api-%E3%81%AE%E6%BA%96%E5%82%99 - 上記作成したキー&シークレットをprops.gsに記載する。
- props.gsの SCALE_MODELに体組成計のモデル名を記載する。(間違っても動作に影響ないが、Google Fitのデータベースの名前に使われる。)
- main.gs内のrun()を実行する。
- 起動すると実行ログにHealthPlanet認証用URLが出力されるので、ブラウザでアクセスする
- HealthPlanetのログイン画面が表示されるのでログインする
- HealthPlanetのアクセス許可画面が表示されるのでアクセスを許可する
- Google Driveの「現在、ファイルを開くことができません。」というエラー画面が表示される
- HealthPlanetがGASから引き渡したリダイレクトURLのパラメータ部分をカットしていることが
エラーの原因なので、下記の通りSTATE部分を補う(実行ログからコピー)
誤)https://script.google.com/macros/d/{SCRIPT ID}/usercallback?code={CODE}
正)https://script.google.com/macros/d/{SCRIPT ID}/usercallback?code={CODE}&state={STATE} - Success!と表示されれば登録が完了。HealthPlanetの連携アプリ一覧にツールが表示される
- 続いて実行ログにGoogleFit認証用URLが出力されるので、ブラウザでアクセスする
- 続いて実行ログにFitbit認証用URLが出力されるので、ブラウザでアクセスする
- 画面の指示に従って認証を完了させる
- main.gs内のrun()を実行する。これで、データが送信できていれば、OK。
- Apps Scriptプロジェクトに、トリガー設定がある。 main.gs内のrun() を 1時間毎などに設定する。
お疲れ様でした!!!
- Google Apps Script GitHub アシスタントで、[GitHub assistant] undefined エラー となり pullできない。
以下のページに答えがあった。
https://qiita.com/ryotab22/items/677ab0cd1611062b8ae8
Apps Scriptダッシュボードの設定をオンにする
で解決した。
https://qiita.com/potstickers/items/8fa8dce3e31efcde078a
https://qiita.com/hirotow/items/d7a6384ff85437d94b0a