作成日:2024年12月16日
iPhoneとFileMakerGoでウォーキング履歴を記録する


どうも、にゃん太です
健康が気になるお年頃なのでウォーキングを始めました
途中で辞めてしまわない様、ウォーキング記録アプリを自作してモチベーションを維持しましょう
今回のメモは、簡単なウォーキング記録アプリの開発メモを書いていきます
使用する機能
自作するといっても、歩数の取得からするのは無理があります
iPhoneでは歩数を自動記録してくれますので、それを取得して記録/表示していく事にしましょう
取得にはGetSensor関数を使用します
ウォーキング記録に関連する取得可能な値は次の通りです
- stepCount
- 指定した時間内にデバイスによって検出された歩数が取得できます
- stepDistance
- 指定した時間内にユーザが移動した推定距離が取得できます
- stepFloorsUp
- 指定した時間内にユーザが上ったおおよその階数が取得できます
- stepFloorsDown
- 指定した時間内にユーザが下ったおおよその階数が取得できます
時間指定で取得できるので「今日の記録」とか「3時間ごとの記録」といった処理が出来そうです
画面構成
では、どんな画面を作成していくかを考えます
- 起動画面
-
当日のその時点での歩数を表示します
また、各画面へ遷移するボタンも配置します
- 時間帯表示
-
当日の時間帯ごとの歩数をグラフ表示します
- 週間表示
-
1週間の歩数を日別グラフで表示します
週はボタンで切り替えられるようにします
- 月間表示
-
1か月の歩数を日別グラフで表示します
月はボタンで切り替えられるようにします
あまりあれこれ作ると大変なので、この程度にします
レイアウト
画面構成が決まったので、レイアウトを作成します
起動画面イメージ

時間帯表示画面イメージ

週間表示画面イメージ

月間表示画面イメージ

若干の手抜き感がありますが、この程度でとりあえず良しとします
テーブル
テーブル設計ですが、今回のアプリではデータは常にiPhone側から取得してくるので、保持しません
画面表示用にグローバルフィールドだけ作成します

スクリプト
最後に、割り当てるスクリプトを設定していきます
当日歩数の表示
起動時に当日の歩数を取得して表示させるスクリプトです
今日の歩数
# ################################################## # 今日の歩数(OnFirstWindowOpen および 戻るボタンに割り当て) # ################################################## レイアウト切り替え [「TOP」; アニメーション:なし] ツールバーの表示切り替え [隠す] メニューバーの表示切り替え [ロック:オフ; 隠す] 変数の設定 [$time; 値: GetAsNumber ( Get ( 時刻 ) )] フィールド設定 [walkingLog::stepCount; GetSensor ( "stepCount"; $time )]
日計表示
TOP画面の日計ボタンから実行するスクリプトで、3時間ごとの歩数をグラフ表示させます
日計
# ################################################## # 本日の3時間ごとの歩数をグラフ表示 # ################################################## レイアウト切り替え [「dailyLog」; アニメーション:なし] # 0時から現在までの歩数 変数を設定 [$time; 値: GetAsNumber ( Get ( 時刻 ) )] 変数を設定 [$today; 値: GetSensor ( "stepCount"; $time )] # 3時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after3oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after3oclock; 値: 0] End If # 6時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after6oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after6oclock; 値: 0] End If # 9時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after9oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after9oclock; 値: 0] End If # 12時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after12oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after12oclock; 値: 0] End If # 15時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after15oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after15oclock; 値: 0] End If # 18時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after18oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after18oclock; 値: 0] End If # 21時から現在までの歩数 変数を設定 [$time; 値: $time - 10800] If [$time > 0] 変数を設定 [$after21oclock; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$after21oclock; 値: 0] End If # 時間帯ごとの歩数を計算してグラフ用フィールドに格納 フィールド設定 [walkingLog::graphValue; $today - $after3oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after3oclock - $after6oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after6oclock - $after9oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after9oclock - $after12oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after12oclock - $after15oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after15oclock - $after18oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after18oclock - $after21oclock] フィールド設定 [walkingLog::graphValue; walkingLog::graphValue & ¶ & $after21oclock] フィールド設定 [walkingLog::graphTitle; "3時¶6時¶9時¶12時¶15時¶18時¶21時¶24時"]
週計
TOP画面の週計ボタンから実行するスクリプトで、1週間の歩数を日別でグラフ表示させます
週計
# ################################################## # 1週間の歩数を日別でグラフ表示 # ################################################## レイアウト切り替え [「weeklyLog」; アニメーション:なし] # 今日の日付 変数を設定 [$today; 値: Get ( 日付 )] # 今日の曜日を取得 変数を設定 [$曜日; 値: DayOfWeek ( $today )] # 直前の日曜日を開始日に設定 フィールド設定 [walkingLog::weekStart; Get ( 日付 ) - $曜日 + 1] #開始日から見た次の土曜日を最終日に設定 フィールド設定 [walkingLog::weekEnd; walkingLog::weekStart + 6] スクリプト実行 [指定:一覧から; 「週計グラフ描画」; 引数: ]
前週を表示
週計画面の「<」ボタンから実行するスクリプトで、表示対象期間を1週間前に切り替えます
前週
# ################################################## # 期間を1週間前にする # ################################################## フィールド設定 [walkingLog::weekStart; walkingLog::weekStart - 7] フィールド設定 [walkingLog::weekEnd; walkingLog::weekStart + 6] スクリプト実行 [指定:一覧から; 「週計グラフ描画」; 引数: ]
翌週を表示
週計画面の「>」ボタンから実行するスクリプトで、表示対象期間を1週間後に切り替えます
翌週
# ################################################## # 期間を1週間後にする # ################################################## フィールド設定 [walkingLog::weekStart; walkingLog::weekStart + 7] フィールド設定 [walkingLog::weekEnd; walkingLog::weekStart + 6] スクリプト実行 [指定:一覧から; 「週計グラフ描画」; 引数: ]
週計グラフ描画処理
週計画面で、指定された期間を日別でグラフ表示する処理です
週計グラフ描画
# ################################################## # 指定期間の歩数を日別でグラフ表示 # ################################################## # グラフ用フィールドの初期化 フィールド設定 [walkingLog::graphValue; ""] # 1日の秒数 変数を設定 [$oneDaySec; 値: 24 * 60 * 60] # 今日の経過秒数 変数を設定 [$time; 値: GetAsNumber ( Get ( 時刻 ) )] # 今日の日付 変数を設定 [$today; 値: Get ( 日付 )] # 最終日の翌日から現在までの秒数 変数を設定 [$afterLastDaySec; 値: ( $today - walkingLog::weekEnd - 1 ) * oneDaySec + $time] # 最終日の翌日以降の歩数 If [$afterLastDay > 0] 変数を設定 [$w[8]; 値: GetSensor ( "stepCount"; $afterLastDaySec )] Else 変数を設定 [$w[8]; 値: 0] End If # 歩数の取得 変数を設定 [$i; 値: 7] Loop [フラッシュ:常に] 変数を設定 [$time; 値: $afterLastDaySec + (8 - $i) * $oneDaySec] If [$time > 0] 変数を設定 [$w[$i]; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$w[$i]; 値: 0] End If 変数を設定 [$i; 値: $i - 1] Exit Loop If [$i < 1] End Loop # 日ごとの歩数を計算してグラフ用フィールドに格納 変数を設定 [$i; 値: 1] Loop [フラッシュ:常に] フィールド設定 [walkingLog::graphValue; If ( walkingLog::graphValue = ""; ""; walkingLog::graphValue & "¶" ) & $w[$i] - $w[$i + 1]] 変数を設定 [$i; 値: $i + 1] Exit Loop If [$i > 7] End Loop フィールド設定 [walkingLog::graphTitle; "日¶月¶火¶水¶木¶金¶土"] レイアウト切り替え [「weeklyLog」; アニメーション:なし]
月計
TOP画面の月計ボタンから実行するスクリプトで、1ヶ月の歩数を日別でグラフ表示させます
月計
# ################################################## # 1ヶ月の歩数を日別でグラフ表示 # ################################################## レイアウト切り替え [「monthlyLog」; アニメーション:なし] # 今日の日付 変数を設定 [$today; 値: Get ( 日付 )] # 年月を設定 フィールド設定 [walkingLog::month; Year ( Get ( 日付 ) ) & "年" & Right ( "00" & Month ( Get ( 日付 ) ); 2 ) & "月"] スクリプト実行 [指定:一覧から: 「月計グラフ描画」; 引数: ]
前月を表示
月計画面の「<」ボタンから実行するスクリプトで、表示対象期間を1ヶ月前に切り替えます
前月
# ################################################## # 期間を1ヶ月前にする # ################################################## 変数を設定 [$target; 値: Date ( Middle ( walkingLog::month; 6; 2 ) - 1; 1; Left ( walkingLog::month; 4 ) )] フィールド設定 [walkingLog::month; Year ( $target ) & "年" & Right ( "00" & Month ( $target ); 2 ) & "月"] スクリプト実行 [指定:一覧から; 「月計グラフ描画」: 引数: ]
翌月を表示
月計画面の「>」ボタンから実行するスクリプトで、表示対象期間を1ヶ月後に切り替えます
翌月
# ################################################## # 期間を1ヶ月後にする # ################################################## 変数を設定 [$target; 値: Date ( Middle ( walkingLog::month; 6; 2 ) + 1; 1; Left ( walkingLog::month; 4 ) )] フィールド設定 [walkingLog::month; Year ( $target ) & "年" & Right ( "00" & Month ( $target ); 2 ) & "月"] スクリプト実行 [指定:一覧から; 「月計グラフ描画」: 引数: ]
月計グラフ描画処理
月計画面で、指定された月を日別でグラフ表示する処理です
スクリプト
# ################################################## # 指定月の歩数を日別でグラフ表示 # ################################################## # グラフ用フィールドの初期化 フィールド設定 [walkingLog::graphValue; ""] フィールド設定 [walkingLog::graphTitle; ""] # 1日の秒数 変数を設定 [$oneDaySec; 値: 24 * 60 * 60] # 今日の経過秒数 変数を設定 [$time; 値: GetAsNumber ( Get ( 時刻 ) )] # 今日の日付 変数を設定 [$today; 値: Get ( 日付 )] # 指定月の月初、月末 変数を設定 [$月初; 値: Date ( Middle ( walkingLog::month; 6; 2 ); 1; Left (walkingLog::month; 4 ) )] 変数を設定 [$月末; 値: Date ( Middle ( walkingLog::month; 6; 2 ) + 1; 0; Left ( walkingLog::month; 4 ) )] #指定月の日数 変数を設定 [$lastDay; 値: Day ( $月末 )] # 月末の翌日から現在までの秒数 変数を設定 [$afterLastDay; 値: ( $today - $月末 - 1 ) * $oneDaySec + $time] # 月末の翌日以降の歩数 If [$afterLastDay > 0] 変数を設定 [$w[$lastDay]; 値: GetSensor ( "stepCount"; $afterLastDay )] Else 変数を設定 [$w[$lastDay]; 値: 0] End If # 歩数の取得 変数を設定 [$i; 値: $lastDay] Loop [フラッシュ:常に] 変数を設定 [$time; 値: $afterLastDay + ($lastDay - $i + 1) * 24 * 60 * 60] If [$time > 0] 変数を設定 [$w[$i]; 値: GetSensor ( "stepCount"; $time )] Else 変数を設定 [$w[$i]; 値: 0] End If 変数を設定 [$i; 値: $i - 1] Exit Loop If [$i < 1] End Loop # 日ごとの歩数を計算してグラフ用フィールドに格納 変数を設定 [$i; 値: $lastDay] Loop [フラッシュ:常に] フィールド設定 [walkingLog::graphValue; If ( walkingLog::graphValue = ""; ""; walkingLog::graphValue & "¶" ) & $w[$i] - $w[$i + 1]] フィールド設定 [walkingLog::graphTitle; IIf ( IsEmpty ( walkingLog::graphTitle ); ""; walkingLog::graphTitle & "¶" ) & $i] 変数を設定 [$i; 値: $i + 1] Exit Loop If [$i < 1] End Loop レイアウト切り替え [「monthlyLog」; アニメーション:なし]
このスクリプトをボタン等に設定したら完成です
サンプルファイル
これでウォーキング記録アプリは完成です
これぐらい手間をかけたなら、ウォーキングも途中で止めにくくなる……といいですね
試作品はこちらからダウンロードできますので、ご興味がありましたらどうぞ

以上で今日のメモ書きは終了です
内容はいかがでしたか?
もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください