公民館・体育館に紙で届く施設の利用申請書を読み取り、団体名・利用日時・室名・人数を予約台帳に登録して、重複予約と記入漏れを窓口に返す
公民館・体育館に紙で届く施設の利用申請書を読み取り、団体名・利用日時・室名・人数を予約台帳の形にそろえて登録します。台帳と照らして重複予約と記入漏れを洗い出し、窓口に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/教育/自治体
- 対象部門
- 総務
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 窓口で申請書を受け取り、受付印を押して受付の時刻を書き込む
- 本庁の担当へ届いた申請書を、施設ごと・受付の時刻の順に並べる
- 1枚ずつ、団体名を登録団体の名簿で探し、減免の区分を確かめる
- 予約台帳の該当の日と室を開き、空いていれば団体名と人数を打ち込む
- 空いていなければ、先に入っている申請の受付の時刻と見比べる
- 記入の足りない申請書は付箋を貼り、電話で団体に聞く
- 重複したものは、施設の規則に沿って調整し、団体に連絡する
- 人窓口で申請書を受け取り、受付番号の付いた受付印を押す
- 人各館で申請書をスキャンし、ファイル名を「館コード_受付日時_受付番号」にして取込フォルダに保存する
- 自動Apps Script が10分おきに取込フォルダを見て、新しいファイルを拾う
- 自動Document AI の Form Parser が、項目名と値の組、チェックボックスの状態、信頼度を返す
- 自動Apps Script が代表者の氏名と電話番号を伏せる
- 自動Claude API が、読み取り結果を予約台帳の項目にそろえる
- 自動Apps Script が様式の必須項目表で記入漏れを数え、登録団体の名簿と団体名を照合する
- 自動受付日時の順に、予約台帳の同じ日・同じ室・重なる時間帯と照らし、`registered` / `conflict` / `incomplete` / `needs_review` を付ける
- 自動`registered` は予約台帳に「仮」の印で入れ、`conflict` と `incomplete` は窓口への返却の一覧に出す
- 人窓口の職員が返却の一覧を見て、団体に連絡する。重複の調整は施設の規則に沿って職員が決める
- 人「仮」の印の付いた予約を確かめて、本登録にする
各工程の詳しい説明を読む
- 窓口で申請書を受け取り、受付印を押して受付の時刻を書き込む
- 本庁の担当へ届いた申請書を、施設ごと・受付の時刻の順に並べる
- 1枚ずつ、団体名を登録団体の名簿で探し、減免の区分を確かめる
- 予約台帳の該当の日と室を開き、空いていれば団体名と人数を打ち込む
- 空いていなければ、先に入っている申請の受付の時刻と見比べる
- 記入の足りない申請書は付箋を貼り、電話で団体に聞く
- 重複したものは、施設の規則に沿って調整し、団体に連絡する
(a)受付開始日に打ち込みが終わらない。 2日で200枚を超える紙が届き、台帳に入りきるまで1週間近くかかります。 その間に別の窓口で同じ室の申請を受けると、重複が見えないまま受付が進みます。
(b)重複に気づくのが遅れる。 打ち込みの順番が受付の順番どおりでないと、後から受けた申請が先に台帳に入り、先に受けた申請が「重複」として扱われることがあります。 気づくのは、団体から問い合わせがあったときです。
(c)記入漏れの連絡が遅れる。 終了の時刻や人数が空欄の申請書は、打ち込みの途中で見つかり、付箋が貼られたまま束の中に残ります。団体への連絡が利用日の直前になると、調整の余地がなくなります。
(d)団体名の照合に時間がかかる。 「○○体操クラブ」と「○○体操の会」が同じ団体か、名簿をめくって確かめる時間が、1枚ごとに出ます。
- 【人】 窓口で申請書を受け取り、受付番号の付いた受付印を押す
- 【人】 各館で申請書をスキャンし、ファイル名を「館コード_受付日時_受付番号」にして取込フォルダに保存する
- 【自動】 Apps Script が10分おきに取込フォルダを見て、新しいファイルを拾う
- 【自動】 Document AI の Form Parser が、項目名と値の組、チェックボックスの状態、信頼度を返す
- 【自動】 Apps Script が代表者の氏名と電話番号を伏せる
- 【自動】 Claude API が、読み取り結果を予約台帳の項目にそろえる
- 【自動】 Apps Script が様式の必須項目表で記入漏れを数え、登録団体の名簿と団体名を照合する
- 【自動】 受付日時の順に、予約台帳の同じ日・同じ室・重なる時間帯と照らし、
registered/conflict/incomplete/needs_reviewを付ける - 【自動】
registeredは予約台帳に「仮」の印で入れ、conflictとincompleteは窓口への返却の一覧に出す - 【人】 窓口の職員が返却の一覧を見て、団体に連絡する。重複の調整は施設の規則に沿って職員が決める
- 【人】 「仮」の印の付いた予約を確かめて、本登録にする
8番目で、受付日時の順に照らすのが、この設計の分かれ目です。 照らす順番は、ファイルの保存の時刻でも読み取りの終わった時刻でもなく、ファイル名に書いた受付日時です。 処理の順番がばらばらでも、台帳に入る順番は受付の順番になります。
9番目で「仮」の印にしているのも、意図してのことです。 台帳に早く入れることで、別の窓口から見ても空きが正しくなります。ただし、承認は職員の仕事なので、本登録は11番目で人が行います。
02今回想定するシステム構成
施設の利用申請書(紙。窓口・郵送) │ 受付番号の付いた受付印 → 各館でスキャン ▼【トリガー】Apps Script の時間主導型トリガー(10分おき) Google Apps Script ── 形式・ページ数の確認、受付日時の取り出し(ファイル名から) ▼ Google Document AI(Form Parser) │ 項目名と値の組・チェックボックスの状態・信頼度を返す ▼ Google Apps Script ── 代表者の氏名・電話番号を伏せる ▼ Claude API ── 予約台帳の項目にそろえる │ 団体名/利用日/開始・終了の時刻/室名/人数/目的/備品 ▼ Google Apps Script ── 必須項目表で記入漏れを数え、名簿と台帳に照らす(受付日時の順) │ registered/conflict/incomplete/needs_review ├──▶ 予約台帳(「仮」の印) └──▶ 窓口への返却の一覧(連絡の文案つき) ▼ 【職員が返却の一覧を見て団体に連絡し、「仮」を本登録にする】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(読み取り結果を予約台帳の項目にそろえる) | Gemini API、OpenAI API |
| 差異計算 | Google Apps Script(必須項目表・登録団体の名簿・予約台帳との照合) | Python |
| 連携 | Google Apps Script(取込フォルダの監視、伏せ字の処理、台帳と一覧への書き込み) | Python |
| 保管 | Google ドライブ(館ごと・月ごとのフォルダ)、Google スプレッドシート | 文書管理のシステム |
新しく作るのは、様式の必須項目表です。 申請書の様式に並ぶ項目を、必須か任意か、どの欄に書かれるかで並べた表で、記入漏れを数える物差しになります。様式が2種類(公民館用と体育館用)あれば、表も2つ作ります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア(項目とチェックボックス)、表、一般的なエンティティを抽出するとされ、対応言語の一覧には日本語(ja)が手書きの対応ありとして載っています。申請書は「団体名」「利用日」のような項目名の横に手書きの値が並ぶ書類で、キーと値の組で読む形に向いています。
室名と備品の選択は、チェックボックスで読みます。 公式の説明では、Form Parser はチェックボックスを、いちばん近いテキストを項目名としたキーと値の組で返し、valueType で塗られている(filled_checkbox)か塗られていない(unfilled_checkbox)かを示します。 一方で、ラジオボタンの読み取りには対応していないとされています。
この2つから、様式の直し方が決まります。 「該当するものを○で囲む」形の選択欄は、チェックボックスとして読まれません。室名と備品の欄を「□」の四角に印を付ける形に改めるのが、最初の準備作業です。
利用の権利の扱いは、地方自治法に定めがあります。 公の施設について、普通地方公共団体は正当な理由がない限り住民が利用することを拒んではならず、利用について不当な差別的取扱いをしてはならないとされています。設置と管理に関する事項は条例で定めるものとされ、公の施設を利用する権利に関する処分については審査請求の定めもあります。 承認と優先の判断を機械に置かない理由は、ここにあります。
03どうやって実装するのか
処理の起点を決める
各館で申請書をスキャンし、取込フォルダに保存することを起点にします。 本庁に紙が届くのを待たず、各館の複合機でその日のうちに取り込みます。Apps Script の時間主導型トリガーが10分おきに取込フォルダを見ます。
ファイル名には、受付印の受付日時と受付番号を入れます。 「館コード_受付日時_受付番号」の形で、受付日時は窓口で受付印を押した時刻です。スキャンの時刻はファイルの属性に残りますが、照合には使いません。
1回の実行で処理する枚数に上限を置きます。 Apps Script の1回の実行は6分までなので、1回に10枚までとし、残りは次の実行に回します。 受付開始日は数十分で百枚を超えることがあり、台帳への照合は受付日時の順に並べ直してから行います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 申請書のファイル | スキャンしたPDF。館コード、受付日時、受付番号 | 取込フォルダ |
| 読み取り結果 | 項目名と値の組、チェックボックスの状態、全文のテキスト、読み取りの信頼度 | Document AI(Form Parser) |
| 様式の必須項目表 | 様式ごとの項目、必須か任意か | 担当で作る表 |
| 登録団体の名簿 | 団体名、略称・旧名、代表者、減免の区分 | スプレッドシート |
| 予約台帳 | 施設ごと・日ごと・室ごとの予約、それぞれの受付日時 | スプレッドシート |
| 施設の室の一覧 | 館ごとの室名、定員、時間帯の区切り | 担当で作る表 |
質を決めるのは、名簿の「略称・旧名」の列と、予約台帳の受付日時の列です。 略称が無ければ、書き方が違うだけの団体が「名簿に無い団体」になります。台帳に受付日時の列が無ければ、重複したときにどちらが先かを機械が示せません。 いまの台帳に無ければ、列を足すのが最初の作業です。
室の一覧には定員を入れます。 申請の人数が室の定員を超えていれば、needs_review で職員に見せます。超えたら断るかどうかは職員が決めます。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理の API を呼ぶだけです。ファイルを渡すと、Document という形の応答が返ります。
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 項目名と値の組 | pages[].formFields[] の fieldName と fieldValue | 団体名、利用日、時刻、人数、目的 |
| チェックボックスの状態 | formFields[] の valueType(filled_checkbox / unfilled_checkbox) | 室名、備品、営利目的の有無 |
| 全文のテキスト | text と、各要素の textAnchor | 組で取れなかった欄の拾い直し |
| 信頼度 | 各要素の layout の confidence | 利用日と時刻の数字が確かかの判定 |
利用日と時刻の欄は、信頼度を欄ごとに見ます。 手書きの「1」と「7」、「3」と「8」の読み違いは、そのまま別の日・別の時間帯の予約になります。 日付と時刻の欄で基準を下回る文字があれば needs_review にし、台帳には入れません。
必須項目表との突き合わせは、fieldName の文字列ではなく、様式の上の位置で行います。 手書きの値が項目名の枠にはみ出すと、項目名と値の組み合わせがずれることも考えられます。各項目の枠の位置を boundingPoly の範囲として必須項目表に持たせ、その範囲に値が返ってきたかで数えます。 様式が決まっている申請書だからできる方法です。
代表者の氏名と電話番号は、ここで Apps Script が伏せます。 団体は名簿で結び付けるので、生成AIに個人の連絡先を渡す理由がありません。
AIへ渡す前に整形する
- 形式の確認 … Document AI の対象は PDF、TIFF、JPEG、PNG などです。複合機の設定をPDFに固定します
- 解像度の確認 … 公式には、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよい結果になるとされています。手書きの数字を読むため、300dpiで取ります
- ページ数の確認 … Form Parser の同期の処理は15ページまでです。1申請1ファイルにし、まとめてスキャンしたものは受付番号ごとに分けます
- 受付日時の取り出し … ファイル名から受付日時と受付番号を取り出し、形が合わないものは取り込まずに館へ戻します
- 様式の見分け … 公民館用か体育館用かを、様式の番号の印字から見分け、必須項目表を選びます
- 重複の確認 … 同じ受付番号のファイルが既にあれば、二重に読まずに印を付けます
4番目を省かないでください。 受付日時が取り出せないファイルを処理すると、そのファイルだけ受付の順番が決まらないまま台帳に入ります。 形が合わないものは、照合の前に止めます。
AIに処理させる
させるのは、読み取り結果を予約台帳の項目にそろえることだけです。 記入漏れの判定、重複の判定、承認の判断はさせません。
| そろえる項目 | 当たるものの例 | 判断できないときの扱い |
|---|---|---|
| 団体名 | 「団体名」「サークル名」の欄 | 書かれたとおりに写す |
| 利用日 | 「利用日」「使用日」 | 書かれた表記のまま。曜日から日付を推し量らない |
| 開始・終了の時刻 | 「9:00〜12:00」「午前」 | 書かれた表記のまま。「午前」は時刻に直さない |
| 室名 | 塗られたチェックボックスの項目名 | 複数に印があればすべて写す |
| 人数 | 「人数」「利用人数」 | 数字だけを写す。「約」「〜」は残す |
| 目的 | 「利用目的」「内容」 | 書かれたとおりに写す |
| 備品 | 塗られたチェックボックスの項目名 | 印が無ければ空 |
時間帯を時刻に直さないことを、表に明記しています。 「午前」が何時から何時までかは施設ごとに違い、AIが一般的な午前の時刻に直すと、施設の区切りと合わない予約になります。 直すのは Apps Script が施設の室の一覧を使って行います。
| させないこと | 理由 |
|---|---|
| 空欄の判定 | 様式の必須項目表で数える |
| 重複の判定と、どちらを優先するかの判断 | 台帳との照合は規則、優先は職員 |
| 承認・不承認の判断 | 住民の利用の権利に関わる処分。職員が行う |
| 曜日や前後の欄からの日付・時刻の補完 | 読み違いが、別の日の予約になる |
| 団体名の名簿の団体への言い換え | 名簿との照合は略称の列で行う |
4行目がいちばん起きやすい失敗です。 利用日の数字が読めず曜日だけが読めたとき、AIは「次の土曜日」を計算して埋めたがります。埋めた日付が正しくても、確かめられていない予約が台帳に入ります。
指示内容を固定する
あなたは公共施設の予約の担当として、利用申請書の読み取り結果を、
予約台帳の項目にそろえる立場です。
OCRが返した読み取り結果だけを見てください。推測で埋めないでください。
【やること】
1. 次の項目を写してください。
団体名、利用日、開始の時刻、終了の時刻、室名、人数、利用目的、備品
2. 室名と備品は、塗られたチェックボックス(filled_checkbox)の項目名だけを写してください。
塗られていないもの(unfilled_checkbox)は写さないでください。
3. 読み取り結果の中の [MASKED] は伏せた値です。そのままにしてください。
【厳守事項】
- 文字は書かれたものをそのまま入れてください。
利用日と時刻の数字を1文字も直さないでください。
- 「午前」「午後」「夜間」のような時間帯は、そのまま写してください。
何時から何時までかに直さないでください。
- 利用日が読み取れないときは空にしてください。
曜日やほかの欄から日付を計算しないでください。
- 書かれていない項目は空にしてください。空であることについて、説明を書かないでください。
- 利用を認めるかどうか、他の予約と重なるかどうかについて、何も書かないでください。
- evidence には、各値の根拠にした文字列をそのまま写してください。
【読み取り結果(キーと値の組、チェックボックス、全文。氏名・電話番号は伏せてあります)】{ocr_result}
「空であることについて説明を書かない」を入れるのは、AIが空欄に理由を付けたがるからです。 何も言わなければ「終了時刻の記載なし(午前利用のため省略と思われます)」のように書きます。理由が付いた空欄は、職員が記入漏れとして扱わなくなります。 空欄は空のまま返させ、数えるのは必須項目表です。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、output_config.format に json_schema の形でスキーマを渡すと、制約付きのデコードでスキーマに従う応答を返すとされています。enum と required を使え、オブジェクトの additionalProperties は false にする必要があります。
{
"form_type": "community_center | gymnasium | other",
"group_name": { "value": "" },
"use_date": { "value": "" },
"start_time": { "value": "" },
"end_time": { "value": "" },
"rooms": [""],
"headcount": { "value": "" },
"purpose": { "value": "" },
"equipment": [""],
"evidence": [{ "field": "", "text": "" }]
}
状態は Apps Script が規則で付けます。
| 状態 | 付ける条件(Apps Script が決める) |
|---|---|
registered | 必須項目がそろい、日付と時刻の信頼度が基準以上で、台帳に重なる予約が無い |
conflict | 受付日時がより早い予約が、同じ日・同じ室・重なる時間帯に台帳にある |
incomplete | 様式の必須項目表のうち、値が返ってこなかった項目がある |
needs_review | 日付・時刻の信頼度が低い、名簿に無い団体、定員を超える人数、室名に印が2つ以上 |
incomplete の数え方が、この表でいちばん大事なところです。 返ってきた項目の中から空の値を探すのではなく、必須項目表の項目ごとに、値が返ってきたかを確かめます。 公式の説明どおり、空欄は項目ごと返ってこないことがあるからです。
conflict は、先に入っている予約より受付日時が遅いときだけに付けます。 受付日時が早い申請が後から処理された場合は、台帳の「仮」の予約のほうを conflict に付け替え、両方を職員に見せます。 どちらを優先するかは、施設の規則に沿って職員が決めます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Apps Script の時間主導型トリガー | 新しい申請書を拾う |
| Document AI | API呼び出し | 項目名と値の組・チェックボックス・信頼度を返す |
| Claude API | API呼び出し(構造化出力) | 伏せた後の読み取り結果を、台帳の項目にそろえる |
| 必須項目表・名簿・室の一覧 | スプレッドシートの読み取り | 記入漏れ・団体・定員の照合 |
| 予約台帳 | スプレッドシートへの書き込み | registered を「仮」の印と受付日時つきで入れる |
| 窓口への返却の一覧 | スプレッドシートへの書き込み | 館ごとに、受付番号・状態・足りない項目・連絡の文案 |
予約台帳には「仮」の印でしか書き込みません。 本登録は職員が印を外して行い、団体への承認の連絡も職員が出します。 台帳の空きを早く正しくすることと、承認を人が行うことを両立させるための形です。
返却の一覧は館ごとに分けます。 申請を受けた館の窓口が団体に連絡するほうが、団体にとって問い合わせ先が分かりやすいからです。 連絡の文案は「終了の時刻の記入がありませんでした。お手数ですが窓口までご連絡ください」のような下書きにとどめ、電話や送付は職員が行います。
人が確認する
職員が見るのは、conflict・incomplete・needs_review と、「仮」の予約の本登録だけです。 全件を申請書と見比べる設計にすると、第10章の16.0時間には収まりません。
conflictを先に見る … 両方の申請書と受付日時を並べ、施設の規則に沿って調整しますneeds_reviewの日付と時刻を申請書と見比べる … 読めなければ団体に確かめますincompleteの団体に連絡する … 文案を直して連絡し、連絡した日を記録します- 「仮」の予約を本登録にする … 一覧で団体名・日時・室を流し見て、印を外します
1番目を省かないでください。 受付日時は紙の受付印から取っていますが、受付印の押し忘れや時刻の書き違いがあれば、照合の順番も違ってきます。 重複したものだけは、両方の紙を見てから決めます。
職員が直した値は、確認用の列に入れ、元の読み取りの値は消しません。 直した欄の種類(日付、時刻、室名)を数えると、様式のどの欄が読みにくいかが分かります。
目標は、480件をならして1件2分です。 本登録の流し見は1件あたり数十秒で、conflict と incomplete は連絡を含めて数分かかります。返却が2割前後という想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| ファイル名から受付日時が取れない | 取り込まずに館へ戻す。受付の順番が決まらないまま照合しない |
| 室名のチェックボックスに印が2つ以上 | needs_review。続けて使うのか、書き損じかを団体に確かめる |
| 選択欄が「○で囲む」形の古い様式 | チェックボックスとして読まれない。needs_review にし、様式の差し替えを進める |
| 名簿に無い団体名 | needs_review。略称を名簿に足すか、新しい団体の登録を案内する |
| 人数が室の定員を超える | needs_review。断るかどうかは職員が決める |
| 受付日時が早い申請が後から処理された | 台帳の「仮」の予約を conflict に付け替え、両方を職員へ |
| 申請書でない書類(減免の申請書、団体の登録票) | form_type が other。照合せず担当へ |
| 利用日が受付の期間の外(3か月先など) | needs_review。受け付けてよいかは施設の規則で職員が決める |
| 同じ団体が同じ日に別の館へも申請 | 両方を登録し、返却の一覧に並べて表示する。どちらかを取り消させる判断はしない |
| API が応答しない、6分を超える | 取込フォルダに残す。処理済みへ移すのは書き込みの成功時だけ |
6行目が、この構成でいちばん起きやすい例外です。 遠くの館の紙は、スキャンが翌日になることがあります。台帳に先に入った「仮」の予約を消さずに conflict に付け替えるのは、どちらの団体にも説明できる状態を残すためです。
記録を残す
- 元の申請書のファイルと、館コード・受付日時・受付番号・取込の日時
- Document AI が返した
DocumentのJSONの全文 - Claude API に渡した伏せた後の読み取り結果と、返ってきたJSON
- Apps Script が付けた状態と、照合したときの台帳の該当の行の内容
- 職員が
conflictをどう調整したか、誰が、いつ、どの規則に沿って決めたか - 団体に連絡した日時と内容、本登録にした日時と職員
5つ目は、利用の権利に関わる記録です。 重複の調整は、後から団体に説明を求められることがあります。どちらの申請が先に受け付けられ、どの規則で決めたかを残しておけば、その説明ができます。
04実装レベルの3段階
最小構成は、確かめるための段階です。 月480枚には使えません。 半自動化で、1件5分が3分程度になります。 書き起こしと記入漏れの洗い出しは自動になりますが、台帳への打ち込みと重複の確認が残ります。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、台帳の該当の日と室を開いて見比べる作業が、1枚ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の1か月で、名簿に足すべき略称と、○で囲む欄の残る様式が先に分かります。
05工数削減シミュレーション
導入後 480件 × 2分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 公民館・体育館・地区センターなど複数の施設を持つ市町村や、その管理を受託する指定管理者で、利用の申請を紙で受け付け、職員がスプレッドシートの予約台帳に手で打ち込んでいる場合。高齢の利用者が多く、申請をすぐにはオンラインに寄せられない場合。受付の開始日に申請が集中し、重複の確認が追いつかない場合。Google Workspace を使っている場合。
- 申請のほとんどがオンラインの施設予約システムから入っており、紙が月に数十件しかない場合。施設が1つで、窓口の職員がその場で台帳を見ながら受け付けられる場合。なお、利用の承認・不承認と、重複したときにどちらを優先するかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の申請書から30枚を選ぶ(うち数枚は、記入漏れがあったものと、重複したものを入れる)
- その30枚について、当時どの欄が空で、どう連絡したかを窓口の職員に聞き取る
- 申請書をPDFにし、代表者の氏名と電話番号を塗ってから、手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この申請書から、団体名・利用日・開始と終了の時刻・室名・人数・目的・備品を書かれたとおりに写してください。読めない欄は空にし、日付を計算で埋めないでください」と指示する
- 出てきた結果を、当時の台帳の行と見比べる
30枚は必ずやってください。 Apps Script を組む前に、「手書きの日付と時刻が読めるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 項目がそろい、日付と時刻も合っている | OCRとの連携に進む |
| 時間帯を時刻に直した、空欄に理由を付けた | 指示の書き方で直る。構成は有効 |
| ○で囲んだ室名が読めない | 様式の差し替えが先。 AIの問題ではない |
| 手書きの数字の読み違いが多い | スキャンの解像度を上げ、記入欄の枠を大きくする |
3行目が出たら、様式を直す話を担当の課に持ち込む材料になります。 □の四角に印を付ける形に改めた様式で、同じ団体に書いてもらって比べるのがいちばん早く分かります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 処理の順番が受付の順番にすり替わる | 照合はファイル名の受付日時の順に行う |
| 空欄が「空の値」として返ってこない | 必須項目表で、項目ごとに値の有無を数える |
| ○で囲んだ室名が読めない | ラジオボタンは対象外。□の四角に印を付ける様式に改める |
| 「午前」が一般的な時刻に直される | 指示で禁じ、時刻への直しは施設の室の一覧で行う |
| 読めない日付を曜日から計算で埋める | 指示で禁じ、日付の欄の信頼度が低ければ台帳に入れない |
| 空欄に理由が付いて記入漏れに見えない | 空は空のまま返させる |
| 略称の団体が「名簿に無い」になる | 名簿に略称・旧名の列を足す |
| 後から処理された早い申請で台帳が食い違う | 「仮」の予約を conflict に付け替え、両方を職員へ |
| 受付開始日に処理が詰まる | 1回の枚数に上限を置き、Workspace のアカウントで動かす |
| 重複の優先を機械が決めてしまう | 優先は施設の規則に沿って職員が決める |
上の3行が、この構成の失敗のほとんどです。 どれも「紙に書かれたこと」と「機械が受け取ったこと」のずれから出ています。受付の順番、空欄、選択欄のそれぞれを、紙の側の情報で持てているかで運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 団体名、代表者の氏名と電話番号、利用の日時と目的です。団体の活動の内容(宗教、政治、健康に関わる集まりなど)が目的の欄から分かることがあります。
- 生成AIに渡す範囲を、台帳の項目に必要な部分に限る … 代表者の氏名と電話番号は Apps Script で伏せます。団体は名簿で結び付けるので、個人の連絡先を渡す必要がありません
- 承認と優先を機械に置かない … 地方自治法は、正当な理由がない限り住民の利用を拒んではならず、不当な差別的取扱いをしてはならないとしています。利用の目的の欄を、AIの判断の材料にしないでください
- 処理する地域を決める … 公式のプロセッサ一覧で確認できた Form Parser の対応地域は、
us、eu、asia-southeast1などで、このとき確認した一覧には日本の地域がありませんでした。 自治体の個人情報の取扱いの規程と照らして先に決めてください - 重複の調整の記録を残す … 利用する権利に関する処分には、審査請求の定めがあります。どの申請が先で、どの規則で決めたかを後から示せるようにします
- 指定管理者に任せる場合は、契約で範囲を決める … 読み取り結果と台帳を誰が持ち、どこで処理するかを協定に書いておきます
誤りが起きた場合のリスクは、先に申請した団体が後回しになることと、記入漏れの連絡が遅れて利用できなくなることの2つです。 前者は受付の順番を処理の順番で持つと起き、後者は空欄を値の有無で探すと起きます。どちらも紙の側の情報を機械に正しく渡せるかの問題なので、そこだけは設計で守ります。
10まず何から始めるか
1週目:受付印と台帳の列を整える
受付印に受付番号と時刻が入るようにし、予約台帳に受付日時の列を足します。登録団体の名簿には略称・旧名の列を足し、利用の多い上位50団体から埋めます。
2週目:30枚で試す
先月の申請書から30枚を選び、氏名と電話番号を伏せて手元のAIサービスに貼り付けます。手書きの日付と時刻が読めるか、時間帯を時刻に直していないかを最優先で見ます。
3週目:様式の選択欄を改める
室名と備品の欄を、□の四角に印を付ける形に改めます。 あわせて、様式ごとの必須項目表を作ります。重複したときの優先の決まり(先着か、抽選か)を、施設の規則で確かめ直しておきます。
4週目:取込フォルダから返却の一覧までをつなぐ
Apps Script で取込フォルダを見張り、Form Parser を呼び、項目と記入漏れを一覧に書き出すところまで作ります。この時点では台帳に書き込まず、一覧だけを見ます。
2か月目: 受付日時の順の照合と、「仮」の印での台帳への登録を足します。conflict と incomplete の件数を館ごとに数えます。3か月目以降: 返却の一覧の連絡の文案を足し、1件5分が何分になったかを実測します。受付開始日の翌日に台帳の空きが正しくそろい、古い様式が窓口から消えた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア(項目とチェックボックス)、表、一般的なエンティティを抽出すること。対応言語の一覧に日本語(ja)が手書きの対応ありとして載っていること。同期の処理が15ページまでであること。対応地域の一覧(us、eu、asia-southeast1 など) | Google Cloud: Processor list | 2026-10-07 |
チェックボックスをいちばん近いテキストを使ったキーと値の組として返し、valueType で塗られているかを示すこと。ラジオボタンの読み取りに対応していないこと。空の値を持つキーと値の組(空の様式など)は確実には読み取れないこと | Google Cloud: Form Parser | 2026-10-07 |
formFields が fieldName と fieldValue を持つこと。チェックボックスの valueType が filled_checkbox と unfilled_checkbox で区別されること。各要素の layout に textAnchor、信頼度が付くこと | Google Cloud: Handle the processing response | 2026-10-07 |
| 対応形式が PDF、TIFF、JPEG、PNG などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-07 |
| Form Parser の同期の処理が15ページまで、同期の処理のファイルサイズが40MBまでであること | Google Cloud: Document AI quotas and limits | 2026-10-07 |
構造化出力で output_config.format に json_schema を渡すこと。制約付きのデコードでスキーマに従う応答を返すこと。enum と required を使え、オブジェクトの additionalProperties は false にする必要があること | Claude API: Structured outputs | 2026-10-07 |
| Apps Script の1回の実行が6分まで、トリガーの実行時間の合計が個人のアカウントで1日90分、Google Workspace で1日6時間であること | Google Apps Script: Quotas for Google Services | 2026-10-07 |
| 地方自治法第244条第2項・第3項(正当な理由がない限り住民の公の施設の利用を拒んではならず、不当な差別的取扱いをしてはならない)、第244条の2第1項(設置及び管理に関する事項は条例で定める)、第244条の4(公の施設を利用する権利に関する処分についての審査請求) | e-Gov 法令API: 地方自治法 第十章 公の施設 | 2026-10-07 |
施設の利用の承認、重複したときの優先の決まり、減免の扱いは、各自治体の条例と施設の規則に従ってください。 本記事は各製品と e-Gov で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0679)についてのご相談はこちらから。
