民宿が電話で受けた予約を書き込む手書きの予約台帳を読み取り、日ごとの予約の一覧と食事の数・送迎の表を作る
電話で受けた予約を書き込む手書きの予約台帳を、スマートフォンで撮って読み取ります。日ごとの予約の一覧、夕食と朝食の数、迎えと送りの表を自動で作ります。
- 生成AI
- ChatGPT/Claude
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/宿泊
- 対象部門
- 総務
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 女将が電話で予約を受け、壁のカレンダーに部屋を書き、台帳に1行書き込む
- 変更や取消の電話があれば、台帳の元の行に二重線を引き、新しい行を書くか、元の行に書き足す
- 毎晩、女将が台帳をめくり、翌日以降に泊まる予約を拾い出す
- 連泊の予約は、何日目に当たるかを数えて、日ごとの泊まりの一覧に書き写す
- 夕食・朝食・弁当の数を、大人と子どもに分けて数え、厨房の黒板に書く
- 迎えと送りの時刻と場所を、主人の手帳に書く
- アレルギーや記念日などの備考を、厨房の黒板の端に書く
- 人女将が電話で予約を受け、台帳に1行書き込む(様式は第7章のとおり少し直す)
- 人女将が、その日に書き込んだり直したりしたページを、夕方と寝る前にスマートフォンで撮り、Google ドライブの受付のフォルダに入れる
- 自動毎日20時と23時に Apps Script が動き、受付のフォルダの画像を Document AI で読み取る
- 自動台帳の表の行を、ページと行の番号で前回までの予約と突き合わせ、新しい行と変わった行だけを拾う
- 自動生成AIが、食事・送迎・備考の書き方を決まった形にそろえる
- 自動Apps Script が、連泊を日ごとに展開し、朝食と送りの日付を1日ずらして、日ごとの予約の一覧、食事の数、送迎の表をスプレッドシートに作る
- 自動取消の印のある行、変わった行、決まらない値のある行を確認の一覧に出す
- 人女将が翌朝、確認の一覧だけを見て、必要なら台帳と見比べて直す
- 人主人が、翌日と翌々日の食事の数と送迎の表をスマートフォンで見て、仕込みと迎えの段取りを決める
各工程の詳しい説明を読む
- 女将が電話で予約を受け、壁のカレンダーに部屋を書き、台帳に1行書き込む
- 変更や取消の電話があれば、台帳の元の行に二重線を引き、新しい行を書くか、元の行に書き足す
- 毎晩、女将が台帳をめくり、翌日以降に泊まる予約を拾い出す
- 連泊の予約は、何日目に当たるかを数えて、日ごとの泊まりの一覧に書き写す
- 夕食・朝食・弁当の数を、大人と子どもに分けて数え、厨房の黒板に書く
- 迎えと送りの時刻と場所を、主人の手帳に書く
- アレルギーや記念日などの備考を、厨房の黒板の端に書く
(a)連泊が数えにくい。 3番で拾うのは「翌日に泊まる予約」ですが、台帳には泊まり始めの日しか書かれていません。 3日前から3泊の予約は、台帳の何ページも前にあります。拾い漏れた連泊の客の夕食が、当日の夕方になって足りないことに気づきます。
(b)朝食の日付がずれる。 5番で、宿泊日の行の朝食の印をそのまま数えると、その日の朝食ではなく、翌朝の朝食を数えたことになります。 慣れた女将は頭の中でずらしていますが、息子が代わりに書き出した晩にずれます。
(c)取消の二重線を見落とす。 2番で二重線を引いた行の下に、変更の後の行が書かれます。急いでめくると、二重線の行と新しい行の両方を数えます。 取消の行の送迎が手帳に残り、主人が誰もいない駅に迎えに行ったことがあります。
(d)送りの日を書き忘れる。 迎えは泊まり始めの日なので気づきますが、送りは最後の泊まりの翌日です。 連泊の客の送りは、台帳の行が何ページも前にあるので、書き出しから落ちます。
- 【人】 女将が電話で予約を受け、台帳に1行書き込む(様式は第7章のとおり少し直す)
- 【人】 女将が、その日に書き込んだり直したりしたページを、夕方と寝る前にスマートフォンで撮り、Google ドライブの受付のフォルダに入れる
- 【自動】 毎日20時と23時に Apps Script が動き、受付のフォルダの画像を Document AI で読み取る
- 【自動】 台帳の表の行を、ページと行の番号で前回までの予約と突き合わせ、新しい行と変わった行だけを拾う
- 【自動】 生成AIが、食事・送迎・備考の書き方を決まった形にそろえる
- 【自動】 Apps Script が、連泊を日ごとに展開し、朝食と送りの日付を1日ずらして、日ごとの予約の一覧、食事の数、送迎の表をスプレッドシートに作る
- 【自動】 取消の印のある行、変わった行、決まらない値のある行を確認の一覧に出す
- 【人】 女将が翌朝、確認の一覧だけを見て、必要なら台帳と見比べて直す
- 【人】 主人が、翌日と翌々日の食事の数と送迎の表をスマートフォンで見て、仕込みと迎えの段取りを決める
8番目が、この設計の分かれ目です。 女将が見るのは全部の予約ではなく、取消の印のある行、前回と変わった行、食事や送迎の書き方が決まらない行だけです。印の無い行は、読み取った値がそのまま一覧に入ります。
2番目で、撮るのは「その日に書いたページ」だけです。 同じページを何度撮っても、4番目でページと行の番号で突き合わせるので、予約が増えることはありません。
02今回想定するシステム構成
予約台帳(A4横・1ページ15行。手書きの表。ページと行の番号を印刷) │ その日に書いたページを、夕方と寝る前にスマートフォンで撮る ▼ Google ドライブの受付のフォルダ ▼【トリガー】毎日20時と23時に Apps Script が動く Apps Script(取り込みの処理) ▼ Google Document AI(Form Parser) │ 台帳の表の行とセル、夕・朝・弁当・取消の欄のチェック ▼ Apps Script ── ページと行の番号で前回までの予約と突き合わせる ▼ Claude API(構造化出力)── 食事・送迎・備考の書き方をそろえる ▼ Apps Script ── 連泊の展開、朝食と送りの日付のずらし ▼ Google スプレッドシート(予約の表/日ごとの一覧/食事の数/送迎の表/確認の一覧) ▼ 【女将が確認の一覧だけ見る。主人がスマートフォンで翌日の段取りを見る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence(レイアウト モデル)、AWS Textract(英文の書類に限る。日本語の台帳には使えない) |
| 生成AI | Claude API(食事・送迎・備考の書き方のそろえ方。構造化出力) | OpenAI API |
| 連携 | Google Apps Script(読み取りの呼び出し、前回までの予約との突き合わせ、スプレッドシートへの書き込み) | Python |
| 集計 | Google Apps Script(連泊の展開、日ごとの食事の数、送迎の表) | Python |
| 保管 | Google ドライブ(台帳の画像)、Google スプレッドシート(予約の表と一覧) | ― |
新しく作るのは、スプレッドシート1つと Apps Script 1本です。 スプレッドシートには、予約の表(1件1行)、日ごとの一覧、食事の数、送迎の表、確認の一覧の5つのシートを置きます。予約の表だけを Apps Script が書き、残りの4つは予約の表から作り直します。
土台は Document AI の Form Parser です。 公式の説明では、Form Parser はキーと値のペア、表、チェックボックスを取り出し、学習済みで追加の学習はできないとされています。公式のプロセッサ一覧では、日本語(ja)は手書きに対応する言語に入っています。台帳は表として読み、夕・朝・弁当・取消の欄は表の中のチェック欄として読みます。
Apps Script から Document AI を呼ぶには、Google Cloud のプロジェクトを用意します。 公式の説明では、Apps Script のプロジェクトはどれも Google Cloud のプロジェクトにつながっていて、既定のプロジェクトから自分で作った標準のプロジェクトに切り替えられます(元には戻せません)。Document AI を有効にした標準のプロジェクトに切り替え、ScriptApp.getOAuthToken() で得たトークンを付けて REST を呼びます。
処理する場所に、日本のリージョンはありません。 公式のプロセッサ一覧では、Form Parser の対応リージョンは us・eu・シンガポール(asia-southeast1)などです。台帳には予約した方の名前と電話番号が載ります。国外で処理することを、宿の個人情報の扱いの決まりで整理してから使います。
03どうやって実装するのか
処理の起点を決める
毎日20時と23時に、Apps Script が動きます。 公式の説明では、時間主導型のトリガーは、決まった時刻か決まった間隔で処理を動かせ、間隔は1分ごとから月に1回までとされています。20時は夕方までに受けた予約を、23時は夜の電話の予約を拾うためです。 主人が翌朝の仕込みを決める前に、一覧が新しくなっています。
撮るのは女将の仕事にします。 その日に書き込んだり、二重線を引いたり、書き足したりしたページを、夕方と寝る前に撮ります。ページの全体が入るように、台帳を開いて机に置き、真上から撮ります。 写真は Google ドライブのアプリで受付のフォルダに入れます。
処理の終わった画像は月ごとのフォルダへ移し、移すのは予約の表に書き終えたときだけにします。 受付のフォルダに残っている画像が、そのまま読み取れていないページです。急ぎの予約が入ったときは、Apps Script を手で動かせるように、スプレッドシートに「いま読む」のメニューを付けておきます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 台帳の画像 | ページ番号。表の行(行番号、受けた日、宿泊日、泊数、名前、電話番号、大人、子ども、幼児、部屋、夕・朝・弁当の欄、送迎の欄、備考、取消の欄) | 受付のフォルダ |
| 読み取り結果 | 表の行とセル、表の中のチェック欄の状態、文字の位置 | Document AI |
| 予約の表 | これまでに読み取った予約(ページと行の番号ごと) | スプレッドシート |
| 宿の決まり | 部屋の番号の一覧、送迎の場所の一覧(駅・バス停・港)、食事の区分(大人・子ども・幼児・弁当) | スプレッドシートの設定のシート |
質を決めるのは、台帳に印刷したページと行の番号です。 番号が無いと、同じページを2回撮ったときに、どの行が前回と同じ予約で、どの行が新しく書き足した予約かが分かりません。 台帳の様式を作り直すとき、左端に行番号を、右上にページ番号を印刷します。
送迎の場所の一覧も効きます。 台帳の送迎の欄には「駅」「〇〇駅」「バス」「港」と書かれます。宿の近くに駅が2つあるときは、一覧に「駅」がどちらを指すかを決めて書いておきます。 決まらない場所は、生成AIに選ばせずに確認に回します。
電話番号と名前は、読み取りには使いますが生成AIには渡しません。 生成AIに渡すのは、食事・送迎・備考の欄の文字だけです。
データの取得方法を決める
Apps Script から、Document AI の REST の process のメソッドを呼びます。 受付のフォルダの画像を読み、base64 にした内容と MIME タイプを付けて、processors/PROCESSOR_ID:process に送ります。トークンは ScriptApp.getOAuthToken() で得ます。 公式の説明では、このメソッドは実行しているユーザーの OAuth 2.0 のアクセストークンを返します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| ページ番号 | 表の外の文字(pages[].formFields) | 行の識別 |
| 予約の行 | pages[].tables[] の bodyRows | 宿泊日・泊数・人数・部屋・送迎・備考 |
| 見出しの行 | headerRows | どの列が何かの見分け |
| 夕・朝・弁当・取消の欄 | 表の中のセルの ✓ と ☐ | 食事と取消 |
| 文字の位置 | textAnchor の startIndex と endIndex | 疑いのあるセルの画像の切り出し |
列は、見出しの行の文字で見分けます。 見出しには「宿泊日」「泊」「大人」「子」「夕」「朝」と印刷しておきます。列の順番で決めると、セルが1つ読み落とされた行で、子どもの人数が大人の欄に入ります。
夕・朝・弁当・取消は、表の中の四角い欄にします。 公式の説明では、表の中のチェックボックスは ✓(印あり)や ☐(印なし)のような文字で表されます。○で囲む書き方や「夕朝」と文字で書く書き方は、欄として読めません。 様式を変えた後も、備考に「夕のみ」と書かれることはあるので、そちらは生成AIで拾います。
空いたセルは、空として扱います。 公式の説明では、Form Parser は値の入っていないキーと値のペアを確実には読めないとされています。子どもの人数の欄が空のときは、0人とは見なさず、大人の人数だけ数えて、子どもの欄が空だったことを行に残します。
AIへ渡す前に整形する
- 1枚1ページの確認 … 公式のプロセッサ一覧では、Form Parser の同期の処理は1回15ページまでです。見開きで撮った画像は左右に分けます
- 向きと傾きの確認 … 横向きや斜めの画像は、向きを直してから送ります
- ページ番号の確認 … ページ番号が読めない画像は、行を突き合わせられないので、読み取った行を予約の表に入れずに確認に回します
- 前回との突き合わせ … ページと行の番号が同じ行が予約の表にあれば、セルごとに見比べ、変わったセルのある行だけを「変更」として拾います
- 日付のそろえ … 「10/24」「24日」「10月24日」を日付にそろえます。月が書かれていなければ、受けた日より後で最も近い月にし、補ったことを行に残します
- 泊数のそろえ … 「2泊」「2」「〜26」を泊数にそろえます。宿泊日と終わりの日が両方書かれていれば、食い違わないかを見ます
- 取消の確かめ … 取消の欄に印があれば、その行は数えずに確認の一覧へ出します
4番目が、同じページを何度撮っても予約が増えない仕組みです。 台帳は、1ページに十数件の予約を書き足していきます。同じページは、書き足すたびに何度も撮られます。 ページと行の番号で前回の行と比べ、新しい行は足し、同じ行は何もせず、変わった行は確認に回します。
5番目で月を補うのは、電話の予約では月を書かないことが多いからです。 「24日」とだけ書いた行が、今月の24日か来月の24日かは、受けた日から決まります。受けた日も書かれていなければ、決めずに確認に回します。
AIに処理させる
日付の計算、連泊の展開、朝食と送りの日付のずらし、数え上げは、Apps Script の規則で行います。 生成AIには、食事・送迎・備考の欄の書き方を、決まった形にそろえる仕事だけを渡します。
| 規則で見るもの | 印を付ける条件 |
|---|---|
| 取消 | 取消の欄に印がある |
| 変更 | ページと行の番号が同じで、セルが前回と違う |
| 日付 | 月が補えない、宿泊日と終わりの日が食い違う |
| 人数 | 大人の欄が空、または部屋の定員を超える |
| 部屋 | 部屋の番号の一覧に無い、同じ日に同じ部屋の予約が2件 |
| 食事 | 欄の印と備考の書き方が食い違う |
| 送迎 | 場所が送迎の場所の一覧で1つに決まらない、時刻が読めない |
| 生成AIにさせること | 中身 |
|---|---|
| 食事の書き方のそろえ方 | 備考の「夕のみ」「素泊まり」「朝はおにぎり」「子どもは大人と同じ」を、夕・朝・弁当と子どもの食事の区分に分ける |
| 送迎の書き方のそろえ方 | 「駅16時迎」「帰り10時バス」を、迎えか送りか、場所、時刻に分ける |
| 備考の分け方 | アレルギー・記念日・早朝の出発・到着が遅い・その他に分け、元の文を写す |
朝食と送りの日付は、生成AIに付けさせません。 「2泊、朝食付き」から朝食の日を出すのは、宿泊日の翌日から泊数分という決まった計算です。生成AIに日付まで返させると、宿泊日の朝に朝食を付けて返すことがあります。 生成AIが返すのは「朝食あり」と「送りの時刻」までで、日付は Apps Script が付けます。
| させないこと | 理由 |
|---|---|
| 日付の計算と展開 | 決まった計算。Apps Script が行う |
| 取消かどうかの判断 | 取消の欄の印をそのまま使う |
| 部屋の割り当て | 女将が壁のカレンダーで決める |
| 子どもの食事の区分の決めつけ | 書かれていなければ「不明」で確認に回す |
| アレルギーの対応の判断 | 厨房の主人がお客様に確かめて決める |
4行目は、子どもの年齢だけが書かれている行で起きます。 「小1人(5才)」とあると、生成AIは子どもの料理と決めて返しがちです。大人と同じ料理を頼む家族もいるので、区分が書かれていなければ「不明」にします。
指示内容を固定する
あなたは民宿の予約台帳の書き方をそろえる補助です。
1件の予約の、食事の欄・送迎の欄・備考の欄の文字を、決まった形にしてください。
【渡すもの】
- 夕・朝・弁当の欄の印の有無
- 送迎の欄の文字
- 備考の欄の文字
- 送迎の場所の一覧
【食事】
- 欄の印と備考の書き方を見て、dinner・breakfast・lunch_box を
yes / no / unknown で返す。
- 欄の印と備考の書き方が食い違うときは conflict を true にし、
根拠にした語を evidence に写す。
- 子どもの食事の区分(kids_meal / same_as_adult / none)は、
備考に書かれているときだけ返す。書かれていなければ unknown。
年齢から決めない。
【送迎】
- 迎え(pickup)か送り(dropoff)か、場所、時刻に分ける。
- 場所は送迎の場所の一覧の名前で返す。1つに決まらなければ
place_candidates に候補を並べ、place は空にする。
- 時刻は書かれたまま 24時間の形にそろえる。午前か午後か決まらなければ
time を空にし、time_raw に元の文字を写す。
【備考】
- allergy・celebration・early_departure・late_arrival・other に分け、
元の文をそのまま text に写す。言い換えない。
【厳守事項】
- 日付を書かない。泊数から日付を出さない。
- 部屋、料金、取消について何も書かない。
- 書かれていないことを補わない。読めない文字は「?」のまま残す。
【食事の欄】{meal_marks}
【送迎の欄】{transfer_text}
【備考の欄】{note_text}
【送迎の場所の一覧】{places}
「年齢から決めない」を明記しないと、5才は子どもの料理、12才は大人の料理と決めて返します。 宿によって区切りが違い、家族によって頼み方も違います。区分は、書かれたときだけ返させます。
構造化出力で、答えの形を固定します。 公式の説明では、Claude API の構造化出力は output_config.format に type: "json_schema" でスキーマを渡し、オブジェクトには additionalProperties: false が要ります。食事の値と備考の区分は enum で決まった値に限ります。人数の上限のような数の制約は、スキーマでは掛けられないので Apps Script の側で確かめます。
出力形式を固定する
{
"meals": { "dinner": "yes", "breakfast": "no", "lunch_box": "yes",
"kids_meal": "unknown", "conflict": true,
"evidence": "朝はおにぎり" },
"transfers": [
{ "kind": "pickup", "place": "〇〇駅", "place_candidates": [],
"time": "16:10", "time_raw": "16:10" },
{ "kind": "dropoff", "place": "", "place_candidates": ["〇〇駅", "△△駅"],
"time": "", "time_raw": "10時" }
],
"notes": [
{ "kind": "early_departure", "text": "朝4時半出船" }
]
}
Apps Script は、この JSON と規則の結果から、予約の表の1行を作り、そこから日ごとの表を展開します。
| シート | 1行の単位 | 列 |
|---|---|---|
| 予約の表 | 予約1件 | ページと行の番号、宿泊日、泊数、名前、人数、部屋、食事、送迎、備考、取消、確認の印 |
| 日ごとの一覧 | 宿泊日×予約 | 宿泊日、何泊目か、名前、部屋、人数、その晩の夕食 |
| 食事の数 | 日×区分 | 日、夕食(大人・子ども)、朝食(大人・子ども)、弁当、不明の数 |
| 送迎の表 | 送迎1回 | 日、迎えか送りか、時刻、場所、名前、人数 |
食事の数では、朝食と弁当を「宿泊日の翌日」に付けます。 送迎の表では、迎えを最初の宿泊日に、送りを最後の宿泊日の翌日に付けます。主人が見る翌日の表は、たとえば次のようになります。
【10月25日(土)の段取り】
泊まり:6組 19名(うち連泊の2日目 2組)
夕食:大人15・子ども3・区分不明1 → 1組(3号室)に要確認
朝食(24日泊の方):大人11・子ども2
弁当:4(早朝の出船 4時半)
迎え:〇〇駅 16:10 □□様 3名
送り:〇〇駅 10:00 △△様 2名
確認待ち:送りの駅が決まらない 1件 システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google ドライブ | Apps Script が受付のフォルダを読む | 台帳の画像を集める |
| Document AI | REST の process | 台帳を読み取る |
| Claude API | REST | 食事・送迎・備考のそろえ方 |
| Google スプレッドシート | Apps Script が書く | 予約の表と4つのシート |
| 主人のスマートフォン | スプレッドシートのアプリで見る | 翌日の段取り |
予約サイトの予約は、この仕組みに入れません。 月に数件なので、いまどおり女将が台帳に書き写します。台帳を予約の元の記録にしておけば、仕組みが見る先は1つで済みます。
壁のカレンダーは、そのまま残します。 電話を受けながら空いた部屋を見るのは、カレンダーのほうが速いからです。日ごとの一覧とカレンダーが食い違ったら、どちらかの書き漏れです。 確認の一覧に「同じ日に同じ部屋の予約が2件」が出たら、カレンダーを見て直します。
人が確認する
- 取消の印のある行を先に見る … 取消の後に書き直した行があるか、台帳で見ます。取消の行の送迎が残っていないかも見ます
- 変わった行を見る … 前回と違うセルを見て、書き足しか読み違いかを確かめます
- 決まらない値を見る … 送りの駅、午前か午後か、子どもの食事の区分を、台帳と電話番号で確かめます
- 同じ部屋の重なりを見る … 壁のカレンダーと見比べます
直したときは、スプレッドシートの予約の表の行を直し、直したことの印を付けます。 直した行は、次に同じページを撮っても上書きしない決まりにします。台帳のほうも、同じように直しておきます。
目標は、240件をならして1件1分です。 確認の一覧に出るのは1日に数件という想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 画像がぼけていて読めない | 読み取りに送らず、スプレッドシートの上に撮り直しの知らせを出す |
| ページ番号が読めない | 行を入れずに確認に回す |
| 見開きで撮った | 左右に分けてから読む |
| 取消の欄に印があり、書き直しの行が無い | 取消として数えず、確認に回す。電話で取消を受けたかを女将が思い出す |
| 子どもの人数の欄が空 | 0人とせず、大人だけ数えて確認に回す |
| 送りの駅が決まらない | 送迎の表に「場所未定」で出し、前日までに電話で確かめる |
| 予約サイトの予約を台帳に書き写し忘れた | 部屋の重なりで気づくことがある。予約サイトの管理の画面で確かめる |
| Document AI が応答しない | 受付のフォルダに残し、次の時刻に再び読む |
4行目の「取消の印だけで書き直しが無い」は、取消か、書き直しを忘れたかが分かりません。 取消として扱うと、変更のつもりだったお客様の夕食が無くなります。数えないまま確認に回し、女将が決めます。
記録を残す
- 台帳の画像と、撮った日時
- Document AI が返した JSON の全文と、使ったプロセッサの版
- 生成AIのそろえ方と、そのとき参照した送迎の場所の一覧
- 予約の表の行の変わり方 … どのセルが、いつ、何から何に変わったか。人が直したか
- 取消の行と、取消を確かめた日
4つ目は、「予約したのに部屋が無い」と言われたときに要る記録です。 いつどの行が変わったかを、撮った日時で追えます。紙の台帳は、毎年の常連の方の記録として残します。
04実装レベルの3段階
半自動化で、1件5分が1分になります。この段階が本記事の想定です。 台帳をめくって拾う作業、連泊と朝食のずらし、送迎の書き出しが無くなり、女将は確認の一覧を見るだけになります。 本格構成は、予約サイトの予約が増えてからにします。 月に数件のうちは、台帳に書き写したほうが早く、仕組みの見る先を増やすと、二重に数える経路が増えます。
05工数削減シミュレーション
導入後 240件 × 1分 ÷ 60 = 4 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室が10室前後までの民宿・ペンション・小さな旅館で、予約の多くを電話で受けて紙の予約台帳に書き、毎晩か毎朝、台帳から翌日以降の予約の一覧、食事の数、駅やバス停への送迎の予定を手で書き出している宿。釣り・海水浴・スキー・登山の客が多く、連泊や素泊まり、早朝の出発の弁当など、予約ごとに食事と送迎の条件が違う場合。Google のアカウントとスプレッドシートを使っている、または使い始められる場合。
- 予約の大半が予約サイトや自社のホームページから入り、予約の管理のシステムで日ごとの一覧と食事の数が出ている宿。客室が数室で、予約の書き出しが毎日数分で終わる宿。電話の予約も最初から予約の管理のシステムに打ち込んでいる宿。なお、部屋の割り当て、予約を受けるかどうか、料金と取消の料金の決め方は、この構成では代替できません。
07最小構成で試す方法
- 先月の台帳から3ページを選ぶ(連泊、素泊まり、取消の二重線、送迎のある行を入れる)
- その3ページについて、当時作った日ごとの一覧と厨房のメモを出しておく
- 名前と電話番号の列を紙で隠して撮り、手元のAIサービスの画面に1ページずつ貼り付ける
- 「この台帳の表を、宿泊日・泊数・大人・子ども・夕・朝・弁当・送迎・備考の列で書き出してください。二重線の引かれた行は、取消の候補として印を付けてください。書かれていないものは『不明』としてください」と指示する
- 出てきた表から、手で日ごとの一覧を作り、当時のメモと突き合わせる
3ページは必ずやってください。 組む前に、「手書きの台帳が表として読めるか」と「二重線の行を取り違えないか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 表が当時の書き出しと合った | Form Parser と Apps Script の連携に進む |
| 二重線の行を有効な予約として出した | 様式が先。 取消の四角い欄を足す |
| 列がずれて、子どもの人数が大人に入った | 様式が先。 罫線をはっきりさせ、見出しを印刷する |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 同じページを撮るたびに予約が増える | ページと行の番号を印刷し、前回の行と突き合わせる |
| 二重線の行を数える | 取消の四角い欄を足し、印のある行を数えない |
| 朝食が宿泊日に付く | 朝食と弁当は翌日に付ける。日付は生成AIに付けさせない |
| 連泊の送りが落ちる | 送りは最後の宿泊日の翌日に付ける |
| 「24日」の月を取り違える | 受けた日から補い、補ったことを残す |
| 子どもの欄が空で0人になる | 空は空として確認に回す |
| 「駅」がどちらか分からない | 送迎の場所の一覧で決め、決まらなければ人へ |
| 人が直した行が次の撮影で戻る | 直した行は上書きしない |
上の4行が、この構成の失敗のほとんどです。 どれも、台帳の1行を日ごとに展開するときの決まりを、仕組みに書いていないことから出ています。 女将の頭の中にあったずらし方を、Apps Script の規則に移すのがこの構成の仕事です。
下の4行は、手書きの台帳の書き方の揺れから出ています。 様式を直しても書き方は揺れるので、決まらないものは決めずに女将へ回します。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 予約した方の名前と電話番号、宿泊日と人数、子どもの人数と年齢、アレルギーなどの備考です。
- 国外のリージョンで処理することを整理する … Form Parser の対応リージョンに日本はありません。宿の個人情報の扱いの決まりに照らしてから本番の台帳を回します
- 生成AIに渡す範囲を絞る … 食事・送迎・備考の欄の文字だけを渡し、名前と電話番号は渡しません
- スプレッドシートの共有を宿の人に限る … 名前と電話番号が載る予約の表は、女将と主人と息子のアカウントだけで共有します
- アレルギーの対応を一覧に任せない … 一覧はアレルギーの記載があることを知らせるだけです。何を除くかは、主人がお客様に確かめて決めます
- 紙の台帳を元の記録として残す … 直しはスプレッドシートと台帳の両方で行います
誤りが起きた場合のリスクは、来るお客様の食事や迎えが無いことと、来ないお客様の迎えに行くことの2つです。 前者は連泊と翌朝のずらしを誤ると起き、後者は取消を見落とすと起きます。どちらも、展開の決まりを規則に置くことと、取消の欄で数えないことで防ぎます。
10まず何から始めるか
1週目:台帳の様式を作り直す
ページと行の番号、見出し、夕・朝・弁当・取消の四角い欄を印刷した台帳を作ります。送迎の欄は「迎え」「送り」に分け、場所と時刻を書く枠にします。 送迎の場所の一覧も作ります。
2週目:3ページで試す
先月の台帳から3ページを選び、名前と電話番号を隠して手元のAIサービスで表を書き出させます。二重線の行を有効な予約として出していないかを最優先で見ます。
3週目:Google Cloud とスプレッドシートを準備する
Google Cloud のプロジェクトを作り、Document AI の Form Parser を用意します。スプレッドシートに5つのシートを作り、Apps Script のプロジェクトを標準のプロジェクトに切り替えます。国外で処理することの扱いも、この週に決めます。
4週目:毎晩の処理をつなぐ
Apps Script で受付のフォルダを読み、Form Parser を呼び、予約の表に書くところまで作ります。この時点では、女将のいまの書き出しと並べ、翌日の夕食と朝食の数が合うかを毎晩見ます。
2か月目: 日ごとの一覧、食事の数、送迎の表を足し、主人がスマートフォンで見始めます。3か月目以降: 1件5分が何分になったかを数えます。繁忙期の夜に書き出しが要らなくなった時点で、この構成は運用に乗ったと言えます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser の言語の表で、日本語(ja)が手書きに対応とされていること。Form Parser の同期の処理が15ページまでであること。対応リージョンが us・eu・asia-southeast1 などで、日本が含まれないこと | Google Cloud: Processor list | 2026-10-29 |
| Form Parser がキーと値のペア・表・チェックボックスを取り出し、学習済みで追加の学習ができないこと。値の入っていないキーと値のペアを確実には読めないこと | Google Cloud: Form Parser | 2026-10-29 |
表が headerRows と bodyRows で表され、表の中のチェックボックスが ✓ や ☐ の文字で表されること。フォームの項目が formFields で返ること。文字の位置が textAnchor の startIndex と endIndex で示されること | Google Cloud: Handle the processing response | 2026-10-29 |
| Apps Script のプロジェクトが Google Cloud のプロジェクトにつながり、既定のプロジェクトから標準のプロジェクトに切り替えられ、元には戻せないこと | Google Apps Script: Google Cloud projects | 2026-10-29 |
| 時間主導型のトリガーが、決まった時刻か間隔で処理を動かせ、間隔が1分ごとから月に1回までであること | Google Apps Script: Installable triggers | 2026-10-29 |
ScriptApp.getOAuthToken() が実行しているユーザーの OAuth 2.0 のアクセストークンを返すこと | Google Apps Script: Class ScriptApp | 2026-10-29 |
Claude API の構造化出力を output_config.format に type: "json_schema" で指定すること。オブジェクトに additionalProperties: false が要ること。数値の制約に対応しないこと | Claude Platform Docs: Structured outputs | 2026-10-29 |
宿泊の受付の決まり、宿泊者名簿の扱い、取消の料金の決め方は、自治体の窓口と宿の決まりに確かめてください。 本記事は上の公式の情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2243)についてのご相談はこちらから。
