派遣スタッフから毎月届く手書きのタイムシートを読み取り、派遣先への請求データと給与計算用の勤怠データにそろえる
派遣スタッフから毎月届く手書きのタイムシートを読み取り、日ごとの始業・終業・休憩を標準の項目にそろえます。そこから派遣先への請求データと給与計算用の勤怠データを作り、読めない欄や合計が合わないものだけを人に回します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- IT・SaaS/人材
- 対象部門
- 人事/経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 届いたタイムシートをスキャンするか保存して、月ごとのフォルダに入れる
- 1枚ずつ開き、派遣契約の一覧を引いて、単価と区分の決まりを確かめる
- 日ごとの始業・終業・休憩を読み、請求用の表に打ち込む
- 同じ数字を、給与用の表に打ち込み直す。時間外・深夜・休日の区分は給与側の決まりで付け直す
- 自分で足した合計と、スタッフが書いた合計を見比べる。派遣先の確認印があるかを見る
- 合わないもの、読めないもの、印が無いものをメモし、スタッフや派遣先へ確認する
- そろったものから販売管理システムと給与計算ソフトへ取り込む
- 人紙をスキャンし、FAXのPDFと写真とあわせて受付フォルダに保存する
- 自動定時実行のスクリプトが新しいファイルを見つけ、形式を確かめる。写真は画像の品質を測る
- 自動品質が足りない写真は、読み取りに進めず「撮り直し」の候補に回す
- 自動OCRが表の行・セルと読み取りの信頼度を返す
- 自動派遣契約の一覧を引き、派遣先の書式の対応表を選ぶ。未登録の書式だけ、生成AIに列見出しの対応付けの案を作らせる
- 自動日ごとの始業・終業・休憩を標準の項目にそろえ、実働時間を計算して、スタッフが書いた合計と突き合わせる
- 自動確認印の欄を画像として切り出す
- 自動1枚ごとに `ready` / `unreadable` / `mismatch` / `no_stamp` / `needs_human` を付け、`ready` のものから請求用と給与用の取り込みデータを作る
- 人担当者が、`ready` 以外の一覧と、切り出した確認印の画像の一覧を確かめる
- 人理由ごとの差し戻し文の下書きを直し、スタッフまたは派遣先へ送る
- 人取り込みデータを販売管理システムと給与計算ソフトへ取り込む
各工程の詳しい説明を読む
- 届いたタイムシートをスキャンするか保存して、月ごとのフォルダに入れる
- 1枚ずつ開き、派遣契約の一覧を引いて、単価と区分の決まりを確かめる
- 日ごとの始業・終業・休憩を読み、請求用の表に打ち込む
- 同じ数字を、給与用の表に打ち込み直す。時間外・深夜・休日の区分は給与側の決まりで付け直す
- 自分で足した合計と、スタッフが書いた合計を見比べる。派遣先の確認印があるかを見る
- 合わないもの、読めないもの、印が無いものをメモし、スタッフや派遣先へ確認する
- そろったものから販売管理システムと給与計算ソフトへ取り込む
(a)同じ数字を2回打ち込んでいる。 3番と4番は同じタイムシートの同じ欄を読んでいます。600枚で2回ずつ打てば、打ち間違いの機会も2倍です。 1日分の時刻が請求と給与でずれていても、表の中では辻褄が合うので気づけません。
(b)合計の食い違いが、請求の後に分かる。 スタッフが書いた合計は、休憩の引き忘れや足し間違いで合わないことがあります。忙しい週は5番が省かれ、派遣先から「確認した時間数と違う」と言われて初めて分かります。
(c)読めない字の扱いが人によって違う。 「7」と「1」、「0」と「6」の書き分けがあいまいな手書きは珍しくありません。ある担当は前後の日から推して埋め、別の担当はスタッフに確認します。推して埋めた1日が、そのまま請求と給与の両方に入ります。
(d)差し戻しの相手を取り違える。 確認印が無いものをスタッフに返すと、スタッフが派遣先でもらい直すことになります。派遣先の担当者に直接確かめたほうが早くても、連絡先が分かりません。
- 【人】 紙をスキャンし、FAXのPDFと写真とあわせて受付フォルダに保存する
- 【自動】 定時実行のスクリプトが新しいファイルを見つけ、形式を確かめる。写真は画像の品質を測る
- 【自動】 品質が足りない写真は、読み取りに進めず「撮り直し」の候補に回す
- 【自動】 OCRが表の行・セルと読み取りの信頼度を返す
- 【自動】 派遣契約の一覧を引き、派遣先の書式の対応表を選ぶ。未登録の書式だけ、生成AIに列見出しの対応付けの案を作らせる
- 【自動】 日ごとの始業・終業・休憩を標準の項目にそろえ、実働時間を計算して、スタッフが書いた合計と突き合わせる
- 【自動】 確認印の欄を画像として切り出す
- 【自動】 1枚ごとに
ready/unreadable/mismatch/no_stamp/needs_humanを付け、readyのものから請求用と給与用の取り込みデータを作る - 【人】 担当者が、
ready以外の一覧と、切り出した確認印の画像の一覧を確かめる - 【人】 理由ごとの差し戻し文の下書きを直し、スタッフまたは派遣先へ送る
- 【人】 取り込みデータを販売管理システムと給与計算ソフトへ取り込む
9番目が、この設計の分かれ目です。人が1枚ずつ開くのは ready 以外だけです。 全件を開いて読み直す設計にすると、90.0時間はほとんど減りません。
8番目の判定を計算の結果で決めているのも意図してのことです。 合計が合うかは引き算で決まり、AIに尋ねる必要がありません。
02今回想定するシステム構成
タイムシート(紙・FAX・スマートフォンの写真・PDF) │ 紙はスキャン、写真はメールから保存 ▼【トリガー】定時実行で受付フォルダの新しいファイルを検知 Google Apps Script ── 形式・ページ数の確認 ├──▶ 写真 ── Google Document AI(Enterprise Document OCR の画像品質スコア) │ └──▶ 品質不足 ──▶ 撮り直しの候補へ ▼ Google Document AI(Form Parser) │ 表の行・セル・信頼度、キーと値のペアを返す ▼ Google Apps Script ── 契約一覧と書式の対応表で日ごとの行にそろえる ├──▶ 未登録の書式・備考欄 ──▶ Gemini API ── 対応付けと区分の候補 ▼ Google Apps Script ── 実働時間の計算と、書かれた合計との検算 ▼ 判定(ready / unreadable / mismatch / no_stamp / needs_human) ▼ 【人が ready 以外と確認印の画像を確認】 ├──▶ Gemini API ── 理由ごとの差し戻し文の下書き └──▶ 請求用・給与用の取り込みデータ ──▶ 販売管理システム/給与計算ソフト
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 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 ドライブ(受付フォルダ・処理済みフォルダ) | Microsoft SharePoint |
販売管理システムと給与計算ソフトは、新しく足すものではありません。 取り込みは担当者が行います。派遣契約の一覧に、派遣先ごとの書式の対応表と、確認印の欄の位置、派遣先の勤怠担当者の連絡先の3つを足すのが最初の準備作業です。
OCRに Form Parser を選ぶのは、タイムシートが「表のある書式」だからです。 Form Parser は、キーと値のペア、表、選択マーク、テキストを取り出すとされています。上の欄の「氏名」「派遣先」「対象月」はキーと値のペアとして、日付ごとの明細は表として読みます。
日本語の手書きが読めるかは、最初に確かめました。 プロセッサ一覧の対応言語の表には「手書きに対応しているか」の列があり、Form Parser と Enterprise Document OCR のどちらでも、日本語に対応の印が付いています。 ただし精度は字の書き方と画像の質に左右されるので、信頼度で人に回す仕組みを前提にします。
注意が要るのは、表の形の制約です。 Form Parser の表は行や列をまたぐセルを認識せず、rowSpan と colSpan は常に1とされています。週の小計の欄が複数の行をまたぐ書式では、その部分が崩れます。書式の対応表に「読み飛ばす行」を持たせるのはこのためです。
ページ数の上限は同期処理で15ページで、1人1〜2ページのタイムシートには足ります。 対応地域は asia-southeast1 us eu など8つで、どこで処理させるかは第13章で扱います。
03どうやって実装するのか
処理の起点を決める
受付フォルダを、締め日の翌日から数営業日のあいだは15分ごとの定時実行で見に行きます。 月の残りは1日1回に落とします。届いた順に処理すると、差し戻しを早く出せます。 差し戻しが1日遅れると、スタッフが確認印をもらい直す時間がそのまま削られます。
入る経路は、スキャンした紙、FAXのPDF、メールの写真、PDFの4つです。いずれも同じ受付フォルダに入れ、ファイル名の先頭に経路の記号を付けます。経路ごとにフォルダを分けると、どれか1つだけが処理されない日ができます。
処理済みフォルダへ移すのは、判定まで書き終えたときだけです。 受付フォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| タイムシートのファイル | PDFまたは画像。受け取った日時と経路 | 受付フォルダ |
| 読み取り結果 | キーと値のペア、表の行とセル、テキストと信頼度 | Google Document AI(Form Parser) |
| 画像の品質 | ページごとの品質スコアと、検出された欠陥の種類 | Google Document AI(Enterprise Document OCR、写真のみ) |
| 派遣契約 | スタッフ、派遣先、契約期間、所定の始業・終業・休憩、請求の単価と区分、端数の扱い | 派遣契約の一覧 |
| 書式の対応表 | 派遣先ごとの列見出しと標準の項目の対応、休憩の書き方(時刻か分か)、確認印の欄の位置、読み飛ばす行 | 派遣契約の一覧に足す表 |
| 給与の区分の決まり | 時間外・深夜・休日の区分の付け方、給与側の端数の扱い | 自社の就業規則から作る表 |
質を決めるのは、下の3つです。 対応表が無ければ、「拘束」が実働なのかを毎回推すことになります。請求と給与の区分を別の表で持つのは、同じ1日の残業が、契約では「時間外」、給与では「法定内の残業」と別の扱いになることがあるためです。
データの取得方法を決める
スクリプトから Form Parser を呼び、結果から次のものを取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 氏名・派遣先・対象月 | pages[].formFields の fieldName と fieldValue | 派遣契約の一覧を引くキー |
| 明細の見出し | pages[].tables[].headerRows | 書式の対応表との照合 |
| 日ごとの行 | pages[].tables[].bodyRows の cells | 日付・始業・終業・休憩・備考 |
| セルの信頼度 | 各要素の layout の confidence | 読めないセルの検出 |
| 確認印の欄の位置 | layout の boundingPoly | 印の欄の切り出し |
派遣契約の一覧は、スタッフ番号が先、氏名が後で引きます。 番号の欄が無い書式では、氏名と派遣先と対象月の3つで引きます。氏名だけで引くと、同姓同名や月の途中で派遣先が変わったスタッフで取り違えます。
キーと値のペアには既知の弱点があります。 Form Parser の制限事項には、値が空欄のキーと値のペアは確実には解析されないとあります。返らなかった項目は「空欄」として扱い、読み取りの失敗とは分けて記録します。
写真のときだけ、先に Enterprise Document OCR の画像品質スコアを取ります。 enableImageQualityScores を有効にするとページごとに0〜1のスコアが返り、0.5を下回ると、ぼやけ・暗さ・反射などの欠陥の種類が返ります。撮り直しを頼むときに、何が悪かったかを伝えられます。
AIへ渡す前に整形する
- 形式の確認 … PDF、TIFF、JPEG、PNG、BMP、WebP などが対応する形式です。一覧にない形式は変換してから入れます
- 解像度の確認 … スキャンは最低200dpi、300dpi以上が一般に最も良い結果になるとされています。複合機の既定の設定を先に見直します
- 画像の品質の確認(写真のみ) … 品質スコアが基準を下回るものは、読み取りに進めず
unreadableの候補にします - ページの確認 … 2ページに分かれる書式は1件として扱い、複数のスタッフがまとめてスキャンされたものはページで分けます
- 重複の確認 … 同じスタッフ・同じ対象月のタイムシートが既にあれば、差し替えの印を付けて人へ回します
- 書式の判定 … 見出しの文字列を書式の対応表と照らし、どの書式かを決めます
2番目と3番目を軽く見ないでください。 手書きの細い数字は、解像度が足りないだけで「1」と「7」の区別が消えます。5番目は、締め後に多い送り直しへの備えです。 差し替えの印が付いたものは、自動で上書きしません。
AIに処理させる
させるのは3つだけです。 書式の対応表に無い書式の列見出しを標準の項目に対応付ける案、備考欄の自由な書き込みを区分コードに寄せる候補、そして差し戻し文の下書きです。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 未登録の書式の列見出し | 見出しの文字列を、標準の項目(日付・始業・終業・休憩・実働・備考ほか)に対応付ける案を作る | 当てはまらない見出しは unmapped |
| 休憩の書き方 | 見出しと値の形から、時刻の範囲か分数かを見分ける | 決められなければ unknown |
| 備考欄の書き込み | 「有休」「午前休」「遅刻」「早退」「休出」「振休」などを区分コードの候補に寄せる | 当てはまらなければ other と原文 |
| 差し戻し文 | 判定の理由と該当する日を、相手(スタッフか派遣先か)に合わせた文面にする | 理由が複数あれば、相手ごとに分ける |
対応付けの案は、そのまま使いません。 担当者が確かめて対応表に登録し、次の月からは対応表だけで読みます。 同じ書式が月によって違う読まれ方をするのを防ぐためです。
| させないこと | 理由 |
|---|---|
| 実働時間や合計の計算 | 引き算と足し算はスクリプトなら必ず同じ答えになる |
| 読めない数字の補完 | 前後の日や所定の時刻から推して埋めると、見つけたかった不備が消える |
| 時間外・深夜・休日の区分の当てはめ | 契約と就業規則の決まりで、規則として持つ |
| 確認印があるかの判定 | 切り出した画像を人が見る |
| 食い違いをどちらの数字で確定するか | 派遣先とスタッフの両方に確かめて人が決める |
2行目がいちばん起きやすい失敗です。 一部が読めない「9:0□」は、所定の始業が9時なら「9:00」と埋められ、9時5分に来た日の記録が消えます。
指示内容を固定する
列見出しの対応付けと備考欄の区分は、同じ呼び出しで行います。
あなたは人材派遣会社の業務管理課で、派遣スタッフのタイムシートを
標準の項目にそろえる担当です。
OCRが返した表の見出しと、備考欄の文字列だけを見て答えてください。
推測で値を作らないでください。
【1. 列見出しの対応付け】
次の見出しの一覧の1つずつについて、標準の項目のどれに当たるかを選んでください。
標準の項目:work_date(日付)/ start_time(始業)/ end_time(終業)/
break(休憩)/ worked(実働)/ overtime(残業)/ late_night(深夜)/
note(備考)/ staff_sign(本人の確認)/ client_stamp(派遣先の確認)
- どれにも当たらない見出しは unmapped にしてください。
- 1つの見出しを2つの項目に割り当てないでください。
- 休憩が「12:00〜13:00」のような時刻の範囲で書かれているか、
「60」のような分で書かれているかを、値の例から判断し、
break_format に range / minutes / unknown のどれかを入れてください。
- 「拘束時間」「在社時間」を worked にしないでください。
休憩を引く前の時間です。迷ったら unmapped にしてください。
【2. 備考欄の区分】
次の備考の文字列の1つずつについて、区分コードの候補を選んでください。
区分コード:paid_leave(有給休暇)/ half_am(午前休)/ half_pm(午後休)/
late(遅刻)/ early_leave(早退)/ holiday_work(休日出勤)/
comp_off(振替休日)/ absence(欠勤)/ other(その他)
- 書かれていない区分を補わないでください。空欄は空欄のまま返してください。
- 2つの区分が書かれていれば、両方を返してください。
- 区分を決めた根拠の文字列を evidence にそのまま写してください。
【厳守事項】
- 時刻や時間数を計算しないでください。読めない数字を補わないでください。
- 時間外か、深夜か、休日かの判断をしないでください。
- 派遣先の確認印があるかどうかを書かないでください。
【見出しの一覧】{headers}
【値の例(先頭3行)】{sample_rows}
【備考の一覧】{notes}
「拘束時間を worked にしない」を明記しないと、worked を選びがちです。 見出しに「時間」と付き、値が時間数だからです。取り違えると、休憩の分だけ請求も給与も多くなります。
「計算しない」を2か所に書いているのは、 備考の「1時間早退」から終業の時刻を書き換えて返すことがあるためです。区分を付けることと時刻を直すことは別の仕事です。
出力形式を固定する
生成AIからは、次の形のJSONで受け取ります。 Gemini API の構造化出力で、mime_type に application/json を指定してスキーマを渡し、enum で標準の項目と区分コードの値を縛ります。
{
"format_id": "",
"header_map": [
{ "header": "", "field": "start_time | end_time | break | worked | unmapped", "evidence": "" }
],
"break_format": "range | minutes | unknown",
"notes": [
{ "row_date": "", "raw": "", "codes": ["paid_leave"], "evidence": "" }
]
}
スクリプトが最後に組み立てる1件の結果は、次の形です。
{
"sheet_id": "",
"staff_no": "",
"client_id": "",
"month": "2026-09",
"days": [
{ "date": "2026-09-01", "start": "09:00", "end": "18:00", "break_min": 60,
"worked_min": 480, "note_codes": [], "cell_confidence": 0.97, "status": "ok | unreadable | blank" }
],
"total_written_min": 9600,
"total_calc_min": 9600,
"stamp_crop": "crops/2026-09/xxxx.png",
"verdict": "ready | unreadable | mismatch | no_stamp | needs_human",
"reasons": []
}
1つ目の理由は、AIの出力と計算の結果を別の層に置けることです。 header_map と notes はAIが埋め、worked_min はスクリプトが計算し、verdict は規則で決めます。端数の扱いが変わっても、直すのは規則だけです。
2つ目は、日ごとの status で読めなかった日と空欄の日を分けられることです。 unreadable は信頼度が低い日、blank は何も書かれていない日で、後者は休みの日かもしれないので契約の勤務日と照らします。
3つ目は、請求と給与の両方を同じ days から作れることです。 1日分の時刻が請求と給与でずれることが起きません。
verdict | 条件 |
|---|---|
ready | すべての日が ok か blank で、total_written_min と total_calc_min が一致 |
unreadable | unreadable の日が1日以上ある |
mismatch | 読めているのに、書かれた合計と計算した合計が合わない |
no_stamp | 確認印の欄の画像を人が見て、印が無いと判断したもの |
needs_human | 書式が未登録、契約が引けない、差し替えの印がある |
要は、mismatch と unreadable を混ぜないことです。 読めない日が1日でもあれば、合計は比べようがありません。unreadable を先に判定し、すべて読めたものだけで合計を比べます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ | 定時実行のスクリプトで検知 | 新しいファイルを見つけ、処理済みへ移す |
| Google Document AI | API呼び出し | 表・キーと値・信頼度、写真の画像品質スコアを返す |
| 派遣契約の一覧 | スプレッドシートの読み取り | 契約、書式の対応表、確認印の欄の位置を引く |
| Gemini API | API呼び出し(構造化出力) | 列見出しの対応付け、備考欄の区分、差し戻し文 |
| 販売管理システム | 取り込み用のCSV | ready のものを、派遣先・契約ごとの区分と時間数で |
| 給与計算ソフト | 取り込み用のCSV | ready のものを、スタッフごとの区分と時間数で |
販売管理システムと給与計算ソフトへは、直接書き込みません。 書き込みまで自動にすると、読み取りの誤りが請求書と給与明細まで一息に進みます。
請求用と給与用のCSVは、同じ days から別々の規則で作ります。 請求側は契約の単価と区分と端数の扱い、給与側は就業規則から作った区分の表です。どちらも表として持ち、スクリプトに書き込みません。 書式の対応表への登録も、担当者が確かめてから手で行います。
人が確認する
人が1枚ずつ開くのは、ready 以外のものだけです。 ready のものは、確認印の画像を一覧で流し見ます。
- 確認印の画像の一覧を見る … 切り出した印の欄を1画面に数十枚ずつ並べ、印が無いものに
no_stampを付けます。 全件が対象ですが1枚数秒です unreadableの日を確かめる … 該当するセルの画像を見て、人の目で読めるなら直し、読めないならスタッフに確認します。 推して埋めませんmismatchの内訳を見る … 計算した合計と書かれた合計の差が、休憩の引き忘れか、足し間違いか、1日分の読み違いかを見ます- 差し戻し文を直して送る … 理由ごとに、スタッフ宛てか派遣先宛てかが分かれた下書きを直します。送信は人が行います
- 読み取りを直したら記録する … どの日のどの欄を、何から何に直したかを残します
1番目を自動にしないのは、印の形がそろっていないからです。 朱肉の印、手書きの署名、電子承認の印字があり、どれを確認とみなすかは派遣先との取り決めです。
目標は、600枚をならして1枚3分です。 ready 以外が2割前後という想定で、それより多い月は、写真の品質が落ちているか、書式の対応表が足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 写真の品質スコアが基準を下回る | 検出された欠陥の種類を添えて、スタッフに撮り直しを依頼 |
| 書式が対応表に無い | needs_human。生成AIの対応付けの案を担当者が確かめて登録する |
| 週の小計の欄が複数の行をまたぐ | 表の行が崩れる。対応表の「読み飛ばす行」で外す |
| 氏名・派遣先・対象月の欄が返らない | 空欄として扱い、読み取りの失敗と分けて人へ |
| スタッフと派遣契約が引けない | needs_human。月の途中の派遣先の変更をまず疑う |
| 同じスタッフ・同じ月の差し替えが届く | 自動で上書きしない。前の版との差を出して人へ |
| OCRやAPIが応答しない | 受付フォルダに残す。処理済みへ移すのは判定まで終えたときだけ |
| 生成AIの対応付けが標準の項目に無い値を返す | 採用せず unmapped として人へ |
上から2行目までが大半を占めます。 どれも写真の撮り方と対応表の整備の問題で、撮り方の見本を1枚配るほうが読み取りの工夫より効きます。
記録を残す
- 元のファイルと、受け取った日時・経路(紙/FAX/写真/PDF)
- OCRが返したJSONの全文と、写真の画像品質スコア
- 生成AIが返した対応付けの案と区分の候補、担当者が登録した書式の対応表の版
- 日ごとの結果(
days)、判定(verdict)、そのとき参照した派遣契約の内容 - 人が読み取りを直した記録 … どの日のどの欄を、何から何に直したか
- 差し戻した日時、相手(スタッフ/派遣先)、理由、再提出されたファイルとの対応
- 書式ごと・経路ごとの
unreadableの発生率
4つ目で「そのときの契約」を残すのは、契約が月の途中で変わるためです。 最後の行は、書式を変えてもらう相談の材料になります。
04実装レベルの3段階
最小構成では枚数がさばけません。 確かめるための段階です。 半自動化で、1枚9分が5分程度になります。 請求用と給与用への振り分けと、差し戻しの連絡が手作業で残ります。本格構成で3分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unreadable の多い書式が先に分かります。そこを直してから進むほうが、差し戻しの空振りが減ります。
05工数削減シミュレーション
導入後 600件 × 3分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 稼働中の派遣スタッフが数百名いて、月末から月初にかけて紙・FAX・スマートフォンの写真・PDFのタイムシートがまとめて届く人材派遣会社。派遣先ごとに書式が違い、業務担当が1枚ずつ請求用と給与用の2つの表へ打ち込んでいる場合。派遣先の確認印の有無や合計時間の食い違いを、請求書を出した後に指摘されることがある場合。客先常駐の技術者から作業報告書を毎月受け取るIT企業。
- 派遣先の勤怠システムやスタッフ向けの打刻アプリから勤怠データをそのまま受け取れており、紙のタイムシートがほとんど無い場合。稼働人数が数十名で、手入力で足りる場合。なお、時間外・深夜・休日の区分の当てはめ、端数処理のルール、派遣先との時間数の食い違いをどちらの数字で確定するかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月のタイムシートから30枚を選ぶ(書式の違う派遣先を5社以上、写真で届いたものを数枚、合計が合わなかったと分かっているものを数枚入れる)
- Google Cloud のコンソールで Form Parser のプロセッサを作り、30枚を1枚ずつ読み取らせる
- 返ってきた表を見て、日ごとの始業・終業・休憩が正しい行と列に入っているか、信頼度の低いセルがどこに出るかを確かめる
- 読み取れた時刻から実働時間を手元の表計算で計算し、書かれた合計と当時の入力結果に突き合わせる
30枚は必ずやってください。 スクリプトを組む前に、この書式と手書きがどこまで読めるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 大半のセルが正しい行と列に入り、読み違いは信頼度の低いセルに集まった | スクリプトと契約一覧の照合に進む |
| 特定の書式だけ、行や列がずれる | 結合したセルが原因のことが多い。対応表で読み飛ばせば構成は有効 |
| 写真の多くで数字が読めない | 撮り方の見本と画像品質の確認が先。 OCRの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、手入力に時間がかかっていた理由が1つ分かったということです。 撮り方の見本を配り、翌月の写真で確かめてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない数字が所定の時刻で埋まる | 補完を禁じ、unreadable のまま人へ。 指示にも明記する |
mismatch と unreadable が混ざる | unreadable を先に判定し、すべて読めたものだけで合計を比べる |
| 拘束時間が実働として読まれる | 対応付けの指示で禁じ、迷ったら unmapped にさせる |
| 写真の数字が読めない | 画像品質スコアで先に止め、欠陥の種類を添えて撮り直しを頼む |
| 確認印の無いものをスタッフに返す | no_stamp は派遣先の勤怠担当者へ。連絡先を契約一覧に持つ |
| 請求と給与の区分を同じ表で持つ | 契約と就業規則で別の表にする。同じ残業が別の扱いになる |
| 備考の「1時間早退」で終業が書き換わる | 区分を付けるだけにし、時刻を直させない |
| 取り込みまで自動にしてしまう | 取り込み用のCSVまでにする。 取り込みは人が行う |
上の2行が、この構成の失敗のほとんどです。 どちらも「読めない」の扱いから出ています。読めないものを読めないまま人に回せるかで、運用に乗るかが決まります。
下の3行も早く効いてきます。 区分を1つの表で持つと、請求と給与のどちらかが必ず間違います。取り込みの自動化も、最初から作らないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: スタッフの氏名と番号、派遣先と就業場所、日ごとの勤務時刻、そして備考欄の休暇・欠勤・早退の理由です。通院や家族の事情が書かれることがあります。
- 生成AIに渡す範囲を、見出しと備考の文字列に限る … 列見出しの対応付けに氏名や時刻は要りません。備考は日付と文字列だけを渡し、氏名とスタッフ番号を外します
- データを処理させる地域を決める … Form Parser の対応地域は8つです。自社の個人情報の取扱いの規程に照らして先に決めます
- 派遣先との数字の食い違いを、この構成で確定させない … 派遣先には、日ごとの始業・終業の時刻と休憩時間などを毎月1回以上、派遣元に通知することが求められています。確認印はその通知を兼ねていることが多く、どちらの数字で確定するかは派遣先と自社の営業担当が決めます
- 差し戻しの連絡を自動で送らない … 出すのは下書きまでです。スタッフにも派遣先にも直接ひびきます
- 何を原本として残すかを決める … スキャンした画像、OCRの結果、取り込みデータのどれをどれだけ残すかを、労務担当と決めておいてください
- 書式の対応表を登録する人を決める … 担当を決め、版を残します
誤りが起きた場合のリスクは、時間数を誤って請求や給与に入れることと、正しいタイムシートを差し戻すことの2つです。 前者は読めない数字を埋めると起き、後者は差し戻しの理由を混ぜると起きます。
10まず何から始めるか
1週目:派遣契約の一覧に3つの列を足す
派遣契約の一覧に、書式の識別子、確認印の欄の位置、派遣先の勤怠担当者の連絡先の3つの列を足します。稼働人数の多い上位30社から埋めます。
2週目:30枚で試す
先月のタイムシートから30枚を選び、Form Parser で読み取らせます。読み違いが信頼度の低いセルに集まっているか、行と列がずれる書式はどれかを最優先で見ます。
3週目:区分の決まりを表にする
請求側の区分と端数の扱いを営業担当と、給与側を労務担当と、それぞれ表にします。 ここが決まらないと、数字は出るのに誰も取り込めません。あわせて、写真の撮り方の見本を作ります。
4週目:受付フォルダから検算までをつなぐ
スクリプトで受付フォルダを見張り、Form Parser を呼び、書式の対応表で日ごとの行にそろえて合計を検算する一覧を出すところまで作ります。この時点では検算の一覧だけを見ます。
2か月目: 画像品質の確認と確認印の切り出しを足し、verdict を出します。3か月目以降: 備考欄の区分、差し戻し文、取り込みデータを足し、1枚9分が何分になったかを実測します。撮り方の見本と対応表を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser と Enterprise Document OCR の対応言語の表に「手書きに対応しているか」の列があり、どちらも日本語に対応の印があること。ページ上限が同期処理で15(imageless_mode で30)、Form Parser のバッチ処理で100であること。対応地域が8つであること | Google Cloud: Processor list | 2026-10-01 |
| Form Parser がキーと値のペア、表、選択マーク、一般的な項目、テキストを取り出すこと。表は行や列をまたぐセルの無い表から取り出すこと。値が空欄のキーと値のペアは確実には解析されないこと | Google Cloud: Form Parser | 2026-10-01 |
formFields の fieldName と fieldValue、表の headerRows と bodyRows の構造。Form Parser の表では rowSpan と colSpan が常に1であること。layout に confidence が付くこと。画像品質スコアは enableImageQualityScores を有効にすると返ること | Google Cloud: Handle processing response | 2026-10-01 |
| Enterprise Document OCR が手書きを含むテキストを取り出すこと。画像品質スコアがページごとに0〜1で返り、0.5を下回るとぼやけ・暗さ・文字が小さすぎる・切れ・反射など8種類の欠陥が返ること | Google Cloud: Enterprise Document OCR | 2026-10-01 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpi、300dpi以上が一般に最も良いこと。手書きの質にも精度が左右されること | Google Cloud: Supported Files | 2026-10-01 |
構造化出力で mime_type を application/json にしてスキーマを渡すこと。enum が使えること。値はアプリケーション側で検証するよう求められていること | Google AI for Developers: Structured outputs | 2026-10-01 |
| 派遣先が派遣先管理台帳に、派遣就業をした日と日ごとの始業・終業の時刻、休憩時間などを記載すること。毎月1回以上、一定の期日を定めて派遣元に通知しなければならないこと(派遣法第42条第3項、派遣則第38条第1項) | 厚生労働省・都道府県労働局: 派遣労働者を受け入れるためには必要な対応があります! | 2026-10-01 |
時間外・深夜・休日の区分の当てはめと端数の扱いは、自社の就業規則と派遣契約に基づいて労務担当と営業担当で決めてください。 本記事は公式の資料で確認できた範囲だけを扱っています。手書きの数字がどこまで読めるかは、自社のタイムシートで試してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0402)についてのご相談はこちらから。
