人材紹介・派遣の会社で、登録会に来た求職者の手書きの登録票と履歴書を読み取り、求職者データベースの項目にそろえて、記入漏れを面談の担当へ返す
登録会で求職者が手書きした登録票と履歴書を読み取り、求職者データベースの項目にそろえます。記入の無い欄は、面談が始まる前に面談の担当へ一覧で返し、その場で聞き取れるようにします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 人材
- 対象部門
- 営業/採用
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/期限・対応漏れが起きる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 受付で登録票と履歴書を受け取り、クリアファイルに入れて面談の担当へ回す
- コーディネーターが登録票を見ながら面談し、聞き取ったことを登録票の余白に書き足す
- 面談の後、登録票と履歴書をまとめて事務へ回す
- 事務が登録票の項目を、求職者データベースの画面に1項目ずつ打ち込む
- 履歴書の学歴・職歴・資格を、データベースの経歴の欄に打ち込む
- 空欄や読めない字があれば付箋を貼り、コーディネーターへ戻す
- コーディネーターが求職者に電話をして聞き直し、事務が打ち込み直す
- 人受付で登録票と履歴書を受け取り、複合機でスキャンして拠点の取込フォルダに入れる
- 自動Google Apps Script が1分おきに取込フォルダを見て、新しいファイルを拾う
- 自動Document AI の Enterprise Document OCR が、文字とその位置、手書きかどうか、チェックボックスの状態、画像の品質の点数を返す
- 自動Apps Script が、登録票の様式の定義(欄ごとの範囲)と照らし、欄ごとに `filled` / `blank` / `illegible` を付ける
- 自動Gemini API が、欄の文字をデータベースの項目にそろえ、履歴書の学歴・職歴・資格を経歴の項目に分ける
- 自動必須の欄のうち `blank` と `illegible` のものを、面談の担当への一覧にする
- 人コーディネーターが面談の前に一覧を見て、面談の中で本人に聞き取る
- 人事務が `illegible` の欄を紙で見て直し、面談で聞き取った内容を足す
- 人事務が下書きを確かめ、CSVで求職者データベースへ取り込む
各工程の詳しい説明を読む
- 受付で登録票と履歴書を受け取り、クリアファイルに入れて面談の担当へ回す
- コーディネーターが登録票を見ながら面談し、聞き取ったことを登録票の余白に書き足す
- 面談の後、登録票と履歴書をまとめて事務へ回す
- 事務が登録票の項目を、求職者データベースの画面に1項目ずつ打ち込む
- 履歴書の学歴・職歴・資格を、データベースの経歴の欄に打ち込む
- 空欄や読めない字があれば付箋を貼り、コーディネーターへ戻す
- コーディネーターが求職者に電話をして聞き直し、事務が打ち込み直す
(a)記入漏れに気づくのが、面談の後になる。 2番目の面談では希望の条件を聞くことに集中し、登録票の全部の欄が埋まっているかまでは見きれません。 6番目で見つかった空欄は、7番目の電話になります。求職者がその日のうちに電話に出るとは限らず、仕事の紹介がその分だけ遅れます。
(b)登録会の日に事務が足りない。 登録会の日には10人、20人と登録が重なり、打ち込みが翌日、翌々日にずれ込みます。 その間、登録した人は紹介の検索に出てきません。
(c)手書きの字を読み直している。 住所の番地、メールアドレス、電話番号は、1文字違えば連絡がつきません。「1」と「7」、「0」と「6」を見比べながら打つので、手が止まります。
(d)書いてもらわなくてよいことまで書いてある。 履歴書の様式によっては、家族のことや本籍などを書く欄が残っているものがあります。打ち込む側がその都度判断して、データベースに入れないようにしています。
- 【人】 受付で登録票と履歴書を受け取り、複合機でスキャンして拠点の取込フォルダに入れる
- 【自動】 Google Apps Script が1分おきに取込フォルダを見て、新しいファイルを拾う
- 【自動】 Document AI の Enterprise Document OCR が、文字とその位置、手書きかどうか、チェックボックスの状態、画像の品質の点数を返す
- 【自動】 Apps Script が、登録票の様式の定義(欄ごとの範囲)と照らし、欄ごとに
filled/blank/illegibleを付ける - 【自動】 Gemini API が、欄の文字をデータベースの項目にそろえ、履歴書の学歴・職歴・資格を経歴の項目に分ける
- 【自動】 必須の欄のうち
blankとillegibleのものを、面談の担当への一覧にする - 【人】 コーディネーターが面談の前に一覧を見て、面談の中で本人に聞き取る
- 【人】 事務が
illegibleの欄を紙で見て直し、面談で聞き取った内容を足す - 【人】 事務が下書きを確かめ、CSVで求職者データベースへ取り込む
7番目が、この設計の分かれ目です。 空欄の一覧が面談の前に届くことで、聞き直しの電話がその場の一言に変わります。一覧が面談の後に届くなら、この構成の効き目は半分になります。 そのため、トリガーの間隔を1分にし、スキャンを受付ですぐ行う運用にします。
9番目の取り込みは人が行います。 求職者データベースは紹介の検索のもとになる台帳で、読み違えた電話番号やメールアドレスがそのまま入ると、連絡がつかない登録者が生まれます。
02今回想定するシステム構成
登録票(自社の様式)・履歴書(手書き) │ 受付で複合機からスキャン ▼【トリガー】Google Apps Script の時間主導型トリガー(1分おき) Google Apps Script ── 形式・ページ数の確認、登録票と履歴書の区別 ▼ Google Document AI(Enterprise Document OCR) │ 文字と位置・手書きかどうか・チェックボックス・画像の品質の点数 ▼ Google Apps Script ── 様式の定義と照らして欄ごとに状態を付ける │ filled/blank/illegible ▼ Gemini API ── データベースの項目にそろえる、経歴を分ける ├──▶ 面談の担当への空欄の一覧(Gmail とスプレッドシート) └──▶ 取り込み用のCSVの下書き ▼ 【事務が確認】──▶ 求職者データベースへCSVで取り込み
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Enterprise Document OCR) | Azure AI Document Intelligence |
| 生成AI | Gemini API(データベースの項目へのそろえと、経歴の分け方) | Claude API、OpenAI API |
| 連携 | Google Apps Script(取込フォルダの監視、欄ごとの状態の付与、CSVの書き出し) | Python |
| 保管 | Google ドライブ、Google スプレッドシート | 既存のスタッフ管理システムの添付 |
求職者データベースは、新しく足すものではありません。 この構成からは書き込まず、CSVの下書きを事務が確かめて取り込みます。 新しく作るのは、登録票の様式の定義です。欄の名前、データベースのどの項目に入るか、ページ上のどの範囲にあるか、必須かどうかを1欄1行で書きます。
土台は Document AI の Enterprise Document OCR です。 公式のプロセッサ一覧では、手書きを含む文字を200を超える言語で読み取り、文書の読みやすさから品質を評価するとされています。言語の一覧には日本語(ja)があり、手書きに対応する言語として印が付いています。
このプロセッサを選ぶのは、空欄を拾うためです。 項目名と値の組を返す Form Parser は、公式の制限事項に「空欄の書式のように、値が記入されていないキーと値のペアは確実には解析できない」と書かれています。空欄を探すのがこの構成の目的なので、項目名と値の組には頼らず、自社の様式の欄の範囲に文字があるかを座標で見ます。 Enterprise Document OCR は、文字を行・単語の単位で位置つきで返します。
追加の機能を2つ有効にします。 1つはチェックボックスの抽出で、チェックボックスとラジオボタンを、記入済み(filled_checkbox)か未記入(unfilled_checkbox)かと位置つきで返します。登録票の希望職種や曜日の欄に使います。もう1つはフォントの書式の検出で、単語ごとに手書きかどうかを返します。様式に印刷された文字と、求職者が書いた文字を分けるのに使います。この2つと、品質の点数は、v2.0 以降の版で使えるとされています。
03どうやって実装するのか
処理の起点を決める
Google Apps Script の時間主導型トリガーで、1分おきに拠点の取込フォルダを見ます。 登録会では、受付から面談が始まるまでの時間は長くて十数分です。その間に空欄の一覧が面談の担当に届かなければ、聞き取りは面談の後の電話に戻ります。
スキャンは受付で、1人分ずつ行います。 登録票2枚と履歴書をまとめて1つのPDFにし、ファイル名に受付番号を入れます。何人分かをまとめてスキャンすると、どこからどこまでが1人分かを判定する手間が増え、一覧が届くのも遅れます。
1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1人分の読み取りと項目のそろえには数十秒かかることがあるため、1回に3人分までとし、残りは次の実行に回します。 処理が終わったファイルは処理済みフォルダへ移し、移すのはCSVの下書きと一覧の書き込みまで成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 登録票と履歴書のPDF | 受付番号、拠点、受け付けた日時 | 取込フォルダ |
| 読み取り結果 | 文字と位置、手書きかどうか、チェックボックスの状態、画像の品質の点数 | Document AI(Enterprise Document OCR) |
| 登録票の様式の定義 | 欄の名前、データベースの項目、ページ上の範囲、必須かどうか、選択肢 | 自社で用意する一覧 |
| データベースの項目の定義 | 項目名、型、選択肢のコード(職種、勤務地、曜日など) | 求職者データベースの取り込みの仕様 |
| 取り込まない項目の一覧 | 履歴書に書かれていてもデータベースに入れない事項 | 自社で決める一覧 |
質を決めるのは、様式の定義です。 欄の範囲がずれていれば、隣の欄の文字を拾って filled と判定します。様式を改訂したら、定義も同じ日に改訂します。 様式の右下に版の番号を印刷しておき、読み取った版の番号で定義を引き分けます。
いちばん下の一覧は、法令への対応として持ちます。 職業安定法に基づく指針では、人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況を、原則として収集してはならないとされています。履歴書にこれらに当たる記載があっても、データベースに入れる項目に写しません(第13章)。
データの取得方法を決める
読み取りは、Apps Script から Document AI の処理のAPIを呼ぶだけです。依頼の processOptions.ocrConfig に、次の設定を入れます。
| 設定 | 値 | 何のためか |
|---|---|---|
enableImageQualityScores | true | ページごとの品質の点数を受け取る |
hints.languageHints | ["ja"] | 日本語の書類であることを伝える |
premiumFeatures.enableSelectionMarkDetection | true | チェックボックスの状態を受け取る |
premiumFeatures.computeStyleInfo | true | 単語ごとの手書きかどうかを受け取る |
| 取るもの | 応答のどこから | 何に使うか |
|---|---|---|
| 文字と位置 | pages[].tokens[] の layout と boundingPoly の normalizedVertices | 欄の範囲に入る文字を集める |
| 手書きかどうか | pages[].tokens[].styleInfo の handwritten | 印刷された欄の名前を除く |
| チェックボックス | pages[].visualElements[] の type | 希望職種・曜日などの選択 |
| 品質の点数 | pages[].imageQualityScores | ぼやけ・暗さ・小さな字などの検出 |
| 信頼度 | 各要素の layout の confidence | 読み取りが確かかの判定 |
位置は、ページの大きさで割った値(normalizedVertices)で扱います。 スキャンの解像度が拠点の複合機ごとに違っても、0から1の値で欄の範囲を定義しておけば同じ定義が使えます。
数字の欄は文字の単位で信頼度を見ます。 電話番号11桁のうち1桁だけ信頼度が低いとき、欄全体としては読めているように見えます。数字の欄は、1文字でも基準を下回れば illegible にします。
AIへ渡す前に整形する
- 形式の確認 … Enterprise Document OCR の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。複合機の保存形式は PDF にします
- 解像度の確認 … 公式には、OCRの精度のためにスキャンは最低200dpiが望ましいとされています。鉛筆の薄い字を読むなら、300dpiにします
- 圧縮の確認 … JPEG のような非可逆の形式は、強く圧縮すると精度が落ちることがあるとされています
- ページの種類の判定 … 1ページ目の様式の版の番号を読み、登録票のページと履歴書のページを分けます
- 向きの確認 … 逆さまに置かれたページは、読み取りの前に回します
- 品質の点数の確認 … 品質の点数が0.5を下回ると、ぼやけ・暗さなどの理由が返るとされています。理由が返ったページは、受付にスキャンのやり直しを知らせます
- 受付番号の照合 … ファイル名の受付番号と、登録票に書かれた受付番号が合うかを見ます
6番目を受付に返すのが要です。 求職者がまだ会場にいるうちにスキャンし直せば済みますが、帰ってから気づけば、紙を見直すしかありません。 品質の点数は、そのためにいちばん早く届く合図です。
AIに処理させる
欄ごとの記入の有無は、AIに判定させません。 様式の定義の範囲に手書きの文字があるかで、Apps Script が決めます。
| 状態 | 付ける条件(Apps Script が決める) |
|---|---|
filled | 欄の範囲に手書きの文字があり、信頼度が基準を上回る。チェックボックスは1つ以上が記入済み |
blank | 欄の範囲に手書きの文字が無い。チェックボックスがすべて未記入 |
illegible | 手書きの文字はあるが信頼度が基準を下回る。数字の欄は1文字でも下回る |
not_applicable | 「なし」「特になし」と書かれている(資格の欄など) |
AIにさせるのは、欄ごとの文字をデータベースの項目にそろえることだけです。
| させること | 例 |
|---|---|
| 選択肢のコードへのそろえ | 「フォークリフト」→ 資格のコード、「平日のみ」→ 曜日のコード |
| 表記のそろえ | 全角の数字を半角に、「〒」を除く |
| 履歴書の経歴の分け方 | 学歴と職歴の行を分け、年月・学校名や会社名・入学卒業や入社退社を項目にする |
| 手書きの文字の読み直し | 欄の文字と、前後の欄から候補を出すだけ。確定はしない |
| させないこと | 理由 |
|---|---|
| 空欄を埋める | 本人に聞くための一覧が消える |
| 読めない字の確定 | 電話番号とメールアドレスは1文字違えば連絡がつかない |
| 職歴の空白期間の解釈 | 面談で本人から聞くこと |
| 取り込まない項目の転記 | 法令に基づく指針で収集してはならないとされる事項がある |
| 仕事の向き不向きの判断 | この構成の範囲の外 |
1行目がいちばん起きやすい失敗です。 生年月日から年齢の欄を、住所から最寄り駅の欄を、AIは善意で埋めます。埋まった欄は blank の一覧から消え、面談で聞く機会がなくなります。 年齢の計算は必要ならデータベースの側で行います。
指示内容を固定する
あなたは人材派遣会社の登録の事務で、求職者が手書きした登録票と履歴書を、
求職者データベースの項目にそろえる立場です。
OCRが返した欄ごとの文字だけを見てください。推測で埋めないでください。
【やること】
1. 登録票の欄ごとの文字を、データベースの項目と選択肢のコードにそろえる
2. 履歴書の学歴・職歴の行を、年月・名称・区分(入学/卒業/入社/退社)に分ける
3. 資格を、資格のコードにそろえる
【厳守事項】
- status が blank の欄は、value を空のままにしてください。
ほかの欄から計算したり推し量ったりして埋めないでください。
(例:生年月日から年齢を、住所から最寄り駅を埋めない)
- status が illegible の欄は、value を空にし、candidates に読みの候補を
最大3つまで入れてください。候補のどれかに決めないでください。
- 電話番号、メールアドレス、郵便番号、番地は、読み取った文字をそのまま写してください。
桁を補う、よくある形に直すことをしないでください。
- 選択肢のコードに当てはまらない記載は、code を空にし、raw に原文を残してください。
- 職歴の空白期間や転職の理由について、解釈や所見を書かないでください。
- 「取り込まない項目の一覧」に当たる記載は、どの項目にも写さないでください。
記載があったことだけを excluded_found に true で示してください。
- 求職者の向き不向きや、紹介の可否について書かないでください。
【欄ごとの文字と状態】{fields}
【データベースの項目の定義】{db_schema}
【取り込まない項目の一覧】{excluded_items}
「生年月日から年齢を埋めない」と例を挙げているのは、例が無いと止まらないからです。 「推測で埋めない」だけでは、計算で出せるものは推測ではないと扱われます。禁じるのは、空欄を何かで埋めることそのものです。
取り込まない項目について「記載があったこと」だけを返させるのは、紙の扱いを決めるためです。 写さないだけでは、その履歴書の写しがドライブに残ります。記載があった件だけ、事務が保管のしかたを見直せます。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONに固定して受け取ります。 公式には、指定したJSONスキーマに従う応答を生成させられ、enum で値の候補を限り、required で必須の項目を決められるとされています。
{
"reception_no": "",
"form_version": "",
"fields": [
{ "field": "", "status": "filled | blank | illegible | not_applicable",
"value": "", "code": "", "raw": "", "candidates": [], "confidence": 0 }
],
"career": [
{ "kind": "education | work", "year_month": "", "name": "",
"event": "", "raw": "" }
],
"excluded_found": false
}
1つ目の理由は、status を Apps Script が決め、value をAIが埋めるという分担を形で守れることです。 AIは status を受け取って返すだけで、書き換えません。返ってきた status が渡したものと違えば、その件を全部人に回します。
2つ目の理由は、スキーマに合っていても値が正しいとは限らないことです。 公式にも、出力は構文として正しいJSONでも、値はアプリケーションの側で必ず検証するよう書かれています。Apps Script では、blank の欄に value が入っていないか、電話番号が数字だけか、コードが選択肢の一覧にあるかを確かめます。
3つ目は、面談の担当への一覧をそのまま作れることです。 必須の欄のうち blank と illegible のものを抜き出し、次の形でメールとスプレッドシートに出します。
| 受付番号 | 欄 | 状態 | 面談で聞くこと |
|---|---|---|---|
| 1024 | 勤務できる時間帯 | blank | 何時から何時まで勤務できるか |
| 1024 | 携帯電話番号 | illegible | 番号の確認(候補:090-12-**) |
| 1025 | 通勤の手段 | blank | 車・バイク・公共交通のどれか |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Apps Script の時間主導型トリガー | 新しいPDFを拾う |
| Document AI | API呼び出し | 文字と位置・手書きかどうか・チェックボックス・品質の点数 |
| Gemini API | API呼び出し(構造化出力) | 項目へのそろえと経歴の分け方 |
| 面談の担当 | Gmail とスプレッドシート | 空欄と読めない欄の一覧 |
| 受付 | Gmail | スキャンのやり直しの知らせ |
| 求職者データベース | CSVの取り込み(人が行う) | 確認済みの登録データ |
一覧の宛先は、その日の面談の担当です。 拠点ごとの登録会の担当表をスプレッドシートで持ち、受付番号から担当を引きます。拠点の全員に送ると、誰も見ない一覧になります。
求職者データベースへは、この構成から書き込みません。 既存のシステムのCSVの取り込みは事務が行い、取り込む前に illegible が残っていないことを確かめます。
人が確認する
人が確かめるのは2か所です。
- 面談の前に、コーディネーターが一覧を見る …
blankの欄を面談の中で本人に聞き、登録票の余白に書き足します - 面談の後に、事務が下書きを確かめる …
illegibleの欄を紙で見て直し、面談で書き足された内容を足します。電話番号とメールアドレスは、filledでも紙と見比べます - コードに当てはまらなかった記載を見る …
rawに残った原文を読み、コードを選ぶか、データベースのメモの欄に入れます excluded_foundがtrueの件を見る … 写しの保管のしかたを決めます- 直したら記録する … どの欄を、何から何へ直したかを残します
2番目の電話番号とメールアドレスの見比べは、省かないでください。 信頼度が基準を上回っていても、1文字の違いで連絡がつかなくなる欄です。 ここに数十秒かけることが、後の聞き直しの電話を減らします。
目標は、360件をならして1件3分です。 事務の確認は、filled の欄を流し見て、印の付いた欄だけを紙と見比べる作業になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 品質の点数が低い | ぼやけ・暗さなどの理由を受付に知らせ、会場にいるうちにスキャンし直す |
| 様式の版の番号が読めない | 定義を引けないため、全欄を illegible にして事務へ |
| 欄の外にはみ出して書かれている | 範囲に一部しか入らない。隣の欄と重なる文字は illegible |
| 履歴書を持たずに来た | その場で書いた用紙も同じ流れに入れる |
| 履歴書が自由な様式 | 範囲の定義は使わず、全文から経歴を分ける。経歴は全件を事務が確かめる |
| 受付番号が合わない | 別の人の書類が混ざった可能性。処理を止めて受付へ |
| 取り込まない項目の記載がある | excluded_found を立て、写さない |
| APIが応答しない、6分を超える | 取込フォルダに残す。処理済みへ移すのは書き込み成功時だけ |
上から3行目までは、様式とスキャンの問題です。 欄の枠を大きくする、記入例を様式に刷る、鉛筆ではなくボールペンを置くといった直し方のほうが、読み取りの精度を上げるより効きます。
記録を残す
- 元のPDFと、受付番号・拠点・受け付けた日時
- Document AI が返した
DocumentのJSONの全文と、品質の点数 - 欄ごとの状態と、そのとき使った様式の定義の版
- Gemini API が返した
fieldsとcareer - 面談の担当への一覧と、面談で聞き取って書き足した内容
- 事務が直した記録と、CSVを取り込んだ日時
様式の定義の版を残すのは、様式の改訂で欄の範囲が変わるためです。 古い定義で新しい様式を読むと、blank が大量に出ます。版が残っていれば、どの日の分を読み直せばよいかが決まります。
保存の期間を決めておきます。 指針では求職者の個人情報を適正に管理するために必要な措置を講じるとされています。登録をやめた人の書類の写しと読み取り結果をいつ消すかを、データベースの側の扱いとそろえて決めます。
04実装レベルの3段階
最小構成では件数がさばけません。 確かめるための段階です。 半自動化で、1件10分が6分程度になります。 空欄の判定と文字の読み取りは自動になりますが、データベースの項目へのそろえと打ち込みが残ります。本格構成で3分になり、この段階が本記事の想定です。 差が大きいのは、40を超える欄の打ち込みが、1件ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、illegible の多い欄と、はみ出して書かれやすい欄が先に分かります。様式の枠をそこで直してから本格構成に進むほうが、一覧の空振りが減ります。
05工数削減シミュレーション
導入後 360件 × 3分 ÷ 60 = 18 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 拠点で登録会を開き、来場した求職者に紙の登録票(自社の様式)と手書きの履歴書を書いてもらっている人材派遣・人材紹介の会社。登録が月に数百件あり、面談の後にコーディネーターや事務の担当が求職者データベースへ手で打ち込んでいる場合。記入漏れに面談の後で気づき、電話で聞き直している場合。Google Workspace を使っており、登録票の様式を自社で決められる場合。
- 登録の大半をWebの登録フォームで受け付けており、紙の登録票がほとんど無い場合。登録が月に数十件で、手で打ち込めば足りる場合。登録票の様式が拠点ごとにばらばらで、自社の様式に統一できない場合。なお、求職者を紹介できるか、どの仕事に合うかの判断はこの構成では代替できません。
07最小構成で試す方法
- 先月の登録から、空欄が多かったもの、字が読みにくかったものを中心に20件を選ぶ
- その20件について、事務が付箋を貼った欄を書き出す
- 登録票のスキャンを、1件ずつ手元のAIサービスの画面に貼り付ける
- 「この登録票の欄ごとに、記入があるか、空欄か、読めないかを表にしてください。空欄の欄を、ほかの欄から推し量って埋めないでください。読めない字は候補を挙げるだけにしてください」と指示する
- 出てきた表を、事務の付箋と突き合わせる
空欄が多かった件を選ぶのが要です。 全部埋まっている登録票では、空欄を埋めてしまう失敗が見えません。
| 出てきた内容 | 判断 |
|---|---|
| 事務の付箋と同じ欄が空欄・読めないと出た | OCRと様式の定義の連携に進む |
| 空欄をほかの欄から埋めた | 指示で直る。ただし本番では空欄の判定を座標で行う |
| 手書きの字がほとんど読めない | スキャンの設定と筆記具が先。 AIの問題ではない |
2行目は、本番の設計の理由そのものです。 画面に貼る方法では空欄の判定もAIに任せることになり、埋めてしまう失敗を指示だけで抑えることになります。 本番では、その判定を座標の計算に移します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 空欄がAIに埋められる | 空欄の判定を座標で行い、AIに status を書き換えさせない |
| 項目名と値の組で空欄を探してしまう | Form Parser は値が空のキーと値の組を確実には解析できないとされる。座標で見る |
| 印刷された欄の名前を記入と数える | 手書きかどうかの判定で、印刷の文字を除く |
| 欄の外にはみ出した字 | 隣の欄と重なる文字は illegible にする |
| 電話番号の1文字違い | 数字の欄は文字の単位で信頼度を見る。filled でも紙と見比べる |
| 様式の改訂で定義がずれる | 様式に版の番号を刷り、定義を引き分ける |
| 一覧が面談の後に届く | 1分おきに動かし、受付ですぐスキャンする |
| 何人分かをまとめてスキャン | 1人分ずつ、受付番号をファイル名に入れる |
| 書く必要のない事項がデータベースに入る | 取り込まない項目の一覧を渡し、写させない |
| 鉛筆の薄い字が読めない | 300dpiでスキャンし、ボールペンを置く |
上の2行が、この構成の失敗のほとんどです。 どちらも、空欄を空欄のまま拾うことに失敗しています。判定の根拠を、AIの判断ではなく座標の計算に置いてあるかどうかで、運用に乗るかが決まります。
7行目は、仕組みの外で起きます。 受付が登録票をまとめて後でスキャンする運用だと、どれだけ早く読み取っても一覧は面談に間に合いません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 求職者の氏名、生年月日、住所、電話番号、メールアドレス、学歴・職歴、資格、希望の条件です。すべて個人の情報で、求職の事実そのものも本人にとって知られたくない情報です。
- 収集の範囲を、業務の目的に必要な範囲に限る … 職業安定法では、業務の目的の達成に必要な範囲内で求職者の個人情報を収集し、収集の目的の範囲内で保管・使用しなければならないとされています。データベースに入れる項目を、紹介と派遣の業務に要るものに絞ります
- 収集してはならないとされる事項を写さない … 指針では、人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況が挙げられています。登録票の様式からこれらの欄を除き、履歴書に記載があってもデータベースに写しません
- 有料の利用区分で使う … Gemini API の追加利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスでは改善に使われ、人が読むことがあるとされています。無料のサービスには個人の情報を送らないよう書かれています
- AIに渡す範囲を絞る … 項目のそろえに氏名は要りません。氏名と連絡先の欄は Apps Script の側で扱い、AIには選択肢と経歴の欄だけを渡す設計にできます
- 取込フォルダの権限を拠点ごとに絞る … ほかの拠点の登録者の書類を見られる状態は避けます
誤りが起きた場合のリスクは、連絡先を読み違えて登録者と連絡がつかなくなることと、空欄を埋めて本人が言っていない条件で紹介することの2つです。 前者は数字の欄の見比べで、後者は空欄の判定を座標に置くことで防ぎます。
10まず何から始めるか
1週目:様式の定義を作る
登録票の欄を1欄1行で書き出し、データベースの項目、ページ上の範囲、必須かどうか、選択肢を決めます。あわせて、様式に版の番号を刷り、収集してはならないとされる事項に当たる欄が無いかを確かめます。
2週目:20件で試す
空欄が多かった件を中心に20件を選び、手元のAIサービスに欄ごとの記入の有無を表にさせます。空欄をほかの欄から埋めていないかを最優先で見ます。
3週目:受付の運用を決める
登録票を受け取ったらその場で1人分ずつスキャンする、と受付の手順を変えます。 あわせて、面談の担当表をスプレッドシートにし、受付番号から担当を引けるようにします。
4週目:取込フォルダから空欄の一覧までをつなぐ
Apps Script で取込フォルダを見張り、Document AI を呼び、欄ごとの状態をスプレッドシートに書き出すところまで作ります。この時点では Gemini API を使わず、空欄の判定だけを見ます。
2か月目: 面談の担当への一覧の通知と、項目へのそろえを足します。blank と illegible の件数を欄ごとに数えます。3か月目以降: CSVの下書きを足し、1件10分が何分になったかを実測します。illegible の多い欄の枠を直し、聞き直しの電話がほとんど無くなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Enterprise Document OCR が手書きを含む文字を200を超える言語で読み取り、読みやすさから品質を評価すること。言語の一覧で日本語に手書き対応の印が付くこと | Google Cloud: Processor list | 2026-10-06 |
品質の点数が0.5を下回ると理由が返ること。言語のヒント。追加の機能(チェックボックスの抽出が filled_checkbox/unfilled_checkbox を位置つきで返すこと、フォントの書式の検出が単語ごとに手書きかどうかを返すこと)と、v2.0 以降の版で使えること。対応形式 | Google Cloud: Enterprise Document OCR | 2026-10-06 |
| Form Parser が、空欄の書式のように値が記入されていないキーと値のペアを確実には解析できないこと | Google Cloud: Form Parser | 2026-10-06 |
| スキャンは最低200dpiが望ましいこと。非可逆の圧縮で精度が落ちうること | Google Cloud: Supported files | 2026-10-06 |
指定した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 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせること | Apps Script: Installable triggers | 2026-10-06 |
| 業務の目的の達成に必要な範囲内で求職者の個人情報を収集・保管・使用すること。指針で原則として収集してはならないとされる事項(人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況)。適正な管理の措置 | 北海道労働局: 求職者の個人情報の取扱いについて | 2026-10-06 |
登録票に設ける項目と、求職者の個人情報の保管の期間は、社内の担当部署と社会保険労務士・弁護士に確かめてください。 本記事は公的機関と各製品の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0456)についてのご相談はこちらから。
