旅館・ホテルのフロントで手書きされる宿泊者カードを読み取り、氏名・住所・連絡先・国籍・旅券番号を宿泊者名簿のデータに転記して、記入漏れを当日のうちにフロントへ返す
チェックインのときに手書きされた宿泊者カードを読み取り、氏名・住所・連絡先・国籍・旅券番号を宿泊者名簿のデータに転記します。記入の漏れているカードは、宿泊者が館内にいるうちにフロントへ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 宿泊
- 対象部門
- 総務
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- チェックインのときに宿泊者がカードに記入し、フロントが目で見て受け取る
- 訪日客の旅券を見せてもらい、写しを取ってカードに留める
- 夜勤のフロントがその日のカードの束を受け取る
- 1枚ずつ、氏名・住所・連絡先・国籍・旅券番号・同伴者を宿泊者名簿の表に打ち込む
- 記入の漏れや読めない字があれば、カードに付箋を付ける
- 付箋の付いたカードは、翌朝の日勤に申し送る
- 日勤が、宿泊者がまだ館内にいれば聞き直し、出発していれば電話かメールで聞く
- 人チェックインのときに宿泊者がカードに記入し、フロントがその場で卓上スキャナーで読み込む
- 自動スキャナーが取込フォルダへ保存し、Apps Script が数分おきに新しいファイルを拾う
- 自動Document AI がカードを読み、項目名と値の組・チェックボックス・信頼度を返す
- 自動Apps Script が旅券番号の欄の値を取り出して伏せ、残りを Gemini API に渡す
- 自動Gemini API が、氏名・住所・連絡先・国籍・同伴者・国内の住所の有無を名簿の項目にそろえる
- 自動Apps Script が必須の項目を規則で点検し、PMS の到着予定の一覧と部屋番号・人数を照らす
- 自動名簿の下書きの行と、記入漏れの一覧に書き込む
- 人フロントが記入漏れの一覧を見て、宿泊者が館内にいるうちに聞き直す
- 人夜勤のフロントが `complete` 以外の行だけを開き、カードの画像で確かめて名簿の確定の列に移す
各工程の詳しい説明を読む
- チェックインのときに宿泊者がカードに記入し、フロントが目で見て受け取る
- 訪日客の旅券を見せてもらい、写しを取ってカードに留める
- 夜勤のフロントがその日のカードの束を受け取る
- 1枚ずつ、氏名・住所・連絡先・国籍・旅券番号・同伴者を宿泊者名簿の表に打ち込む
- 記入の漏れや読めない字があれば、カードに付箋を付ける
- 付箋の付いたカードは、翌朝の日勤に申し送る
- 日勤が、宿泊者がまだ館内にいれば聞き直し、出発していれば電話かメールで聞く
(a)記入漏れに気づくのが遅い。 1番でフロントは受け取るときに見ていますが、チェックインが重なる夕方は、記入があるかを一目で見るだけです。 漏れに気づくのは4番の深夜の打ち込みのときで、翌朝には出発している宿泊者も少なくありません。
(b)夜勤が毎晩カードを打ち込んでいる。 80枚前後を打ち込むと、夜勤の時間の多くがそれで埋まります。夜間の問い合わせや館内の巡回と重なる日は、打ち込みが翌日の夜にずれます。
(c)手書きの字が読めない。 訪日客のローマ字の筆記体、数字の書き方の違い、住所の略し方。読めない字を推し量って打ち込むと、名簿の誤りになります。
(d)旅券番号と写しの確認が漏れる。 国内に住所が無い外国人の宿泊者は、国籍と旅券番号の記入が要ります。旅券の写しがカードに留まっているかも、打ち込みのときに見ます。 外れていても気づかないことがあります。
- 【人】 チェックインのときに宿泊者がカードに記入し、フロントがその場で卓上スキャナーで読み込む
- 【自動】 スキャナーが取込フォルダへ保存し、Apps Script が数分おきに新しいファイルを拾う
- 【自動】 Document AI がカードを読み、項目名と値の組・チェックボックス・信頼度を返す
- 【自動】 Apps Script が旅券番号の欄の値を取り出して伏せ、残りを Gemini API に渡す
- 【自動】 Gemini API が、氏名・住所・連絡先・国籍・同伴者・国内の住所の有無を名簿の項目にそろえる
- 【自動】 Apps Script が必須の項目を規則で点検し、PMS の到着予定の一覧と部屋番号・人数を照らす
- 【自動】 名簿の下書きの行と、記入漏れの一覧に書き込む
- 【人】 フロントが記入漏れの一覧を見て、宿泊者が館内にいるうちに聞き直す
- 【人】 夜勤のフロントが
complete以外の行だけを開き、カードの画像で確かめて名簿の確定の列に移す
8番目が、この設計の分かれ目です。 記入漏れは、深夜ではなくチェックインの数分後にはフロントの画面に出ます。 宿泊者が部屋にいるうちに電話で聞くか、外出から戻ったときに声をかけられます。
9番目で名簿の確定を自動にしないのも、意図してのことです。 読み違えた氏名や旅券番号が確定すると、名簿の誤りとして3年間残ります。
02今回想定するシステム構成
宿泊者カード(手書き、日本語・英語併記) │ チェックインのときにフロントの卓上スキャナーで読み込む ▼【トリガー】Google Apps Script の時間主導型トリガー(数分おき) Google Apps Script ── 形式・ページ数の確認、部屋番号の読み取り ▼ Google Document AI(Form Parser) │ 項目名と値の組・チェックボックス・信頼度を返す ▼ Google Apps Script ── 旅券番号の欄を取り出して伏せる ▼ Gemini API ── 名簿の項目にそろえる │ 氏名/住所/連絡先/国籍/国内の住所の有無/同伴者 ▼ Google Apps Script ── 必須の項目の点検、到着予定との照合 │ complete/missing/not_detected/unreadable/passport_copy_missing ├──▶ 宿泊者名簿の下書きの行 └──▶ フロントの記入漏れの一覧(部屋番号と不足の項目) ▼ 【人が記入漏れを当日中に聞き直し、complete 以外を確かめて確定】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Gemini API(カードの欄の名簿の項目への対応付け) | Claude API、OpenAI API |
| 差異計算 | Google Apps Script(必須の項目の点検、到着予定との照合) | Python |
| 連携 | Google Apps Script(取込フォルダの監視、旅券番号の取り出し、結果の書き込み) | Python |
| 保管 | Google ドライブ(共有ドライブ)、Google スプレッドシート | PMS の宿泊者情報 |
新しく作るのは、宿泊者カードの新しい版です。 欄の並びは今のまま、1つの欄に1つの項目、国内の住所の有無は □ の印、旅券番号は升目付きに作り直します。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えて、キーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出するとされ、200を超える言語に対応します。言語の一覧には日本語(ja)と英語(en)があり、どちらも手書きに対応する言語として示されています。 併記のカードに向いています。
Form Parser には、この題材で効く注意書きがあります。 公式には、値の入っていないキーと値の組(空欄の用紙など)を確実には読み取れないとされています。つまり、「キーと値の組が返ってこない」ことを、そのまま「空欄」と読んではいけません。 この構成では、カードの欄の一覧を先に持ち、返ってきた組と突き合わせて「空欄」と「見つからない」を分けます(第7章)。
チェックボックスは読めますが、ラジオボタンは読めません。 公式には、チェックボックスを塗られているかどうかとともにキーと値の組として返す一方、ラジオボタンの読み取りには対応しないとされています。「日本国内に住所がありますか」を ○ で囲む形にせず、□ に印を付ける形にします。
03どうやって実装するのか
処理の起点を決める
チェックインのときに、フロントが卓上スキャナーでカードを読み込むことを起点にします。 スキャナーは読み込んだ PDF を取込フォルダへ保存し、Google Apps Script の時間主導型トリガーが数分おきにそのフォルダを見ます。 夜にまとめて読み込むと、記入漏れが返るのは結局深夜になります。
ファイル名に部屋番号を入れます。 フロントは読み込むときにスキャナーの画面で部屋番号を選ぶか、カードの右上の部屋番号の欄に書きます。どちらも無いカードは、到着予定の一覧と氏名で照らします。
1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。チェックインの集中する夕方に備え、1回に8件までとし、残りは次の実行に回します。 処理済みフォルダへ移すのは、名簿の下書きへの書き込みまで成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 宿泊者カード | PDF。読み込んだ日時、部屋番号 | 取込フォルダ |
| 読み取り結果 | 項目名と値の組、チェックボックス、全文のテキスト、項目ごとの信頼度 | Document AI(Form Parser) |
| 到着予定の一覧 | 予約番号、部屋番号、代表者の氏名、人数、到着日・出発日 | PMS から毎日出力する CSV |
| カードの欄の一覧 | 版ごとの欄の名前(日本語と英語)、必須かどうか、欄の位置 | 自社で用意する一覧 |
| 旅券の写しの置き場所 | 部屋番号ごとの写しのファイル | 複合機の保存先のフォルダ |
質を決めるのは、カードの欄の一覧です。 返ってきたキーと値の組を、どの欄の答えかに当てはめる物差しになります。必須の欄が一覧に無ければ、空欄だったのか、そもそも読まれなかったのかが分かりません。
到着予定の一覧は、人数を見るために持ちます。 予約が3名なのにカードの同伴者の欄が1名なら、2名分の氏名が書かれていないことが分かります。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理のAPIを呼ぶだけです。ファイルを渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 氏名、住所、電話番号、メールアドレス、国籍、旅券番号、同伴者 |
| チェックボックス | formFields の fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 国内の住所の有無 |
| 全文のテキスト | text と、各要素の textAnchor | キーと値の組で取れなかった欄の拾い直し |
| 信頼度 | 各要素の layout の confidence | 手書きの字の読み取りが確かかの判定 |
旅券番号は、ここで Apps Script が取り出します。 「旅券番号/Passport No.」の欄の値を名簿の下書きへ直接書き、Gemini API に渡す全文のテキストとキーと値の組からは、その値を記号に置き換えて伏せます。 旅券番号は名簿の項目にそろえる必要がほとんど無く、生成AIに渡す理由がありません。
キーが見つからない欄は、全文のテキストで場所を探します。 カードの欄の一覧にある欄の名前が全文のどこにあるかを見て、その近くに値らしい文字があるかで「空欄」と「見つからない」を分けます。
AIへ渡す前に整形する
- 形式の確認 … Form Parser の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。スキャナーの保存形式は PDF にします
- 解像度の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。卓上スキャナーを300dpiに設定します
- 圧縮の確認 … 非可逆の形式は、ファイルを小さくすると精度が落ちることがあるとされています。スキャナーの「小さいファイル」の設定を使いません
- 向きの確認 … 逆さに読み込んだものは、画像の向きを直してから渡します
- 旅券の写しとの分け … 旅券の写しを同じフォルダに読み込まないよう、写しは別のフォルダに保存します
- 重複の検知 … 同じ部屋番号・同じ到着日のカードが2枚あれば、後のものに「書き直し」の印を付けます
5番目を軽く見ないでください。 旅券の写しがカードと一緒に Document AI と Gemini API へ流れると、伏せたはずの旅券番号が写しの側から渡ります。 写しの有無は、別のフォルダにファイルがあるかだけで見ます。
AIに処理させる
させるのは、カードに書かれた文字を、名簿の項目に写すことだけです。 必須の項目がそろっているかの判断はさせません。
| 写す項目 | 当たるものの例 | 判断できないときの扱い |
|---|---|---|
| 代表者の氏名 | 「氏名」「Name」、姓と名、フリガナ | 読みにくい字は読めたまま写し unclear |
| 住所 | 「住所」「Address」、国外の住所 | 書かれていなければ空。国名だけでも原文のまま |
| 連絡先 | 「電話番号」「Tel」「E-mail」 | 書かれていなければ空 |
| 国籍 | 「国籍」「Nationality」 | 書かれていなければ空。氏名や住所から推し量らない |
| 国内の住所の有無 | 「日本国内に住所がありますか」の □ | 印がどちらにも無ければ unknown |
| 同伴者 | 「同伴者」「Accompanying guests」の各行 | 行ごとに氏名を写す |
| 旅券番号 | (Apps Script が取り出して伏せる) | AIは扱わない |
右端の列が、この構成でいちばん大事な区別です。 書かれていない項目を、ほかの欄や予約の情報から埋めさせません。特に国籍は、氏名や住所の国から推し量らせません。
| させないこと | 理由 |
|---|---|
| 必須の項目がそろっているかの判断 | 規則で決め、Apps Script が行う |
| 国籍の推定 | 氏名の綴りや住所の国で国籍を決めない |
| 予約の情報での補完 | PMS の代表者の電話番号で連絡先を埋めると、漏れが消える |
| ローマ字の氏名の綴りの「修正」 | 似た綴りに直すと、旅券と違う名前が名簿に残る |
| 国内に住所が無い外国人かの判断 | □ の印で決める。印が無ければ unknown で人へ |
3行目がいちばん起きやすい失敗です。 予約の情報をAIに渡すと、空欄の連絡先を予約の電話番号で埋めます。その瞬間、カードに書かれていなかったという事実が消えます。 予約の情報は Apps Script だけが持ち、AIには渡しません。
指示内容を固定する
あなたはホテルのフロントで、宿泊者が手書きした宿泊者カードを読み、
宿泊者名簿に写すための下書きを作る立場です。
OCRが返した読み取り結果だけを見てください。推測で埋めないでください。
【やること】
1. 書類が宿泊者カードかを判断してください。
旅券の写し、領収書、アンケートなど別の書類なら、
写さずに document_type を other にしてください。
2. 代表者の氏名、住所、電話番号、メールアドレス、国籍、
「日本国内に住所がありますか」の印、同伴者の氏名を写してください。
3. 読み取り結果の中の [MASKED] は伏せた値です。そのままにしてください。
【厳守事項】
- 文字は書かれたものをそのまま入れてください。綴りを直さないでください。
- 読みにくい字は、読めた文字のまま value に入れ、unclear を true にしてください。
ほかの欄の内容から推し量って決めないでください。
- 書かれていない欄は空にしてください。
- 国籍が書かれていないときに、氏名の綴りや住所の国から決めないでください。
- 国内の住所の有無は、チェックボックスの印だけで決めてください。
印がどちらにも無ければ unknown にしてください。
- 記入がそろっているか、名簿として足りているかについて書かないでください。
- evidence には、各値の根拠にした文字列をそのまま写してください。
【読み取り結果(キーと値の組、チェックボックス、全文。旅券番号は伏せてあります)】{ocr_result}
【このカードの版の欄の一覧】{card_fields}
「綴りを直さない」を明記しないと、AIはローマ字の氏名を「よくある綴り」に寄せます。 名簿の氏名は旅券と同じであるべきで、直された綴りは、もう一度旅券を見ないかぎり誤りだと分かりません。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、Interactions の response_format に JSON スキーマを渡すと、そのスキーマに従う応答を生成させられるとされ、enum で値の候補を限り、required で必須の項目を決められます。
{
"document_type": "registration_card | other",
"room_no": "",
"guest": {
"name": { "value": "", "unclear": false },
"address": { "value": "", "unclear": false },
"phone": { "value": "", "unclear": false },
"email": { "value": "", "unclear": false },
"nationality": { "value": "", "unclear": false }
},
"domestic_address": "yes | no | unknown",
"companions": [{ "name": "", "unclear": false }],
"evidence": [{ "field": "", "text": "", "confidence": 0 }]
}
1つ目の理由は、AIの仕事と点検の仕事を別の層に置けることです。 JSONはAIが埋め、必須の項目の点検は Apps Script が規則で行います。旅券番号は、このJSONとは別に Apps Script が名簿の下書きへ書きます。
| 状態 | 付ける条件(Apps Script が決める) |
|---|---|
complete | 氏名・住所・連絡先がそろい、domestic_address が no なら国籍と旅券番号もそろい、旅券の写しがある |
missing | 必須の欄のキーが見つかり、その近くに値が無い |
not_detected | 必須の欄のキーそのものが見つからない |
unreadable | 値はあるが unclear が立っている、または信頼度が基準を下回る |
passport_copy_missing | domestic_address が no で、旅券の写しのファイルが無い |
count_diff | 同伴者の人数が、到着予定の一覧の人数と合わない |
2つ目の理由は、missing と not_detected を分けられることです。 Form Parser は空欄のキーと値の組を確実には読み取れないとされているので、キーが返ってこないことを空欄と決めつけません。 not_detected はフロントがカードの画像を見て、空欄か読み取りの漏れかを決めます。公式にも、構文として正しいJSONでも値はアプリケーションの側で検証するよう書かれています。
domestic_address が unknown のときは、国籍と旅券番号を必須として扱います。 印の漏れで外国人の宿泊者の旅券番号が抜けるほうを避けます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Apps Script の時間主導型トリガー | 新しいカードの PDF を拾う |
| Document AI | API呼び出し | 項目名と値の組・チェックボックス・信頼度を返す |
| Gemini API | API呼び出し(構造化出力) | 旅券番号を伏せた読み取り結果から、名簿の項目への対応付け |
| 到着予定の一覧 | CSV の読み取り | 部屋番号、代表者の氏名、人数 |
| 旅券の写しのフォルダ | ファイルの有無の確認 | 部屋番号ごとの写しがあるか |
| 宿泊者名簿の表 | スプレッドシートへの書き込み | 下書きの列にだけ書く。確定の列は人が移す |
| フロントの記入漏れの一覧 | スプレッドシートへの書き込み | 部屋番号、不足の項目、状態 |
| PMS | 書き込まない | 宿泊者情報への反映は人が行う |
記入漏れの一覧は、フロントの端末で開いたままにしておきます。 部屋番号と「住所なし」「国籍なし」のような不足の項目だけを出し、氏名や住所の値そのものは一覧に出しません。 カウンター越しに画面が見えても、ほかの宿泊者の情報が読めないようにします。
宿泊者への連絡は自動で送りません。 聞き直すのはフロントで、部屋への電話か、外出から戻ったときの声かけで行います。
人が確認する
人が見るのは、記入漏れの一覧と、complete 以外の行だけです。 complete のものは夜勤がまとめて確定の列に移します。全件を開く設計にすると、第10章の40.0時間には収まりません。
- フロントが記入漏れの一覧を見る …
missingとpassport_copy_missingは、宿泊者が館内にいるうちに聞き直します not_detectedはカードの画像を見る … 本当に空欄なら聞き直し、書かれていれば値を下書きに入れますunreadableを見る … 画像で確かめ、読めなければ宿泊者に聞きます。旅券の写しがあれば氏名と旅券番号は写しで確かめますcount_diffを見る … 同伴者の氏名が書かれていなければ聞き直します- 夜勤が確定する … 確かめ終えた行を名簿の確定の列に移します
1番目を夕方のうちに回すことが、この構成の目的です。 深夜に気づいても、宿泊者に聞ける時間はほとんど残っていません。
目標は、2,400件をならして1件1分です。 聞き直しや画像の確認が要るのは1割前後という想定で、それより多い月は、カードの版かスキャナーの設定に問題があります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 国内の住所の有無を ○ で囲んでいる | ラジオボタンは対象外。unknown として国籍と旅券番号を必須にする。 カードの版を □ に直す |
| 必須の欄のキーが返ってこない | not_detected。空欄と決めつけず、画像で確かめる |
| 部屋番号が書かれていない | 到着予定の一覧と氏名で照らす。候補が2つ以上なら選ばない |
| 団体で代表者のカードだけがある | count_diff。団体の名簿の扱いは自社の方針で決める |
| 旅券の写しがカードと一緒に読み込まれた | Document AI にも Gemini API にも渡さず、写しのフォルダへ移して担当者へ知らせる |
| 宿泊者カードでない書類 | document_type が other。点検せず担当者へ |
| APIが応答しない、6分を超える | 取込フォルダに残す。処理済みへ移すのは書き込み成功時だけ |
2行目がいちばん大事な例外です。 空欄と決めつけて聞き直すと、きちんと書いた宿泊者に同じことを二度聞くことになります。
記録を残す
- 元のカードの PDF と、読み込んだ日時・部屋番号
- Document AI が返した
DocumentのJSONの全文 - Gemini API に渡した伏せた後の読み取り結果と、返ってきたJSON
- Apps Script が付けた状態と、そのとき照らした到着予定の行
- フロントが聞き直した記録(いつ、どの項目を、誰が)と、確定した日時
- 旅券の写しのファイルとの対応
1つ目と2つ目は、名簿と同じく3年間の保存を前提に置き場所を決めます。 旅館業法施行規則では、名簿は作成の日から3年間保存するとされています。名簿の正本を PMS と表のどちらにするかを総務で決め、正本でないほうに古い控えを残さないようにします。
04実装レベルの3段階
最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1件3分が2分程度になります。 打ち込みは自動になりますが、記入漏れの確認と申し送りが夜のままです。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、記入漏れが夕方のうちに返り、翌朝の聞き直しが要らなくなるからです。 段階を飛ばさないでください。 半自動化の下書きを1か月見ると、not_detected が多い欄が先に分かります。 その欄の位置と大きさを、カードの次の版で直します。
05工数削減シミュレーション
導入後 2,400件 × 1分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室が百室を超え、チェックインのときに宿泊者カードを紙に手書きしてもらっているホテル・旅館。夜勤のフロントが毎晩カードの束を宿泊者名簿の表へ打ち込み、記入漏れに気づくのが宿泊者の出発後になっている場合。訪日客が多く、国籍と旅券番号の記入と旅券の写しの確認に手間がかかっている場合。Google Workspace を使っている場合。
- 客室が数室から十数室で、カードが1日に数枚しか無い場合。チェックインをタブレットや自動チェックイン機での入力に移しており、手書きのカードが無い場合。予約の段階で宿泊者の情報がそろい、フロントでは確認だけで済んでいる場合。なお、宿泊者名簿に何をどう記載するか、旅券の写しをどう扱うかの判断は、都道府県等の指導と自社の方針によるもので、この構成では代替できません。
07最小構成で試す方法
- 先月のカードから、訪日客のものと、手書きの癖の強いものを中心に30枚を選ぶ
- 旅券番号の欄を紙で隠してからスキャンする
- 30枚を1枚ずつ、手元のAIサービスの画面に貼り付ける
- 「この宿泊者カードから、氏名・住所・電話番号・メールアドレス・国籍・国内の住所の有無・同伴者の氏名を表にしてください。綴りを直さず、書かれていない欄は空にし、ほかの欄から推し量らないでください」と指示する
- 出てきた表を、名簿にすでに打ち込まれている値と1欄ずつ突き合わせる
| 出てきた内容 | 判断 |
|---|---|
| 値が正しく写り、空欄が空のままだった | OCRとワークフローの連携に進む |
| ローマ字の綴りを直した、国籍を推し量った | 指示の書き方で直る。構成は有効 |
| 手書きが読めない枚数が多い | カードの版とスキャナーの設定が先。 AIの問題ではない |
2番目を省かないでください。 試す段階でも、旅券番号を外へ出さない習慣を最初から作ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| キーが返ってこない欄を空欄と決めつける | missing と not_detected を分ける。 空欄の組は確実に読めないとされている |
| 空欄の連絡先を予約の電話番号で埋める | 予約の情報をAIに渡さない |
| ローマ字の氏名の綴りを直す | 「綴りを直さない」と明記し、unclear を立てさせる |
| 国籍を氏名や住所から推し量る | 国籍は書かれた文字だけ。空なら空 |
| ○で囲む欄が読めない | ラジオボタンは対象外。カードの版を □ に直す |
| 旅券番号が全文のテキストに残ったまま渡る | 伏せた後のテキストを保存し、最初の100枚で目で確かめる |
| 旅券の写しがカードと一緒に流れる | 写しは別のフォルダに読み込む |
| 記入漏れの一覧に氏名や住所が出る | 一覧には部屋番号と不足の項目だけ |
| 夕方の集中で処理が遅れる | 1回8件に区切り、次の実行に回す |
上の2行が、この構成の失敗のほとんどです。 前者は書いた宿泊者に聞き直す誤り、後者は書かなかった事実を消す誤りで、どちらもフロントの信頼に直接ひびきます。
6行目と7行目は、個人情報の扱いの問題です。 旅券番号を伏せる設計にしても、写しやテキストの残りから渡ってしまえば意味がありません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 宿泊者の氏名、住所、電話番号、メールアドレス、国籍、旅券番号、同伴者の氏名です。すべてが個人情報で、旅券番号は特に慎重に扱います。
- Gemini API は有料の枠で使う … 公式の利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされる一方、無料のサービスでは改善に使われ、人が読むことがあるとされ、機密の情報や個人情報を送らないよう求めています。請求先のアカウントを付けたプロジェクトから呼びます
- 旅券番号を生成AIに渡さない … 旅券番号は Apps Script が Document AI の結果から直接取り、Gemini API へ渡す前に伏せます。 旅券の写しも渡しません
- AIに渡すのはカード1枚分だけにする … 到着予定の一覧と名簿の全体をAIへ渡しません
- 記入漏れの一覧に個人の値を出さない … フロントの画面は宿泊者から見えることがあります。部屋番号と不足の項目だけを出します
- 取込フォルダと名簿の権限を絞る … フロントと総務の担当だけが見られるようにし、旅券の写しのフォルダはさらに限ります
- 保存の期間と正本を決める … 名簿は作成の日から3年間保存するとされています。期間を過ぎたカードの PDF とJSONの消し方も、あわせて決めます
- この構成は名簿の記載の判断を代替しない … 何をどう記載するか、旅券の写しをどう扱うかは、都道府県等の指導と自社の方針で決めることです。 この構成が出すのは、カードの欄が埋まっているかどうかという事実だけです
誤りが起きた場合のリスクは、記入漏れの見落としと、書いた宿泊者への誤った聞き直しの2つです。 前者は予約の情報で埋めさせないことで、後者は not_detected を分けることで防ぎます。
10まず何から始めるか
1週目:カードの版を作り直す
今のカードの欄の並びはそのままに、1つの欄に1つの項目、国内の住所の有無を □、旅券番号を升目付きに直した新しい版を作ります。あわせて、カードの欄の一覧に欄の名前と必須かどうかを書きます。
2週目:30枚で試す
先月のカードから30枚を選び、旅券番号の欄を隠してから手元のAIサービスで項目を表にさせます。空欄を予約の情報や推し量りで埋めていないかを最優先で見ます。
3週目:スキャナーと旅券の写しの置き場所を決める
卓上スキャナーを300dpi・PDF で取込フォルダへ保存する設定にし、旅券の写しは別のフォルダに保存するよう複合機の設定を分けます。PMS から到着予定の一覧を毎日出す設定も確かめます。
4週目:取込フォルダから名簿の下書きまでをつなぐ
Apps Script で取込フォルダを見張り、Document AI を呼び、旅券番号を伏せて Gemini API を呼び、名簿の下書きに書き出すところまで作ります。この時点では点検をせず、写した値と、伏せた後のテキストだけを見ます。
2か月目: 必須の項目の点検と到着予定との照合を足し、記入漏れの一覧をフロントの端末に出します。3か月目以降: 1件3分が何分になったかを実測します。記入漏れが、宿泊者がチェックインした日の夕方のうちにフロントへ返るようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がOCRのテキストに加えてキーと値のペア(エンティティとチェックボックス)、表、一般的なエンティティを抽出し、200を超える言語に対応すること。言語の一覧に日本語と英語があり、どちらも手書きに対応すること | Google Cloud: Processor list | 2026-10-06 |
| チェックボックスを塗られているかどうかとともにキーと値の組として返すこと。ラジオボタンに対応しないこと。値の入っていないキーと値の組(空欄の用紙など)を確実には読み取れないこと | Google Cloud: Form Parser | 2026-10-06 |
formFields が fieldName と fieldValue を持ち、チェックボックスが valueType の filled_checkbox/unfilled_checkbox で返ること。text と textAnchor の関係と、信頼度が返ること | Google Cloud: Handle the processing response | 2026-10-06 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと。非可逆の圧縮で精度が落ちうること | Google Cloud: Supported files | 2026-10-06 |
| 宿泊者名簿は正確な記載を確保する措置を講じたうえで作成し、作成の日から3年間保存すること。記載事項が宿泊者の氏名・住所・連絡先のほか、日本国内に住所を有しない外国人であるときはその国籍と旅券番号であること | 厚生労働省: 旅館業法施行規則 | 2026-10-06 |
| 日本国内に住所を有しない外国人の宿泊に際し、氏名・住所・連絡先等に加えて国籍と旅券番号の記載を義務付け、旅券の呈示とコピーも求めていること | 厚生労働省: 外国人宿泊者に係る旅券の呈示及びコピーに関する案内 | 2026-10-06 |
Interactions の response_format に JSON スキーマを渡して応答の形を固定でき、enum と required を使えること。値はアプリケーションで検証すべきこと | Gemini API: Structured outputs | 2026-10-06 |
| 有料サービスではプロンプトと応答を製品の改善に使わず、無料サービスでは改善に使われ人が読むことがあり、機密の情報や個人情報を送らないよう求めていること | Gemini API 追加利用規約 | 2026-10-06 |
| Apps Script の1回の実行が6分までであること | Apps Script: Quotas for Google Services | 2026-10-06 |
宿泊者名簿の記載と旅券の写しの扱いは、営業する施設を所管する保健所等の指導と自社の方針で決めてください。 本記事は各製品と官公庁の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0532)についてのご相談はこちらから。
