Media > AI活用ユースケース > 営業 > 人材紹介・派遣の会社で、登録会に来た求職者の手書きの登録票と履歴書を読み取り、求職者データベースの項目にそろえて、記入漏れを面談の担当へ返す

人材紹介・派遣の会社で、登録会に来た求職者の手書きの登録票と履歴書を読み取り、求職者データベースの項目にそろえて、記入漏れを面談の担当へ返す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

登録会で求職者が手書きした登録票と履歴書を読み取り、求職者データベースの項目にそろえます。記入の無い欄は、面談が始まる前に面談の担当へ一覧で返し、その場で聞き取れるようにします。

サマリー
生成AI
ChatGPT/Claude/Gemini
AIサービス
Azure AI/Google Document AI
連携・自動化
Google Apps Script/Python
対象業界
人材
対象部門
営業/採用
対象業務
データ入力・転記/内容確認・チェック
主な課題
人手が足りない/入力作業が多い/期限・対応漏れが起きる
AIで行う処理
読み取り(OCR)
主な効果
入力漏れ削減/対応スピード向上/工数削減
導入難易度
★★☆☆☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
条件付き
現在工数
60h/月
AI導入後
18h/月
想定削減
70%
年間削減
504h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 受付で登録票と履歴書を受け取り、クリアファイルに入れて面談の担当へ回す
  2. コーディネーターが登録票を見ながら面談し、聞き取ったことを登録票の余白に書き足す
  3. 面談の後、登録票と履歴書をまとめて事務へ回す
  4. 事務が登録票の項目を、求職者データベースの画面に1項目ずつ打ち込む
  5. 履歴書の学歴・職歴・資格を、データベースの経歴の欄に打ち込む
  6. 空欄や読めない字があれば付箋を貼り、コーディネーターへ戻す
  7. コーディネーターが求職者に電話をして聞き直し、事務が打ち込み直す
導入後(After)
  1. 人受付で登録票と履歴書を受け取り、複合機でスキャンして拠点の取込フォルダに入れる
  2. 自動Google Apps Script が1分おきに取込フォルダを見て、新しいファイルを拾う
  3. 自動Document AI の Enterprise Document OCR が、文字とその位置、手書きかどうか、チェックボックスの状態、画像の品質の点数を返す
  4. 自動Apps Script が、登録票の様式の定義(欄ごとの範囲)と照らし、欄ごとに `filled` / `blank` / `illegible` を付ける
  5. 自動Gemini API が、欄の文字をデータベースの項目にそろえ、履歴書の学歴・職歴・資格を経歴の項目に分ける
  6. 自動必須の欄のうち `blank` と `illegible` のものを、面談の担当への一覧にする
  7. 人コーディネーターが面談の前に一覧を見て、面談の中で本人に聞き取る
  8. 人事務が `illegible` の欄を紙で見て直し、面談で聞き取った内容を足す
  9. 人事務が下書きを確かめ、CSVで求職者データベースへ取り込む
各工程の詳しい説明を読む
  1. 受付で登録票と履歴書を受け取り、クリアファイルに入れて面談の担当へ回す
  2. コーディネーターが登録票を見ながら面談し、聞き取ったことを登録票の余白に書き足す
  3. 面談の後、登録票と履歴書をまとめて事務へ回す
  4. 事務が登録票の項目を、求職者データベースの画面に1項目ずつ打ち込む
  5. 履歴書の学歴・職歴・資格を、データベースの経歴の欄に打ち込む
  6. 空欄や読めない字があれば付箋を貼り、コーディネーターへ戻す
  7. コーディネーターが求職者に電話をして聞き直し、事務が打ち込み直す

(a)記入漏れに気づくのが、面談の後になる。 2番目の面談では希望の条件を聞くことに集中し、登録票の全部の欄が埋まっているかまでは見きれません。 6番目で見つかった空欄は、7番目の電話になります。求職者がその日のうちに電話に出るとは限らず、仕事の紹介がその分だけ遅れます。

(b)登録会の日に事務が足りない。 登録会の日には10人、20人と登録が重なり、打ち込みが翌日、翌々日にずれ込みます。 その間、登録した人は紹介の検索に出てきません。

(c)手書きの字を読み直している。 住所の番地、メールアドレス、電話番号は、1文字違えば連絡がつきません。「1」と「7」、「0」と「6」を見比べながら打つので、手が止まります。

(d)書いてもらわなくてよいことまで書いてある。 履歴書の様式によっては、家族のことや本籍などを書く欄が残っているものがあります。打ち込む側がその都度判断して、データベースに入れないようにしています。

  1. 【人】 受付で登録票と履歴書を受け取り、複合機でスキャンして拠点の取込フォルダに入れる
  2. 【自動】 Google Apps Script が1分おきに取込フォルダを見て、新しいファイルを拾う
  3. 【自動】 Document AI の Enterprise Document OCR が、文字とその位置、手書きかどうか、チェックボックスの状態、画像の品質の点数を返す
  4. 【自動】 Apps Script が、登録票の様式の定義(欄ごとの範囲)と照らし、欄ごとに filled / blank / illegible を付ける
  5. 【自動】 Gemini API が、欄の文字をデータベースの項目にそろえ、履歴書の学歴・職歴・資格を経歴の項目に分ける
  6. 【自動】 必須の欄のうち blank と illegible のものを、面談の担当への一覧にする
  7. 【人】 コーディネーターが面談の前に一覧を見て、面談の中で本人に聞き取る
  8. 【人】 事務が illegible の欄を紙で見て直し、面談で聞き取った内容を足す
  9. 【人】 事務が下書きを確かめ、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で取り込み
役割想定する製品代替候補
OCRGoogle Document AI(Enterprise Document OCR)Azure AI Document Intelligence
生成AIGemini 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どうやって実装するのか

Step1

処理の起点を決める

Google Apps Script の時間主導型トリガーで、1分おきに拠点の取込フォルダを見ます。 登録会では、受付から面談が始まるまでの時間は長くて十数分です。その間に空欄の一覧が面談の担当に届かなければ、聞き取りは面談の後の電話に戻ります。

スキャンは受付で、1人分ずつ行います。 登録票2枚と履歴書をまとめて1つのPDFにし、ファイル名に受付番号を入れます。何人分かをまとめてスキャンすると、どこからどこまでが1人分かを判定する手間が増え、一覧が届くのも遅れます。

1回の実行で処理する件数に上限を置きます。 Apps Script の1回の実行は6分までとされています。1人分の読み取りと項目のそろえには数十秒かかることがあるため、1回に3人分までとし、残りは次の実行に回します。 処理が終わったファイルは処理済みフォルダへ移し、移すのはCSVの下書きと一覧の書き込みまで成功したときだけにします。

Step2

入力データを集める

データ中身取得元
登録票と履歴書のPDF受付番号、拠点、受け付けた日時取込フォルダ
読み取り結果文字と位置、手書きかどうか、チェックボックスの状態、画像の品質の点数Document AI(Enterprise Document OCR)
登録票の様式の定義欄の名前、データベースの項目、ページ上の範囲、必須かどうか、選択肢自社で用意する一覧
データベースの項目の定義項目名、型、選択肢のコード(職種、勤務地、曜日など)求職者データベースの取り込みの仕様
取り込まない項目の一覧履歴書に書かれていてもデータベースに入れない事項自社で決める一覧

質を決めるのは、様式の定義です。 欄の範囲がずれていれば、隣の欄の文字を拾って filled と判定します。様式を改訂したら、定義も同じ日に改訂します。 様式の右下に版の番号を印刷しておき、読み取った版の番号で定義を引き分けます。

いちばん下の一覧は、法令への対応として持ちます。 職業安定法に基づく指針では、人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況を、原則として収集してはならないとされています。履歴書にこれらに当たる記載があっても、データベースに入れる項目に写しません(第13章)。

Step3

データの取得方法を決める

読み取りは、Apps Script から Document AI の処理のAPIを呼ぶだけです。依頼の processOptions.ocrConfig に、次の設定を入れます。

設定値何のためか
enableImageQualityScorestrueページごとの品質の点数を受け取る
hints.languageHints["ja"]日本語の書類であることを伝える
premiumFeatures.enableSelectionMarkDetectiontrueチェックボックスの状態を受け取る
premiumFeatures.computeStyleInfotrue単語ごとの手書きかどうかを受け取る
取るもの応答のどこから何に使うか
文字と位置pages[].tokens[] の layout と boundingPoly の normalizedVertices欄の範囲に入る文字を集める
手書きかどうかpages[].tokens[].styleInfo の handwritten印刷された欄の名前を除く
チェックボックスpages[].visualElements[] の type希望職種・曜日などの選択
品質の点数pages[].imageQualityScoresぼやけ・暗さ・小さな字などの検出
信頼度各要素の layout の confidence読み取りが確かかの判定

位置は、ページの大きさで割った値(normalizedVertices)で扱います。 スキャンの解像度が拠点の複合機ごとに違っても、0から1の値で欄の範囲を定義しておけば同じ定義が使えます。

数字の欄は文字の単位で信頼度を見ます。 電話番号11桁のうち1桁だけ信頼度が低いとき、欄全体としては読めているように見えます。数字の欄は、1文字でも基準を下回れば illegible にします。

Step4

AIへ渡す前に整形する

  1. 形式の確認 … Enterprise Document OCR の対象は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP です。複合機の保存形式は PDF にします
  2. 解像度の確認 … 公式には、OCRの精度のためにスキャンは最低200dpiが望ましいとされています。鉛筆の薄い字を読むなら、300dpiにします
  3. 圧縮の確認 … JPEG のような非可逆の形式は、強く圧縮すると精度が落ちることがあるとされています
  4. ページの種類の判定 … 1ページ目の様式の版の番号を読み、登録票のページと履歴書のページを分けます
  5. 向きの確認 … 逆さまに置かれたページは、読み取りの前に回します
  6. 品質の点数の確認 … 品質の点数が0.5を下回ると、ぼやけ・暗さなどの理由が返るとされています。理由が返ったページは、受付にスキャンのやり直しを知らせます
  7. 受付番号の照合 … ファイル名の受付番号と、登録票に書かれた受付番号が合うかを見ます

6番目を受付に返すのが要です。 求職者がまだ会場にいるうちにスキャンし直せば済みますが、帰ってから気づけば、紙を見直すしかありません。 品質の点数は、そのためにいちばん早く届く合図です。

Step5

AIに処理させる

欄ごとの記入の有無は、AIに判定させません。 様式の定義の範囲に手書きの文字があるかで、Apps Script が決めます。

状態付ける条件(Apps Script が決める)
filled欄の範囲に手書きの文字があり、信頼度が基準を上回る。チェックボックスは1つ以上が記入済み
blank欄の範囲に手書きの文字が無い。チェックボックスがすべて未記入
illegible手書きの文字はあるが信頼度が基準を下回る。数字の欄は1文字でも下回る
not_applicable「なし」「特になし」と書かれている(資格の欄など)

AIにさせるのは、欄ごとの文字をデータベースの項目にそろえることだけです。

させること例
選択肢のコードへのそろえ「フォークリフト」→ 資格のコード、「平日のみ」→ 曜日のコード
表記のそろえ全角の数字を半角に、「〒」を除く
履歴書の経歴の分け方学歴と職歴の行を分け、年月・学校名や会社名・入学卒業や入社退社を項目にする
手書きの文字の読み直し欄の文字と、前後の欄から候補を出すだけ。確定はしない
させないこと理由
空欄を埋める本人に聞くための一覧が消える
読めない字の確定電話番号とメールアドレスは1文字違えば連絡がつかない
職歴の空白期間の解釈面談で本人から聞くこと
取り込まない項目の転記法令に基づく指針で収集してはならないとされる事項がある
仕事の向き不向きの判断この構成の範囲の外

1行目がいちばん起きやすい失敗です。 生年月日から年齢の欄を、住所から最寄り駅の欄を、AIは善意で埋めます。埋まった欄は blank の一覧から消え、面談で聞く機会がなくなります。 年齢の計算は必要ならデータベースの側で行います。

Step6

指示内容を固定する

あなたは人材派遣会社の登録の事務で、求職者が手書きした登録票と履歴書を、
求職者データベースの項目にそろえる立場です。
OCRが返した欄ごとの文字だけを見てください。推測で埋めないでください。

【やること】
1. 登録票の欄ごとの文字を、データベースの項目と選択肢のコードにそろえる
2. 履歴書の学歴・職歴の行を、年月・名称・区分(入学/卒業/入社/退社)に分ける
3. 資格を、資格のコードにそろえる

【厳守事項】
- status が blank の欄は、value を空のままにしてください。
  ほかの欄から計算したり推し量ったりして埋めないでください。
  (例:生年月日から年齢を、住所から最寄り駅を埋めない)
- status が illegible の欄は、value を空にし、candidates に読みの候補を
  最大3つまで入れてください。候補のどれかに決めないでください。
- 電話番号、メールアドレス、郵便番号、番地は、読み取った文字をそのまま写してください。
  桁を補う、よくある形に直すことをしないでください。
- 選択肢のコードに当てはまらない記載は、code を空にし、raw に原文を残してください。
- 職歴の空白期間や転職の理由について、解釈や所見を書かないでください。
- 「取り込まない項目の一覧」に当たる記載は、どの項目にも写さないでください。
  記載があったことだけを excluded_found に true で示してください。
- 求職者の向き不向きや、紹介の可否について書かないでください。

【欄ごとの文字と状態】{fields}
【データベースの項目の定義】{db_schema}
【取り込まない項目の一覧】{excluded_items}

「生年月日から年齢を埋めない」と例を挙げているのは、例が無いと止まらないからです。 「推測で埋めない」だけでは、計算で出せるものは推測ではないと扱われます。禁じるのは、空欄を何かで埋めることそのものです。

取り込まない項目について「記載があったこと」だけを返させるのは、紙の扱いを決めるためです。 写さないだけでは、その履歴書の写しがドライブに残ります。記載があった件だけ、事務が保管のしかたを見直せます。

Step7

出力形式を固定する

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車・バイク・公共交通のどれか
Step8

システムへ連携する

つなぎ先方式内容
取込フォルダApps Script の時間主導型トリガー新しいPDFを拾う
Document AIAPI呼び出し文字と位置・手書きかどうか・チェックボックス・品質の点数
Gemini APIAPI呼び出し(構造化出力)項目へのそろえと経歴の分け方
面談の担当Gmail とスプレッドシート空欄と読めない欄の一覧
受付Gmailスキャンのやり直しの知らせ
求職者データベースCSVの取り込み(人が行う)確認済みの登録データ

一覧の宛先は、その日の面談の担当です。 拠点ごとの登録会の担当表をスプレッドシートで持ち、受付番号から担当を引きます。拠点の全員に送ると、誰も見ない一覧になります。

求職者データベースへは、この構成から書き込みません。 既存のシステムのCSVの取り込みは事務が行い、取り込む前に illegible が残っていないことを確かめます。

Step9

人が確認する

人が確かめるのは2か所です。

  1. 面談の前に、コーディネーターが一覧を見る … blank の欄を面談の中で本人に聞き、登録票の余白に書き足します
  2. 面談の後に、事務が下書きを確かめる … illegible の欄を紙で見て直し、面談で書き足された内容を足します。電話番号とメールアドレスは、filled でも紙と見比べます
  3. コードに当てはまらなかった記載を見る … raw に残った原文を読み、コードを選ぶか、データベースのメモの欄に入れます
  4. excluded_found が true の件を見る … 写しの保管のしかたを決めます
  5. 直したら記録する … どの欄を、何から何へ直したかを残します

2番目の電話番号とメールアドレスの見比べは、省かないでください。 信頼度が基準を上回っていても、1文字の違いで連絡がつかなくなる欄です。 ここに数十秒かけることが、後の聞き直しの電話を減らします。

目標は、360件をならして1件3分です。 事務の確認は、filled の欄を流し見て、印の付いた欄だけを紙と見比べる作業になります。

Step10

例外に対処する

起きること対応
品質の点数が低いぼやけ・暗さなどの理由を受付に知らせ、会場にいるうちにスキャンし直す
様式の版の番号が読めない定義を引けないため、全欄を illegible にして事務へ
欄の外にはみ出して書かれている範囲に一部しか入らない。隣の欄と重なる文字は illegible
履歴書を持たずに来たその場で書いた用紙も同じ流れに入れる
履歴書が自由な様式範囲の定義は使わず、全文から経歴を分ける。経歴は全件を事務が確かめる
受付番号が合わない別の人の書類が混ざった可能性。処理を止めて受付へ
取り込まない項目の記載があるexcluded_found を立て、写さない
APIが応答しない、6分を超える取込フォルダに残す。処理済みへ移すのは書き込み成功時だけ

上から3行目までは、様式とスキャンの問題です。 欄の枠を大きくする、記入例を様式に刷る、鉛筆ではなくボールペンを置くといった直し方のほうが、読み取りの精度を上げるより効きます。

Step11

記録を残す

  • 元のPDFと、受付番号・拠点・受け付けた日時
  • Document AI が返した Document のJSONの全文と、品質の点数
  • 欄ごとの状態と、そのとき使った様式の定義の版
  • Gemini API が返した fields と career
  • 面談の担当への一覧と、面談で聞き取って書き足した内容
  • 事務が直した記録と、CSVを取り込んだ日時

様式の定義の版を残すのは、様式の改訂で欄の範囲が変わるためです。 古い定義で新しい様式を読むと、blank が大量に出ます。版が残っていれば、どの日の分を読み直せばよいかが決まります。

保存の期間を決めておきます。 指針では求職者の個人情報を適正に管理するために必要な措置を講じるとされています。登録をやめた人の書類の写しと読み取り結果をいつ消すかを、データベースの側の扱いとそろえて決めます。

04実装レベルの3段階

最小構成:登録票を手でAIの画面に貼り、欄ごとの記入の有無を表にさせる / 1件ごとの空欄の洗い出し
半自動化:上記+Document AI のAPIを呼び、欄ごとの状態と文字をスプレッドシートに書き出す / 読み取りと空欄の判定
本格構成:上記+取込フォルダを起点に1分おきに動かし、面談の前に一覧を届け、取り込み用のCSVまで作る / 転記と差し戻しの全体

最小構成では件数がさばけません。 確かめるための段階です。 半自動化で、1件10分が6分程度になります。 空欄の判定と文字の読み取りは自動になりますが、データベースの項目へのそろえと打ち込みが残ります。本格構成で3分になり、この段階が本記事の想定です。 差が大きいのは、40を超える欄の打ち込みが、1件ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、illegible の多い欄と、はみ出して書かれやすい欄が先に分かります。様式の枠をそこで直してから本格構成に進むほうが、一覧の空振りが減ります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
5 名
月間件数
360 件
1件あたり現在時間
10 分
1件あたり導入後時間
3 分
現在  360件 × 10分 ÷ 60 = 60 時間/月
導入後 360件 × 3分 ÷ 60 = 18 時間/月
月間削減時間
42h
削減率
70%
年間削減時間
504h
年間金額換算(時間単価3,000円)
151万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 拠点で登録会を開き、来場した求職者に紙の登録票(自社の様式)と手書きの履歴書を書いてもらっている人材派遣・人材紹介の会社。登録が月に数百件あり、面談の後にコーディネーターや事務の担当が求職者データベースへ手で打ち込んでいる場合。記入漏れに面談の後で気づき、電話で聞き直している場合。Google Workspace を使っており、登録票の様式を自社で決められる場合。
向いていない
  1. 登録の大半をWebの登録フォームで受け付けており、紙の登録票がほとんど無い場合。登録が月に数十件で、手で打ち込めば足りる場合。登録票の様式が拠点ごとにばらばらで、自社の様式に統一できない場合。なお、求職者を紹介できるか、どの仕事に合うかの判断はこの構成では代替できません。

07最小構成で試す方法

  1. 先月の登録から、空欄が多かったもの、字が読みにくかったものを中心に20件を選ぶ
  2. その20件について、事務が付箋を貼った欄を書き出す
  3. 登録票のスキャンを、1件ずつ手元のAIサービスの画面に貼り付ける
  4. 「この登録票の欄ごとに、記入があるか、空欄か、読めないかを表にしてください。空欄の欄を、ほかの欄から推し量って埋めないでください。読めない字は候補を挙げるだけにしてください」と指示する
  5. 出てきた表を、事務の付箋と突き合わせる

空欄が多かった件を選ぶのが要です。 全部埋まっている登録票では、空欄を埋めてしまう失敗が見えません。

出てきた内容判断
事務の付箋と同じ欄が空欄・読めないと出たOCRと様式の定義の連携に進む
空欄をほかの欄から埋めた指示で直る。ただし本番では空欄の判定を座標で行う
手書きの字がほとんど読めないスキャンの設定と筆記具が先。 AIの問題ではない

2行目は、本番の設計の理由そのものです。 画面に貼る方法では空欄の判定もAIに任せることになり、埋めてしまう失敗を指示だけで抑えることになります。 本番では、その判定を座標の計算に移します。

08実装時につまずきやすいポイント

問題対策
空欄がAIに埋められる空欄の判定を座標で行い、AIに status を書き換えさせない
項目名と値の組で空欄を探してしまうForm Parser は値が空のキーと値の組を確実には解析できないとされる。座標で見る
印刷された欄の名前を記入と数える手書きかどうかの判定で、印刷の文字を除く
欄の外にはみ出した字隣の欄と重なる文字は illegible にする
電話番号の1文字違い数字の欄は文字の単位で信頼度を見る。filled でも紙と見比べる
様式の改訂で定義がずれる様式に版の番号を刷り、定義を引き分ける
一覧が面談の後に届く1分おきに動かし、受付ですぐスキャンする
何人分かをまとめてスキャン1人分ずつ、受付番号をファイル名に入れる
書く必要のない事項がデータベースに入る取り込まない項目の一覧を渡し、写させない
鉛筆の薄い字が読めない300dpiでスキャンし、ボールペンを置く

上の2行が、この構成の失敗のほとんどです。 どちらも、空欄を空欄のまま拾うことに失敗しています。判定の根拠を、AIの判断ではなく座標の計算に置いてあるかどうかで、運用に乗るかが決まります。

7行目は、仕組みの外で起きます。 受付が登録票をまとめて後でスキャンする運用だと、どれだけ早く読み取っても一覧は面談に間に合いません。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 求職者の氏名、生年月日、住所、電話番号、メールアドレス、学歴・職歴、資格、希望の条件です。すべて個人の情報で、求職の事実そのものも本人にとって知られたくない情報です。

  1. 収集の範囲を、業務の目的に必要な範囲に限る … 職業安定法では、業務の目的の達成に必要な範囲内で求職者の個人情報を収集し、収集の目的の範囲内で保管・使用しなければならないとされています。データベースに入れる項目を、紹介と派遣の業務に要るものに絞ります
  2. 収集してはならないとされる事項を写さない … 指針では、人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況が挙げられています。登録票の様式からこれらの欄を除き、履歴書に記載があってもデータベースに写しません
  3. 有料の利用区分で使う … Gemini API の追加利用規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスでは改善に使われ、人が読むことがあるとされています。無料のサービスには個人の情報を送らないよう書かれています
  4. AIに渡す範囲を絞る … 項目のそろえに氏名は要りません。氏名と連絡先の欄は Apps Script の側で扱い、AIには選択肢と経歴の欄だけを渡す設計にできます
  5. 取込フォルダの権限を拠点ごとに絞る … ほかの拠点の登録者の書類を見られる状態は避けます

誤りが起きた場合のリスクは、連絡先を読み違えて登録者と連絡がつかなくなることと、空欄を埋めて本人が言っていない条件で紹介することの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技術仕様の確認日・参考情報

技術仕様確認日:2026-10-06/最終更新:2026-10-06
確認した内容情報源確認日
Enterprise Document OCR が手書きを含む文字を200を超える言語で読み取り、読みやすさから品質を評価すること。言語の一覧で日本語に手書き対応の印が付くことGoogle Cloud: Processor list2026-10-06
品質の点数が0.5を下回ると理由が返ること。言語のヒント。追加の機能(チェックボックスの抽出が filled_checkbox/unfilled_checkbox を位置つきで返すこと、フォントの書式の検出が単語ごとに手書きかどうかを返すこと)と、v2.0 以降の版で使えること。対応形式Google Cloud: Enterprise Document OCR2026-10-06
Form Parser が、空欄の書式のように値が記入されていないキーと値のペアを確実には解析できないことGoogle Cloud: Form Parser2026-10-06
スキャンは最低200dpiが望ましいこと。非可逆の圧縮で精度が落ちうることGoogle Cloud: Supported files2026-10-06
指定したJSONスキーマに従う応答を生成させられ、enum と required を使えること。値はアプリケーションで検証すべきことGemini API: Structured outputs2026-10-06
有料サービスではプロンプトと応答を製品の改善に使わず、無料サービスでは改善に使われ人が読むことがあり、個人の情報を送らないよう求めていることGemini API 追加利用規約2026-10-06
Apps Script の1回の実行が6分までであることApps Script: Quotas for Google Services2026-10-06
時間主導型のトリガーが毎分から月1回までの間隔で動かせることApps Script: Installable triggers2026-10-06
業務の目的の達成に必要な範囲内で求職者の個人情報を収集・保管・使用すること。指針で原則として収集してはならないとされる事項(人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況)。適正な管理の措置北海道労働局: 求職者の個人情報の取扱いについて2026-10-06

登録票に設ける項目と、求職者の個人情報の保管の期間は、社内の担当部署と社会保険労務士・弁護士に確かめてください。 本記事は公的機関と各製品の公式ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0456)についてのご相談はこちらから。

AI活用について相談する
目次