エステサロンが手書きのカウンセリングシートを読み取り、カルテに登録する前の確認リストと、同意の欄の漏れの一覧を作る
お客様が手書きするカウンセリングシートを読み取り、顧客カルテに登録する前の確認リストを作ります。あわせて、必須の同意の欄・署名・保護者の同意の漏れを一覧にし、次の来店までに書き直してもらう先を洗い出します。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/小売
- 対象部門
- カスタマーサポート/営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 最小構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 受付がシートを渡し、お客様が待合で書く
- カウンセリングの担当が、シートの表を見ながら肌の状態と希望を聞き取る
- 施術の後、受付がシートを箱に入れる
- 閉店後、受付が1枚ずつシートを読み、カルテの項目に打ち込む
- 裏の同意の欄を見て、チェックと署名の有無を確かめる
- 漏れがあれば、店舗の共有のスプレッドシートに書き、次の来店で書いてもらう
- 体調の申告に気になる記入があれば、次の担当への申し送りのメモを書く
- 人お客様がシートを書き終えたら、受付が店舗のタブレットで両面を撮影し、共有のフォルダに入れる
- 自動10分ごとにスクリプトが新しい画像を拾い、形式・大きさ・解像度を確かめる
- 自動Google Document AI の Form Parser が、文字・チェック欄(埋まっているか空か)・キーと値の組・位置を返す
- 自動スクリプトが、様式で決めた同意の欄の位置に手書きの文字やチェックがあるかを見て、必須の欄の漏れと任意の欄の未回答を分ける
- 自動生成AIが、自由記述の欄(服薬、アレルギー、希望)をカルテの項目に振り分け、原文を残す
- 自動店舗の共有のスプレッドシートに、確認リストと同意の漏れの一覧を書き出す
- 人受付が同意の漏れの一覧を見て、施術の前にお客様に書き足してもらう
- 人カウンセリングの担当が確認リストを画像と見比べ、カルテに登録する
各工程の詳しい説明を読む
- 受付がシートを渡し、お客様が待合で書く
- カウンセリングの担当が、シートの表を見ながら肌の状態と希望を聞き取る
- 施術の後、受付がシートを箱に入れる
- 閉店後、受付が1枚ずつシートを読み、カルテの項目に打ち込む
- 裏の同意の欄を見て、チェックと署名の有無を確かめる
- 漏れがあれば、店舗の共有のスプレッドシートに書き、次の来店で書いてもらう
- 体調の申告に気になる記入があれば、次の担当への申し送りのメモを書く
(a)打ち込みが閉店後に集中する。 1枚のシートには、チェック欄が十数か所、自由記述の欄が数か所あります。600枚を9名で打ち込むと、閉店後の時間がそのまま打ち込みで埋まります。
(b)同意の漏れに気づくのが施術の後になる。 2番目のカウンセリングは表を見て行うので、裏の同意の欄を見るのは閉店後の5番目が最初です。 説明を受けたことのチェックが無いまま施術をしていた、ということが後から分かります。
(c)空欄に見落としがある。 チェック欄は小さく、薄い鉛筆のチェックや、欄の外に書かれた丸は見落とします。署名は書いてあるのに日付が無い、保護者の同意欄だけが空、という部分的な漏れが残ります。
(d)声をかけるかどうかが受付ごとに違う。 任意の欄が空のときに声をかける受付と、かけない受付がいます。お客様から見ると、来店のたびに同じことを聞かれたり、聞かれなかったりします。
- 【人】 お客様がシートを書き終えたら、受付が店舗のタブレットで両面を撮影し、共有のフォルダに入れる
- 【自動】 10分ごとにスクリプトが新しい画像を拾い、形式・大きさ・解像度を確かめる
- 【自動】 Google Document AI の Form Parser が、文字・チェック欄(埋まっているか空か)・キーと値の組・位置を返す
- 【自動】 スクリプトが、様式で決めた同意の欄の位置に手書きの文字やチェックがあるかを見て、必須の欄の漏れと任意の欄の未回答を分ける
- 【自動】 生成AIが、自由記述の欄(服薬、アレルギー、希望)をカルテの項目に振り分け、原文を残す
- 【自動】 店舗の共有のスプレッドシートに、確認リストと同意の漏れの一覧を書き出す
- 【人】 受付が同意の漏れの一覧を見て、施術の前にお客様に書き足してもらう
- 【人】 カウンセリングの担当が確認リストを画像と見比べ、カルテに登録する
1番目と7番目が、いまとの大きな違いです。 撮影を施術の前にすることで、同意の漏れが施術の前に分かります。 閉店後に気づく流れを、お客様がまだ店にいる時間に前倒しします。
8番目のカルテへの登録は人が行います。 確認リストは登録の案で、カルテへは自動で書き込みません。 体調の申告の読み違いがそのままカルテに残ると、次の担当がそれを信じて施術するためです。
02今回想定するシステム構成
カウンセリングシート(両面) │ 受付がタブレットで撮影(施術の前) ▼【トリガー】10分ごと、共有のフォルダの新しい画像 Google Apps Script(時間主導型のトリガー) ├──▶ 形式・大きさ・解像度の確認、表と裏の組み合わせ ▼ Google Document AI(Form Parser) │ 文字・チェック欄(filled/unfilled)・キーと値の組・位置(boundingPoly) ▼ Apps Script ── 様式の欄の位置と照らし、同意の欄の漏れ/未回答を判定 ▼ Claude API ── 自由記述の欄をカルテの項目に振り分ける(原文を残す) ▼ 店舗の共有のスプレッドシート(確認リスト/同意の漏れの一覧) ▼ 【人】受付が施術の前に書き足してもらう → 担当が確かめてカルテへ登録
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(自由記述の欄のカルテの項目への振り分け) | OpenAI API、Azure OpenAI |
| 連携 | Google Apps Script(画像の受け取り、APIの呼び出し、欄の位置の判定、一覧の書き出し) | Python |
| 保管 | Google ドライブの共有のフォルダ(シートの画像、読み取りの結果) | 社内のファイルサーバー |
顧客カルテの仕組みは、新しく足すものではありません。 確認リストは、カルテの項目と同じ並びでスプレッドシートに出し、担当が見比べてから登録します。カルテの仕組みへの書き込みは、この構成には入れません。
土台になるのは、Google Document AI の Form Parser です。 キーと値の組、表、チェック欄などの選択マーク、一般的な項目、文字を取り出す処理装置で、学習は要らず(学習させることもできず)、そのまま使えます。 対応言語の一覧には日本語(ja)があり、手書きにも対応と示されています。
チェック欄は、埋まっているか空かが返ります。 公式のページによると、チェック欄はキーと値の組として出力され、値の種類(valueType)が filled_checkbox(埋まっている)か unfilled_checkbox(空)になります。表の中のチェック欄は ✓ と ☐ の文字で返ります。
ただし、3つの制約があります。 ラジオボタンには対応しません。検出したチェック欄に対応するキーが無いことがあります。そして、値の入っていないキーと値の組(白紙の様式など)は確実には読めません。 同意の漏れを読み取りの結果だけで拾おうとすると、空の欄そのものが結果から消えて、漏れが無いように見えます。 この構成が欄の位置で判定するのは、このためです。
処理の地域に日本がありません。 Form Parser の対応地域は asia-south1、asia-southeast1、australia-southeast1、eu、europe-west2、europe-west3、northamerica-northeast1、us です。体調の申告を含むシートの画像が国外で処理されることを、第13章のとおり事前に確かめておきます。
03どうやって実装するのか
処理の起点を決める
10分ごとに、共有のフォルダに入った新しい画像を処理します。 受付は、お客様がシートを書き終えた時点で両面を撮影します。カウンセリングと着替えの時間があるので、10分ごとに読めば、施術が始まる前に同意の漏れの一覧に載ります。
起点は Apps Script の時間主導型のトリガーです。 公式のページによると、時間主導型のトリガーは毎分から月1回までの間隔で動かせ、動く時刻は少しずれることがあります。 撮影の直後に必ず動くわけではないので、受付には「撮影して10分たっても一覧に出なければ、目で確かめる」と決めておきます。
1回の実行は6分までです。 Apps Script の上限で、トリガーの合計の実行時間にも1日あたりの上限(個人のアカウントで90分、Google Workspace のアカウントで6時間)があります。10分ごとに動かすので、業務用のアカウントで動かすことを前提にします。 1回で処理する枚数を決め、残りは次の回に回します。
処理が終わった画像は処理済みのフォルダへ移し、移すのは読み取りと書き出しの両方が成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| シートの画像 | 表と裏の2枚。撮影日時、店舗、撮影した受付 | 共有のフォルダ |
| 読み取りの結果 | 文字、チェック欄(filled/unfilled)、キーと値の組、各要素の位置と信頼度 | Google Document AI |
| 様式の欄の位置の表 | 同意の各欄・署名・日付・保護者の欄の位置(ページ内の比率)と、必須か任意か | 自社で用意する表 |
| カルテの項目の一覧 | 肌の状態・体調の申告・希望の施術の選択肢 | 顧客カルテの設定 |
| 来店の予定 | お客様の名前、来店の時刻、担当 | 予約の一覧 |
質を決めるのは、様式の欄の位置の表です。 同意の各欄が、ページのどこからどこまでにあるかを、ページの幅と高さに対する比率で書きます。Document AI は位置をページの左上を原点とする0〜1の座標(normalizedVertices)で返すので、撮影の大きさが違っても同じ表で照らせます。
必須か任意かの列が、この表のもう1つの中身です。 第2章のとおり、紙の上には印刷されていない決まりなので、店長が決めて表に書き出します。 これで、受付ごとに声をかけるかどうかが違う状態が無くなります。
データの取得方法を決める
読み取りは、Apps Script から Form Parser の処理装置を呼びます。 画像を送り、返ってきた文書のデータから必要な部分を取り出します。認証の組み方(サービスアカウントかスクリプトの認可か)は、利用の環境に応じた個別の設定が要ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| チェック欄 | pages[].formFields[] の fieldValue.valueType | 肌の状態と同意の欄が埋まっているか |
| キーと値の組 | pages[].formFields[] の fieldName と fieldValue | 名前・連絡先・生年月日など値のある欄 |
| 文字のかたまりと位置 | pages[].tokens[] などの layout(textAnchor・boundingPoly・confidence) | 欄の位置に手書きの文字があるかの判定 |
| ページで見つかった言語 | pages[].detectedLanguages[] | 日本語として読まれているかの確認 |
同意の欄の判定では、キーと値の組を使いません。 使うのは、欄の位置の中に文字のかたまりか filled のチェック欄があるかです。キーと値の組は、値が空だと出てこないことがあるためです。
判定の手順は3段です。 ①様式の表から欄の位置を取り出す、②その位置に重なる文字のかたまりとチェック欄を集める、③印刷の文字(欄の見出し)を除いて何か残るかを見る。見出しの文字は様式で決まっているので、文字の並びで除けます。
表の中のチェック欄は ✓ と ☐ の文字で返ります。 肌の状態のチェック欄を表の形で印刷しておくと、行の見出しと ✓/☐ の組で読めます。Form Parser の表の読み取りは、セルの結合の無い表だけに対応するので、様式の表は結合の無い形にしておきます。
AIへ渡す前に整形する
- 形式の確認 … PDF、JPEG、PNG、TIFF、GIF、BMP、WebP のいずれかであることを確かめます
- 大きさの確認 … 1回の処理(オンライン)で送れるファイルは40MBまで、画像の解像度は40メガピクセルまでです
- 解像度の確認 … 公式のページは、正確な読み取りには200dpi以上、できれば300dpi以上を勧めています。タブレットの撮影でも、シートが画面いっぱいに写る距離で撮ります
- 表と裏の組み合わせ … 同じお客様の2枚を、撮影の順と時刻で1組にします。1枚しか無ければ止めます
- 向きの確認 … 横向き・逆さまの画像は直してから送ります
- 重複の検知 … 同じお客様・同じ日のシートが既にあれば、撮り直しか二重の撮影かを受付に聞きます
3番目は、撮影の決まりで防ぎます。 同意の欄のチェック欄は小さく、遠くから撮ると、薄い鉛筆のチェックが読み取りの前に画像から消えます。 シートを置く台と、撮る距離の目印を店舗に用意します。
AIに処理させる
同意の漏れの判定には、生成AIを使いません。 欄の位置とチェック欄の状態から、Apps Script が機械的に決めます。生成AIにさせるのは、自由記述の欄をカルテの項目に振り分けることだけです。
| 振り分けるもの | カルテの項目の例 | 判断できないときの扱い |
|---|---|---|
| 服薬の記入 | 服薬あり/なし、薬の名前(書かれたまま) | 「薬を飲んでいる」とだけあれば、名前を空のまま name_missing |
| アレルギーの記入 | 化粧品・金属・食物など、書かれた対象 | 対象が書かれていなければ空のまま |
| 妊娠・授乳・通院中の記入 | 該当の有無と、書かれた内容 | 曖昧な記入(「たぶん」「少し」)は ambiguous |
| 希望の施術 | メニューの名前(カルテの選択肢) | 選択肢に無い言い方は原文のまま other |
| 共通 | 原文の写し | 読めない記入は unreadable |
振り分けは、書かれていることの整理に限ります。 服薬の記入から「この施術は避けるべき」と書かせない、アレルギーの記入から「この化粧品は使えない」と推させない。施術してよいかの判断は、カウンセリングの担当がお客様と話して決めます。
| させないこと | 理由 |
|---|---|
| 同意の欄の漏れの判定 | 欄の位置とチェック欄の状態で機械的に決める。AI に任せない |
| 施術してよいか、受診を勧めるかの判断 | カウンセリングの担当と店の決まりで決める |
| 病名・薬の名前の補完や言い換え | 書かれたとおりに写す。誤った名前がカルテに残る |
| 肌の状態の評価 | チェック欄の写しだけにする |
| 署名が本人のものかの判断 | 署名の有無だけを見る |
いちばん起きやすいのは3行目です。 手書きの薬の名前は読み違えやすく、生成AIはそれらしい薬の名前に直します。直した名前がカルテに入ると、次の担当はそれを正しい申告として扱います。 読めなければ unreadable として人に回します。
指示内容を固定する
あなたはエステサロンで、カウンセリングシートの自由記述の欄を
顧客カルテの項目に振り分ける係です。
渡すのは、OCR が読み取った自由記述の欄の文字と、カルテの項目の一覧です。
書かれていることだけを使ってください。推測で埋めないでください。
【振り分ける欄】
- medication:服薬について(有無、薬の名前)
- allergy:アレルギーについて(有無、対象)
- pregnancy_nursing:妊娠・授乳について
- treatment:通院中の病気について
- wish:希望の施術
【status の付け方】
- ok .......... 書かれた内容が読み取れ、項目に当てはまる
- blank ....... 欄が空
- unreadable .. 文字はあるが読めない
- ambiguous ... 書かれているが、有無が決められない(「たぶん」「時々」など)
- name_missing 有無は書かれているが、薬や対象の名前が無い
迷ったときに ok を選ばないでください。
【厳守事項】
- original には、欄の文字をそのまま写してください。言い換えないでください。
- 薬の名前、病気の名前、アレルギーの対象を補ったり、正しそうな名前に直したりしないでください。
読めない文字があれば unreadable にしてください。
- 施術してよいか、避けるべきか、医療機関の受診を勧めるかを書かないでください。
- 肌の状態を評価しないでください。
- 希望の施術は、カルテの項目の一覧にある名前に当てはまるときだけ menu に入れ、
当てはまらなければ menu を空にして original だけを残してください。
- 同意の欄・署名については何も判断しないでください(別の処理で確かめます)。
【カルテの項目の一覧】{chart_items}
【自由記述の欄の文字】{free_text_fields}
「正しそうな名前に直さない」を名指しで書かないと、直します。 手書きの薬の名前が1文字欠けていれば、生成AIは近い名前を補います。禁じるのは、名前を補うことそのものです。
「同意の欄について何も判断しない」を書くのは、生成AIに漏れの判定を混ぜないためです。 自由記述の欄の文字の中に「同意します」のような言葉があると、生成AIは同意の有無にまで言及します。同意の漏れは別の処理で決めるので、ここでは触れさせません。
出力形式を固定する
生成AIからは、次の形の JSON で受け取ります。 Claude API の構造化出力で、output_config.format に type: "json_schema" と schema を渡し、object には additionalProperties: false を付けます。
{
"fields": [
{ "item": "medication", "status": "ok | blank | unreadable | ambiguous | name_missing",
"has": "yes | no | unknown", "name_as_written": "", "original": "" }
],
"wish": { "menu": "", "original": "" }
}
Apps Script が書き出す同意の漏れの一覧は、次の形です。
| 列 | 中身 |
|---|---|
| 来店日時・店舗・お客様 | 予約の一覧と撮影の時刻から |
| 欄 | 施術の説明/申告が正しいこと/個人情報の利用目的/写真の撮影/お知らせ/署名/日付/保護者の同意/保護者の署名 |
| 区分 | 必須/任意 |
| 判定 | missing(必須で空)/unanswered(任意で空)/filled/uncertain(チェックか消し跡か分からない) |
| 根拠 | 欄の位置で見つかった文字・チェック欄の状態と信頼度 |
1つ目の理由は、漏れと未回答を別の列で分けられることです。 受付が施術の前に声をかけるのは missing だけで、unanswered はお客様が選ばなかったという記録として残します。
2つ目は、保護者の同意を生年月日とつなげて判定できることです。 シートの表の生年月日から、来店日に未成年かを Apps Script で計算し、未成年のときだけ保護者の同意と署名を必須にします。 生年月日が読めないときは、保護者の欄を uncertain にして受付に確かめてもらいます。
3つ目は、uncertain を独立させられることです。 チェックを消した跡や、欄の外の丸は、filled とも空とも決めかねます。決めかねるものは決めずに、受付に画像を見てもらいます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有のフォルダ | Apps Script が読む | 新しいシートの画像を拾う |
| Google Document AI | API の呼び出し | 文字・チェック欄・キーと値の組・位置を返す |
| Claude API | API の呼び出し | 自由記述の欄をカルテの項目に振り分ける |
| 予約の一覧 | スプレッドシートの読み取り | お客様と来店の時刻を引く |
| 店舗の共有のスプレッドシート | 行の追加 | 確認リストと同意の漏れの一覧 |
顧客カルテへは書き込みません。 確認リストはカルテの項目と同じ並びで出し、担当が画像と見比べてから手で登録します。 カルテに入った体調の申告は、次の来店から担当が読むものなので、入れる前に人が確かめます。
同意の漏れの一覧は、店舗ごとのシートに分けます。 受付が見るのは自分の店舗のその日の分だけで、ほかの店舗のお客様の情報は見えないようにします。
人が確認する
受付が見るのは、同意の漏れの一覧の missing と uncertain です。
- 施術の前に
missingを見る … お客様に該当の欄を見せ、説明をしたうえで書き足してもらいます。書き足した面を撮り直して、同じ組に入れます uncertainを画像で見る … 消し跡か、欄の外の丸かを目で確かめ、必要ならお客様に聞きますunansweredは声をかけない … 任意の欄なので、お客様が選ばなかったものとして残します
カウンセリングの担当が見るのは、確認リストです。 自由記述の振り分けのうち、unreadable・ambiguous・name_missing を画像と見比べ、分からないものはお客様に直接聞きます。 聞いた内容をカルテに書くのは担当です。
目標は、600枚をならして1枚2分です。 確認リストの流し見と、印の付いた欄だけの確認で済む想定です。漏れや未確定が多い月は、撮影の距離が崩れているか、様式の欄の位置の表が古くなっています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 表か裏の1枚しか無い | 組にならないので止め、受付に撮り直しを頼む |
| 解像度が足りない | 200dpi 相当を下回るものは撮り直し。チェック欄の判定を信用しない |
| 欄の位置がずれている(斜めの撮影) | 様式の見出しの位置から補正し、補正できなければ uncertain |
| 生年月日が読めない | 保護者の欄を uncertain にして受付に確かめてもらう |
| ラジオボタンの形の欄 | Form Parser は非対応。様式をチェック欄に直す |
| 見出しの無いチェック欄が見つかる | キーが付かないことがある。欄の位置の表で何の欄かを決める |
| 生成AIが応答しない | 自由記述を原文のまま確認リストに載せ、担当が振り分ける |
| 読み取りが応答しない | 画像を元のフォルダに残し、次の回に再処理。受付は紙で目視する |
| 様式の版が変わった | 欄の位置の表を新しい版に合わせて作り直す。古い表のまま動かさない |
5行目は、様式を作り直すときに最初に見ます。 「写真の撮影:□する □しない」のような二択を丸で囲ませる形は、ラジオボタンと同じ扱いになりかねません。二択も、それぞれのチェック欄にしておきます。
最後の行は、運用でいちばん忘れられやすい例外です。 同意の文言を直して様式を刷り直すと、欄の位置が少し動きます。古い位置の表のまま判定すると、漏れが無いのに漏れと出る、漏れがあるのに出ない、のどちらも起きます。 様式に版の番号を印刷し、版ごとに位置の表を持ちます。
記録を残す
- シートの画像(表と裏)と、撮影の日時・店舗・撮影した受付
- Document AI が返した文書のデータの全文と、そのとき使った欄の位置の表の版
- 同意の漏れの判定の結果と、根拠(欄の位置で見つかった文字・チェック欄の状態)
- 生成AIの振り分けの結果と原文
- 書き足してもらった記録 … どの欄を、いつ、誰が案内して書き足したか
- 担当がカルテに登録した日時と、確認リストから直した箇所
書き足してもらった記録は、同意の経緯そのものです。 後から「説明を受けていない」と言われたとき、施術の前に欄の漏れに気づき、説明をして書き足してもらったという記録が、サロンの説明の材料になります。
画像の保存先は、閲覧できる人を店舗の担当と店長に限ります。 体調の申告が写っているので、共有のフォルダの権限を店舗ごとに分けます。
04実装レベルの3段階
本記事の想定は最小構成です。 1枚6分が2分になる見込みは、この段階で置いています。打ち込みが確認リストの見比べに変わり、同意の確認が一覧を見るだけになるからです。 半自動化は、書き足しの漏れを次の来店まで追いかける段階です。 施術の前に書き足してもらえなかった分を、次の来店の前に受付の画面に出します。本格構成は、カルテの仕組みが取り込みの形式を持っているかを確かめてからにします。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 2〜5店舗ほどのエステサロンで、初回来店と施術内容を変えるときに紙のカウンセリングシートを書いてもらい、受付やエステティシャンが閉店後に顧客カルテへ打ち込んでいる場合。同意の欄のチェック漏れや署名の書き忘れに、施術の後や監査のときに気づくことがある場合。シートの様式を店舗間でそろえていて、同意の項目のうち必須と任意が決まっている場合。
- カウンセリングをすでにタブレットや Web の問診で受けていて、紙が残っていない場合(同意の漏れは入力の画面で止められます)。月に数十枚で、受付が1枚ずつその場で確かめられる場合。シートの様式が店舗ごとにばらばらで、そろえる予定も無い場合。なお、施術してよいかの判断、医療機関の受診を勧めるかの判断、契約の書面が法令に合っているかの確認は、この構成では行いません。
07最小構成で試す方法
- 先月のシートから30枚を選ぶ(うち数枚は、同意の欄の漏れがあると分かっているもの、薄い鉛筆のチェックのものを入れる)
- その30枚について、受付が見つけた漏れの記録を取り出しておく
- 30枚をタブレットで撮影し、Google Cloud のコンソールで Form Parser の処理装置を作って1枚ずつ読ませる
- 同意の欄のチェック欄が filled/unfilled でどう返るか、空の欄がキーと値の組から消えていないかを見る
- 様式の欄の位置を1枚の画像から測って表にし、その位置で漏れを判定した結果を、受付の記録と突き合わせる
4番目を必ず見てください。 空の欄が消えるのを確かめておくと、位置で判定する理由が店舗に伝わります。
| 出てきた内容 | 判断 |
|---|---|
| 受付の記録と同じ漏れが出た | Apps Script でつなぐ段階に進む |
| 受付が見落としていた漏れが出た | 構成の効果そのもの。 見落としの型を記録する |
| 薄いチェックが unfilled になる | 撮影の距離と明るさで直る。様式のチェック欄を大きくする |
| 欄の位置がずれて判定が外れる | 撮影の台と目印を用意する。様式の見出しで補正する |
2行目は珍しくありません。 保護者の署名だけが空、日付だけが空、といった部分的な漏れは、閉店後の目視で見落としやすい型です。 30枚の中にあれば、それだけで試した価値があります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 空の同意の欄が読み取りの結果から消える | 値の無いキーと値の組は確実に読めない。 欄の位置で判定する |
| 任意の欄の空まで漏れとして出る | 欄ごとに必須・任意を表に持つ |
| 薄い鉛筆のチェックが unfilled になる | 撮影の距離と明るさ、チェック欄の大きさを直す |
| 二択を丸で囲ませる欄が読めない | ラジオボタンは非対応。それぞれのチェック欄にする |
| 生成AIが薬の名前を直す | 補わせない。 読めなければ unreadable |
| 生成AIが施術の可否を書く | 指示で禁じる。判断は担当がお客様と話して決める |
| 未成年かどうかが分からない | 生年月日から計算し、読めなければ uncertain |
| 様式を刷り直して位置がずれる | 版の番号を印刷し、版ごとに位置の表を持つ |
| 時間主導型のトリガーが撮影の直後に動かない | 10分を超えたら目視、と受付の決まりにする |
| 確認リストをそのままカルテへ入れる | 担当が画像と見比べてから登録する |
上の2行が、この構成の失敗のほとんどです。 1行目は「漏れが無いように見える」、2行目は「漏れが多すぎるように見える」という逆向きの失敗で、どちらも受付が一覧を信用しなくなる理由になります。 位置の表と必須・任意の列が、この構成の芯です。
5行目と6行目は、生成AIを使う部分の失敗です。 自由記述の欄にだけ使うと決めても、指示に禁止を書かないと、生成AIは親切に補い、勧めます。 書かれたことの写しと振り分けだけをさせてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の名前・連絡先・生年月日、肌の状態、服薬・アレルギー・妊娠・通院中の病気の申告、署名です。通院中の病気の記入は、要配慮個人情報の「病歴」に当たりえます。
- 要配慮個人情報として扱う … 個人情報保護委員会のガイドライン(通則編)は、病歴を要配慮個人情報とし、特定の病歴を示した部分が該当するとしています。取得には原則として本人の同意が必要で、 要配慮個人情報を含む個人データの漏えいのおそれが生じたときは委員会への報告が要るとされています。シートの同意の欄で利用目的を示し、取得の同意を得る運用にしておきます
- 処理の地域を確かめる … Form Parser の対応地域に日本はありません。シートの画像が国外の地域で処理されることを、店長と本部が確かめ、利用目的の説明に必要なら書き加えます
- 生成AIに渡すのは自由記述の欄の文字だけ … 名前・連絡先・生年月日・署名の画像は渡しません。振り分けに要るのは欄の文字だけです
- この構成は施術の可否を判断しません … 体調の申告を見て施術してよいかを決めるのは、カウンセリングの担当と店の決まりです。医療機関の受診を勧めるかも同じです
- シートは契約の書面ではない … 特定商取引法では、エステティックのうち期間が1か月を超え金額が5万円を超える契約は特定継続的役務提供に当たり、契約の前の概要書面と契約の後の契約書面の交付が定められています。カウンセリングシートの同意の欄は、これらの書面の代わりになりません。 この構成は契約の書面を確かめないので、契約の書面は別の手順で管理してください
- 閲覧の範囲を分ける … 画像と一覧は店舗ごとに分け、体調の申告を見られる人を担当と店長に限ります
誤りが起きた場合のリスクは、同意の漏れを見逃して施術することと、体調の申告の読み違いがカルテに残ることの2つです。 前者は位置による判定と施術の前の確認で、後者は補わせない指示と担当の見比べで防ぎます。どちらも、判断を人に残す設計で守ります。
10まず何から始めるか
1週目:必須・任意の決まりと欄の位置の表を作る
店長が同意の欄ごとに必須か任意かを決め、表にします。未成年のときだけ必須になる欄も書きます。あわせて、いまの様式の画像から各欄の位置を測り、ページに対する比率で書き出します。様式に版の番号が無ければ、刷り直しのときに入れます。
2週目:30枚で試す
漏れのあるシートを含む30枚を Form Parser で読み、空の欄が結果から消えるかを確かめます。欄の位置で判定した結果を、受付の記録と突き合わせます。
3週目:撮影の決まりを作る
シートを置く台と撮る距離の目印を店舗に用意し、施術の前に両面を撮る流れを受付で試します。ラジオボタンの形の欄があれば、様式を直します。
4週目:Apps Script でつなぐ
10分ごとのトリガーで画像を拾い、Form Parser と生成AIを呼び、店舗の共有のスプレッドシートに確認リストと同意の漏れの一覧を書き出すところまで作ります。最初の2週間は、受付の目視と一覧を並べて、両方の結果を比べます。
2か月目: 目視との比較で一覧が受付の目視以上に漏れを拾えていることを確かめ、目視を uncertain の確認に絞ります。3か月目以降: 1枚6分が何分になったか、施術の後に見つかる漏れが何件になったかを数えます。施術の後に見つかる同意の漏れがほぼ無くなり、受付ごとの声のかけ方がそろった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がキーと値の組・表・チェック欄などの選択マーク・一般的な項目・文字を取り出すこと。学習が不要で、学習させられないこと。チェック欄が filled/unfilled を示す値の種類付きでキーと値の組として出ること。表の読み取りが結合の無い表に限ること。ラジオボタンに非対応で、キーの無いチェック欄がありうること。値の入っていないキーと値の組を確実には読めないこと | Google Cloud: Form Parser | 2026-10-29 |
Form Parser の対応言語に日本語(ja)があり手書きに対応と示されていること。オンラインの処理は15ページまで(imageless mode で30ページ)、一括の処理は100ページまでであること。対応地域が asia-south1、asia-southeast1、australia-southeast1、eu、europe-west2、europe-west3、northamerica-northeast1、us であること | Google Cloud: Processor list | 2026-10-29 |
| 位置が左上を原点とする0〜1の座標(normalizedVertices)で返ること。ページで見つかった言語が信頼度付きで返ること。formFields の fieldName と fieldValue。チェック欄の値の種類が filled_checkbox/unfilled_checkbox であること。表の中のチェック欄が ✓/☐ の文字で返ること。表の rowSpan と colSpan が常に1であること | Google Cloud: Handle the processing response | 2026-10-29 |
| 画像の解像度が40メガピクセルまで、オンラインの処理のファイルが40MBまで、一括の処理が1GBまでであること | Google Cloud: Document AI limits | 2026-10-29 |
| 対応するファイルの形式(PDF、GIF、TIFF、JPEG、PNG、BMP、WebP)。正確な読み取りには200dpi以上、300dpi以上がよいとされること | Google Cloud: Supported files | 2026-10-29 |
| 病歴が要配慮個人情報に当たり、特定の病歴を示した部分が該当すること。要配慮個人情報の取得には原則として本人の同意が必要なこと。漏えい等のおそれが生じたときは個人情報保護委員会への報告が要ること | 個人情報保護委員会: 個人情報の保護に関する法律についてのガイドライン(通則編) | 2026-10-29 |
| エステティックのうち期間が1か月を超え金額が5万円を超えるものが特定継続的役務提供に当たること。契約の前に概要書面、契約の後に契約書面の交付が定められていること | 消費者庁: 特定商取引法ガイド 特定継続的役務提供 | 2026-10-29 |
施術してよいか、医療機関の受診を勧めるか、契約の書面が法令に合っているかは、店長と担当が店の決まりと専門家の助言に沿って決めてください。 本記事は公開されている製品の仕様と資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2240)についてのご相談はこちらから。
