あすけんの栄養データを、毎日17項目も入力し直すのは続かなかった

Takaは日常のNutrition記録にあすけんを使っている。あすけんにはPFCや摂取栄養素が表示される。一方で、Health #002で扱ったHealth Masterでも、食事を体重、体組成、睡眠、活動と同じ時間軸で見たい。

問題は、あすけんにある数値をHealth Masterへ毎日もう一度入力することだった。保存するNutrition Dataは、日付と17栄養値の18列。kcal、PFC、ミネラル、ビタミン、食物繊維、飽和脂肪、塩分などを含む。正しく入力できても、17項目を毎日再入力する運用は続かなかった。

そこで、あすけんを置き換えるのではなく、すでに使っているAppのOutputをScreenshotとしてCaptureすることにした。

日常操作は、スクショを共有するだけ

実際の操作は次の6ステップで終わる。

  1. あすけんのNutrition画面をScreenshotする。
  2. iPhoneのShare Sheetを開く。
  3. あすけん詳細栄養素登録 を選ぶ。
  4. 今日分 または 昨日分 を選ぶ。
  5. 自動処理を待つ。
  6. 保存結果を確認する。

人がするのは、17個の栄養値を打ち込むことではない。Screenshotを共有し、対象日を選ぶことだけにした。

実際のスクリーンショットにはWeb App URL、Account情報、個人の栄養値、生活パターンを推測できる情報が含まれる可能性があるため、この記事には掲載しない。

Screenshotから保存までの、確認済みの流れ

Asken Screenshot
↓
iOS Share Sheet
↓
Shortcut
↓
横1200pxへResize
↓
Base64
↓
Today / Yesterday
↓
JSON POST
↓
Google Apps Script Web App
↓
Nutrition Extraction
↓
Validation
↓
Health Master Storage
↓
JSON Response

Shortcutは横1200pxへ画像を縮小してBase64化し、today または yesterday を選んでJSONのPOST requestを送る。画像は image_base64 として渡される。実Web App URL、Sheet ID、認証情報はこの記事にも再現Kitにも含めない。

Backendは画像から17栄養値を構造化抽出し、保存前に検証する。必要な値がすべてそろい、数値で、負の値でないことを確認する。欠損や不正値があれば保存せず、JSON errorを返す。同じ日付を再送した場合は、新しい行を増やすのではなく、その日付の既存行を更新する。

成功時は ok、日付、保存行、抽出値などを含むJSON responseを返す。失敗時は ok: false とerrorを返す。これにより、Shortcut側で保存の成否を確認できる。

既存Appを捨てず、OutputをMaster Dataへつなぐ

この仕組みの価値は、あすけんを別のAppで置き換えることではない。食事記録は、すでに日常で使っているAppに残す。そのOutputを低摩擦でCaptureして、自分のMaster Dataへつなぐ。

Nutrition Captureが続くことで、普段の食生活を以前より振り返りやすくなった。その結果を材料に、本人が摂取していたSupplementを棚卸しする次のDecisionにもつながった。ただし、この仕組みや特定の食事が健康状態を改善したと断定するものではない。

自分でも作るなら、Codeを読む前にChappyへ渡す

Generic版のNutrition Screenshot Capture Kitを公開した。Code.gsを一から読んで理解することを、再現の入口にはしない。

まずKitの PROMPT.md をChappyへ渡し、「どこへ保存したいか」を伝える。設定は次の順で進める。

  1. 保存したいNutrition Dataと保存先を決める。
  2. Reproduction Kitと PROMPT.md をChappyへ渡す。
  3. Chappyと一StepずつBackendを設定する。
  4. iPhone Shortcutを作り、共有シートから画像を受け取れるようにする。
  5. Shortcutで画像を横1200pxへResizeし、Base64化する。
  6. today / yesterday を選ぶJSON POSTを設定する。
  7. Synthetic Sampleで、18列Schema・必須項目・エラー表示を先にTestする。
  8. 保存先とResponseを確認してから、自分のScreenshotを1枚ずつTestする。

再現KitのFocused Testは3件すべてPASSしている。確認したのは、18列Schema、Synthetic inputのValidation、必須項目不足または負の値の拒否である。Production endpointや個人のScreenshotには接続していない。

Chappyへ渡す設定Prompt

このNutrition Screenshot Capture Kitを自分用に設定したいです。私はiPhoneを使っており、栄養AppのScreenshotを共有シートから送信し、自分の保存先へ記録したいです。

最初に、私が使いたい保存先を質問してください。私はコードに詳しくないため、一Stepずつ設定し、その都度Testしてください。

必ず守ってください。
1. API key、認証token、Web App URL、Spreadsheet IDをソースコードへ直接書かず、安全な設定場所を使うこと。
2. 実Screenshot、実endpoint、個人の栄養Dataを公開場所やGitHubへアップロードしないこと。
3. iPhone Shortcutは共有シートから画像を受け取り、横1200pxへResizeしてBase64化し、todayまたはyesterdayを選んで送る構成にすること。
4. BackendはJSONを返し、失敗時はerrorを表示して原因を切り分けること。
5. 最初はSynthetic Sampleで、保存・必須値Validation・error表示を確認すること。
6. 同日の再送では新しい行を増やさず、その日の保存内容を更新すること。

Privacyと、公開前に止めるべきこと

公開できるのは、Shortcutの一般構造、1200px Resize、Base64化、today / yesterday の選択、一般化したrequest / response、18列Schema、検証、Synthetic input、Setup Promptである。

実Web App URL、Spreadsheet ID、認証token、API key、実運用endpoint、個人のNutrition / Health Data、実あすけん画面、端末ScreenshotはPrivateにする。実Screenshotの一つにはReal GAS Web App URLが表示されているため、そのまま公開してはいけない。

公開したReproduction Kitでは、Secret Scan、Endpoint Scan、Personal Data Scan、License / third-party content確認、README最終確認を実施した。含めているのはGenericなコード、Synthetic Sample、Chappy向けの設定手順だけである。

できることと、まだできないこと

  • あすけん画面の配置や表示項目が変われば、抽出精度に影響する。
  • JSON schemaと数値・非負値の検証は行うが、画像の読み取り値が正しい保証にはならない。保存前にResponseを確認する。
  • Screenshot入力では17栄養値すべてが必須で、欠損時は保存しない。
  • today / yesterday の選択ミスは自動検出しない。
  • Web App URL、token、Script Propertiesの設定不備はJSON errorになる。
  • Networkや画像抽出APIの障害時は保存されず、JSON errorを返す。自動再送は実装していない。
  • Nutrition Dataは本人の記録であり、医学的な診断や治療Adviceを置き換えない。

あすけんのUI、iOS ShortcutsのUI、現在の画像抽出方式、Google Apps Script、Health Masterの構成は将来変わるCurrent Layerである。長く残したいのは、既に便利に使っているAppを置き換えず、そのOutputを低摩擦でMaster Dataへ接続する考え方だ。

次に深掘りするもの

食生活を記録した後、本人が飲んでいたSupplementを半分以下へ整理した。その棚卸しを、医学的Adviceではなく本人のDecision Processとして次の記事候補で扱う。