建設現場で毎日手書きされる協力会社の出面表を読み取り、日付・会社・職種・人数を労務の集計表にそろえて、入場記録との食い違いを拾う
建設現場で協力会社の職長が毎日手書きする出面表を読み取り、日付・会社・職種・人数を労務の集計表にそろえます。入退場の記録と人数が合わない日と会社を、月末を待たずに経理と工事担当へ出します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 建設
- 対象部門
- 経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 現場事務所で、協力会社の職長が出面表に会社名・職種・人数・作業内容を書き、署名する
- 工事担当が夕方に出面表を見て、確認の印を押す
- 月末に、工事担当が1か月分の出面表をまとめて本社の経理へ送る(郵送または持参)
- 経理の担当が1枚ずつ開き、会社名を協力会社マスタで探し、職種と人数を労務の集計表へ打ち直す
- 入退場の記録を現場ごとに書き出し、日ごと・会社ごとの人数を出面表と見比べる
- 合わない日を工事担当に問い合わせ、返事を待つ
- 協力会社から届く常用の人工の請求を、集計表と突き合わせる
- 人工事担当が夕方に出面表を確かめて印を押し、現場事務所の複合機でスキャンする
- 自動スキャンの保存をきっかけに Python のプログラムが動き、現場と日付を確かめる
- 自動Google Document AI の Form Parser が、上部の欄、協力会社の行の表、読み取りの信頼度を返す
- 自動Claude API が、行ごとに会社名・職種をマスタのコードにそろえ、人数を書かれたとおりに写す
- 自動Python が人数を数値に直し、入退場の記録の日ごと・会社ごとの人数と比べる
- 自動食い違いのある日と会社、マスタに対応しない会社名を、翌朝に工事担当へ知らせる
- 人工事担当が職長に確かめ、どちらに合わせるかと理由を記録する
- 自動確かめの済んだ行を労務の集計表に入れる
- 人月末に経理が、集計表と協力会社の常用の請求を突き合わせる
- 人確かめの済んでいない食い違いが残っていれば、経理が工事担当に問い合わせる
各工程の詳しい説明を読む
- 現場事務所で、協力会社の職長が出面表に会社名・職種・人数・作業内容を書き、署名する
- 工事担当が夕方に出面表を見て、確認の印を押す
- 月末に、工事担当が1か月分の出面表をまとめて本社の経理へ送る(郵送または持参)
- 経理の担当が1枚ずつ開き、会社名を協力会社マスタで探し、職種と人数を労務の集計表へ打ち直す
- 入退場の記録を現場ごとに書き出し、日ごと・会社ごとの人数を出面表と見比べる
- 合わない日を工事担当に問い合わせ、返事を待つ
- 協力会社から届く常用の人工の請求を、集計表と突き合わせる
(a)月末に打ち直しが集中する。 30現場分、約600枚が月末にまとめて届きます。経理の3名は、そこから請求の締めまでの数日で打ち直しと照合を終えなければなりません。 急ぐほど、照合が省かれます。
(b)会社名と職種の揺れで集計が割れる。 「○○工業」と「(株)○○」を別の会社として打つと、集計表の上で人工が2つに割れます。月末の常用の請求と突き合わせたときに合わず、そこで初めて気づきます。
(c)食い違いの問い合わせが1か月遅れる。 経理が出面表と入場記録の食い違いに気づくのは月末で、工事担当に問い合わせても、3週間前のある日に誰が来ていたかは覚えていません。 職長に確かめても同じです。結局、出面表の人数のまま集計されます。
(d)二次の協力会社が見えない。 一次の会社名の行に、二次の会社の人数をまとめて書く職長がいます。入場記録は技能者ごとに所属が分かれているので、出面表と入場記録で会社の単位が合わず、照合のたびに担当が頭の中で組み替えています。
- 【人】 工事担当が夕方に出面表を確かめて印を押し、現場事務所の複合機でスキャンする
- 【自動】 スキャンの保存をきっかけに Python のプログラムが動き、現場と日付を確かめる
- 【自動】 Google Document AI の Form Parser が、上部の欄、協力会社の行の表、読み取りの信頼度を返す
- 【自動】 Claude API が、行ごとに会社名・職種をマスタのコードにそろえ、人数を書かれたとおりに写す
- 【自動】 Python が人数を数値に直し、入退場の記録の日ごと・会社ごとの人数と比べる
- 【自動】 食い違いのある日と会社、マスタに対応しない会社名を、翌朝に工事担当へ知らせる
- 【人】 工事担当が職長に確かめ、どちらに合わせるかと理由を記録する
- 【自動】 確かめの済んだ行を労務の集計表に入れる
- 【人】 月末に経理が、集計表と協力会社の常用の請求を突き合わせる
- 【人】 確かめの済んでいない食い違いが残っていれば、経理が工事担当に問い合わせる
7番目が、この設計の分かれ目です。 食い違いを確かめるのは翌朝の工事担当で、月末の経理ではありません。前日の出来事なら、職長も工事担当も覚えています。 経理が月末に見るのは、確かめの済んだ集計表と、確かめの済んでいない少数の行だけになります。
6番目で翌朝に知らせるのは、(c)の失敗が「遅れ」から来ているからです。 毎日の処理にしても、月末にまとめて知らせるのでは意味がありません。
02今回想定するシステム構成
出面表(現場ごと1日1枚) │ 夕方に工事担当がスキャン ▼【トリガー】共有フォルダへの保存 Python ── 現場と日付の確認 ▼ Google Document AI(Form Parser) │ 上部の欄、協力会社の行の表、信頼度を返す ▼ Claude API ── 会社名・職種をマスタのコードにそろえる、人数を写す ▼ Python ── 人数を数値に直し、入退場の記録と日ごと・会社ごとに比べる ├──▶ 食い違い・マスタに無い会社名 ── 翌朝に工事担当へ ▼ 【工事担当が職長に確かめて記録】 ▼ 労務の集計表 ── 月末に経理が常用の請求と突き合わせる
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(会社名・職種のコードへの対応付け) | OpenAI API、Gemini API |
| 連携 | Python(フォルダの監視、集計表への書き込み、通知) | Google Apps Script |
| 集計 | Python(入退場の記録との比較と月次の集計) | Google Apps Script |
| 保管 | 社内のファイルサーバー | Google ドライブ |
新しく作るのは、協力会社マスタの「呼び名」の列と、職種のコード表の2つです。 マスタには正式な会社名しかないので、現場で使われている略称や屋号を、会社ごとに並べて持たせます。 職種も、自社の原価の区分に合わせたコード表を作ります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。上部の「現場名」「日付」はキーと値のペアとして、協力会社の行は表として読めます。
Form Parser の注意書きのうち、この題材で効くのは表の制限です。 公式のページでは、行や列をまたぐセルの無い、単純な表から抽出するとされています。会社名のセルを2行にまたがせ、職種ごとに人数を書かせる書式は、そのままでは行がずれます。 出面表の書式を「1行1会社1職種」にそろえるのが、最初の準備作業です。
入退場の記録の取り出し方は、現場で使っている仕組みによります。 国土交通省の資料では、入退場のデバイスとしてカードリーダー、顔認証、スマートフォンなどがあり、API連携の認定システムを通じてCCUSと連携する形が示されています。この構成では、その仕組みから日ごと・会社ごとの人数を書き出したファイルを受け取ることを前提にし、書き出しの方法は製品ごとに確かめます。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などの単一リージョンがあり、日本のリージョンはありません。 出面表には会社名と人数、職長の署名が書かれているので、国外で処理してよいかを社内で確かめます。
03どうやって実装するのか
処理の起点を決める
共有フォルダにスキャンが保存されたことを起点にします。 工事担当が夕方に確認の印を押した後、現場事務所の複合機でスキャンします。印を押す前の出面表はスキャンしません。 職長が後から書き足すことがあるためです。
保存先は現場ごとに分け、ファイル名に現場コードと日付を付けます。 複合機の宛先を現場ごとに登録しておけば、工事担当が手で名前を付ける必要はありません。
Python のプログラムは、毎日21時に1日分をまとめて処理し、翌朝7時に食い違いを知らせます。出面表は夕方に集中して届き、照らす相手の入退場の記録もその日の退場が終わらないとそろわないので、1枚ずつの即時処理にはしません。 処理が終わったファイルは処理済みのフォルダへ移し、移すのは成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出面表のスキャン | PDF。現場コード、日付 | 共有フォルダ |
| 読み取り結果 | 上部の欄のキーと値、協力会社の行の表、セルごとの信頼度 | Google Document AI |
| 協力会社マスタ | 会社コード、正式な会社名、現場での呼び名の一覧、一次・二次の別、一次の会社 | 協力会社マスタ(呼び名の列を足す) |
| 職種のコード表 | 職種コード、名称、揺れのある書き方の一覧 | 新しく作る |
| 現場の施工体制 | その現場に入っている協力会社の一覧 | 施工体制台帳 |
| 入退場の記録 | 日ごと・会社ごとの入場した人数 | 入退場の仕組みから書き出したファイル |
質を決めるのは、現場の施工体制の一覧です。 出面表の会社名をマスタ全体から探すと、略称の似た別の会社に当たることがあります。その現場に入っている会社の中から探せば、候補は10社前後に絞られます。
一次の会社の列は、(d)の失敗のために持ちます。 入退場の記録が二次の会社ごとに分かれていて、出面表が一次の会社でまとめて書かれていれば、二次の人数を一次に合算してから比べます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。オンラインの処理は1回の要求で最大15ページで、出面表は1枚ずつ送るので上限に届きません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 上部の欄 | 各ページの formFields(fieldName/fieldValue) | 現場名、日付 |
| 協力会社の行 | 各ページの tables(headerRows/bodyRows) | 会社名、職種、人数、作業内容 |
| 信頼度 | 各要素の layout の confidence | 人数のセルが確かに読めたかの区別 |
| 位置 | layout の boundingPoly | 確認の画面で、出面表の該当行に枠を出す |
現場名と日付は、読み取った値よりファイル名を優先します。 手書きの日付は書き損じがあり、読み違いもあります。ファイル名の日付と読み取った日付が違えば、知らせに載せて工事担当に確かめます。
入退場の記録は、現場で使っている仕組みから日ごと・会社ごとの人数を書き出したCSVを、毎日決まったフォルダに置く形にします。書き出しを自動にできる仕組みもあれば、工事担当が画面から書き出す必要がある仕組みもあります。どちらにするかは、現場で使っている製品の機能を確かめて決めます。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。複合機の保存は PDF にします
- 解像度の確認 … 公式のページでは、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。人数の数字が小さく書かれることが多いので、300dpiに設定します
- 1ファイル1枚にそろえる … 数日分をまとめてスキャンしたものは、ページで分け、ページごとに日付を確かめます
- 現場と日付の確認 … ファイル名の現場コードがマスタに無ければ処理を止めます
- 出面表が無い日の確認 … 入退場の記録があるのに出面表が届いていない日を拾います
- 同じ日の出面表が2枚ある場合 … 両方を工事担当に回し、どちらかを捨てない
5番目は、この構成で初めて見えるものです。 入場記録はあるのに出面表が無い日は、出面表を書き忘れたのか、スキャンを忘れたのかのどちらかです。月末に気づくと、どちらだったかを確かめようがありません。
6番目で両方を回すのは、書き直しの可能性があるからです。 職長が書き損じて新しい用紙に書き直し、古いほうも現場事務所の机に残ってスキャンされることがあります。どちらが現場で合意した人数かは、印を押した工事担当にしか分かりません。 新しいほうを機械的に選ぶと、印の無い下書きを集計に入れることがあります。
AIに処理させる
させるのは、出面表の各行を、会社コード・職種コード・人数(書かれたとおり)・作業内容にそろえることです。 人数の比較も、集計も、Python が行います。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 会社の対応付け | 書かれた会社名を、その現場の施工体制にある会社のコードに対応させる | 決まらなければ unmatched |
| 職種の対応付け | 書かれた職種を、職種のコード表に対応させる | 決まらなければ unmatched |
| 人数の写し | 人数の欄を書かれたとおりに文字列で写す(「4+1」もそのまま) | 読めなければ unreadable |
| 作業内容の写し | 作業内容を原文のまま写す | 空欄なら空 |
| 署名の有無 | 職長の署名欄に記入があるか | 空欄なら missing |
人数は、計算させずに写させます。 「4+1」を5にするのは Python です。AIが足すと、「4+1」が見習い1人を分けて書いたものなのか、別の会社の1人を書き足したものなのかという情報が消えます。 写した文字列を残しておけば、工事担当が確かめるときに元の書き方が分かります。
| させないこと | 理由 |
|---|---|
| 人数の計算・補正 | 「4+1」の内訳の情報が消える。計算は Python で行う |
| 入退場の記録との比較 | Python が日ごと・会社ごとに比べる |
| どちらの人数が正しいかの判断 | 工事担当が職長に確かめて決める |
| 施工体制に無い会社の推測 | 似た会社に寄せない。unmatched で人に回す |
| 常用の人工の単価や金額の計算 | 支払に関わる。契約に沿って経理が行う |
4行目がいちばん起きやすい失敗です。 施工体制に無い会社の名前が書かれていると、AIは似た名前の会社に寄せたくなります。その現場に施工体制の登録の無い会社が入っていた、という事実は、元請にとって大事な知らせです。寄せた瞬間に消えます。
指示内容を固定する
あなたは建設会社の経理部で、現場の出面表の読み取り結果を
労務の集計の形にそろえる立場です。OCRが返した結果だけを見て、
協力会社の行を1つずつ写してください。推測で埋めないでください。
【やること】
1. 各行の会社名を、下の「この現場の協力会社の一覧」の会社コードに対応させる
2. 各行の職種を、下の「職種のコード表」の職種コードに対応させる
3. 人数の欄を、書かれたとおりの文字列で写す
4. 作業内容を原文のまま写す
5. 職長の署名欄に記入があるかを写す
【厳守事項】
- 会社名は、一覧の正式な名前か呼び名に一致するときだけ対応させてください。
一覧に無い会社名は company_code を unmatched にし、
written_company に書かれたとおりに写してください。
似た名前の会社に寄せないでください。
- 人数は計算しないでください。「4+1」「4(1)」は、そのまま写してください。
- 人数の欄が空欄なら status を blank、文字はあるが読めなければ
unreadable にしてください。空欄と読めない欄を混ぜないでください。
- 1つの行に2つの職種が書かれているときは、行を分けずに
trade_code を multiple にし、written_trade に原文を写してください。
- どちらの人数が正しいか、入場の記録と合っているかを書かないでください。
- 単価や金額を書かないでください。
- 出面表ではない書類と判断した場合は、document_type に種類を書いてください。
【読み取り結果】{ocr_result}
【この現場の協力会社の一覧(コード、正式名、呼び名)】{site_contractors}
【職種のコード表(コード、名称、揺れのある書き方)】{trade_codes}
「似た名前の会社に寄せない」を2度にわたって書いているのは、書かないと必ず寄せるからです。 一覧を渡されたAIは、その中から最も近いものを選ぼうとします。選ばないという選択肢を、明示しておく必要があります。
行を分けさせないのは、人数の内訳が分からないからです。 「鉄筋・型枠 6」を2行に分けると、AIは3人ずつに割るか、片方に6人を入れます。どちらも書かれていない情報です。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマを渡す方式)を使い、形を固定します。
{
"site_code": "",
"work_date": "",
"document_type": "attendance_sheet",
"rows": [
{
"company_code": "",
"written_company": "",
"trade_code": "",
"written_trade": "",
"headcount_text": "",
"status": "read | blank | unreadable",
"work_description": "",
"foreman_signature": "present | missing",
"row_ref": ""
}
]
}
1つ目の理由は、書かれたままの値とコードを並べて持てることです。 written_company と company_code が並んでいれば、工事担当はAIがどの書き方をどの会社に対応させたかを1行で確かめられます。呼び名の一覧に足すべき書き方も、ここから拾えます。
2つ目は、比較を Python の規則で行えることです。
| 条件 | 扱い |
|---|---|
| 出面表の人数 > 入場記録の人数 | over(カードのかざし忘れか、多く書いたかを確かめる) |
| 出面表の人数 < 入場記録の人数 | under(出面表への書き漏れか、別の現場の人の混入かを確かめる) |
| 入場記録にあって出面表に行が無い会社 | missing_row |
出面表にあって施工体制に無い会社(unmatched) | unregistered |
人数が unreadable、または署名が missing | check_sheet |
over と under を分けるのは、確かめる相手が違うからです。 over なら職長と技能者に入場の仕方を、under なら出面表の書き方を確かめます。どちらも、確かめた結果と理由を記録してから集計表に入れます。
3つ目は、unregistered が施工体制の点検にもなることです。 施工体制の登録の無い会社が出面表に出てくれば、登録の漏れか、届け出の無い再下請かを工事担当が確かめる必要があります。
公式のページでは、列挙の値の大文字・小文字までは保証されないとされているので、status などは Python で小文字にそろえてから使います。stop_reason が max_tokens のときは出力が途中で切れているので、集計表に書かずに呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ | Python で毎日21時に処理 | その日の出面表と入退場の記録のファイルを読む |
| Google Document AI | API呼び出し | 上部の欄、協力会社の行の表、信頼度を返す |
| Claude API | API呼び出し | 会社名・職種のコードへの対応付け |
| 協力会社マスタ・施工体制 | スプレッドシートの読み取り | 呼び名、一次・二次の別、現場の協力会社 |
| 労務の集計表 | スプレッドシートへの追記 | 確かめの済んだ行だけを入れる |
| 通知 | 社内のチャットまたはメール | 翌朝7時に、現場ごとの食い違いを工事担当へ |
工事原価の管理ソフトへは書き込みません。 労務の集計表から原価の管理ソフトへの取り込みは、月末に経理がこれまでの手順で行います。 確かめの済んでいない行が原価に入ると、後から直す手間が増えます。
入退場の仕組みにも書き込みません。 食い違いの理由がカードのかざし忘れであっても、入退場の記録を直すかどうかは、その仕組みの運用の決まりに沿って工事担当が判断します。
人が確認する
工事担当が見るのは、自分の現場の食い違いの知らせだけです。 食い違いの無い日は、知らせが来ません。
unregisteredを先に見る … 施工体制に無い会社です。登録の漏れか、届け出の無い再下請かを、その日のうちに確かめますoverとunderを見る … 出面表の該当行に枠が出るので、そこだけを見て、職長に確かめます- 確かめた結果を記録する … どちらの人数に合わせたか、理由(かざし忘れ、書き漏れ、別現場の混入など)を選びます
check_sheetを見る … 読めなかった人数、署名の無い行です。出面表の原本で確かめます
3番目の理由は、選択肢から選ぶ形にします。 自由に書かせると、月末に経理が集計できません。理由ごとの件数が見えると、カードのかざし忘れが多い現場や会社が分かります。
経理が見るのは月末です。 確かめの済んだ集計表と、協力会社の常用の請求を突き合わせます。目標は、600枚をならして1枚1.5分です。 内訳は、工事担当の確かめと経理の月末の突き合わせの合計です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 入退場の記録のファイルが届いていない | 比較をせず、読み取りと対応付けだけを行う。翌朝の知らせに「比較できず」と載せる |
| ファイル名の日付と、出面表の日付が違う | 工事担当に確かめる。どちらかに寄せない |
| 行や列がずれて読まれた | 表を集計表に入れず、原本から工事担当が確かめる。書式の見直しの候補にする |
1行に2つの職種(multiple) | 工事担当が職長に内訳を確かめる |
| 人数が「4+1」 | Python が5として比べ、元の書き方を残す |
| 二次の会社が一次の行にまとめて書かれている | マスタの一次の会社の列で合算して比べる |
| 出面表以外の書類が混ざる | document_type を見て処理しない |
| OCR・AIが応答しない | フォルダに残し、翌日の処理で再実行。処理済みへ移すのは成功時だけ |
1行目は、導入の初めに多く起きます。 入退場の記録の書き出しが工事担当の手作業になっている現場では、書き出しを忘れた日は比較ができません。 その日の分は、翌日の処理でまとめて比べます。
記録を残す
- 元のスキャンと、スキャン日時・現場・スキャンした工事担当
- OCRが返したJSONの全文と、Claude API の応答の全文
- 比較に使った入退場の記録のファイルと、その書き出し日時
- 比較の結果(
over、underなど)と、工事担当が確かめた結果と理由 - 協力会社マスタと施工体制の、そのときの内容
- 会社ごと・現場ごとの食い違いの発生率と理由の内訳
4つ目が、この構成で最も大事な記録です。 常用の人工の請求で協力会社と金額が合わないとき、どの日のどの食い違いを、誰が、どういう理由でどちらに合わせたかをたどれます。
最後の行は、現場の運用を見直す材料になります。 かざし忘れが多い現場なら、入退場の機器の置き場所に理由があることがあります。
04実装レベルの3段階
最小構成は確かめるための段階です。 1枚ずつ貼り付けるので、600枚には使えません。 半自動化で、1枚5分が2.5分程度になります。 打ち直しは無くなりますが、入退場の記録との照合と問い合わせは月末に経理が行うままです。本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、照合が毎日の処理に移り、問い合わせが翌朝の工事担当の確かめに置き換わるためです。 段階を飛ばさないでください。 半自動化のシートを1か月見ると、どの会社名が unmatched になりやすいかが分かります。それを呼び名の一覧に足してから照合を始めるほうが、工事担当への知らせが空振りしません。
05工数削減シミュレーション
導入後 600件 × 1.5分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 同時に20〜40の現場を動かし、現場事務所で協力会社の職長が毎日の出面(人数)を紙の出面表に書いている建設会社。月末に経理や工事課が出面表を集めて労務の集計表へ打ち直し、常用の人工の請求と突き合わせている場合。入退場をカードリーダーや顔認証で記録しているのに、出面表と照らす作業は手で行っている場合。
- 出面の記録をすでに入退場の仕組みや現場管理のアプリに一本化しており、手書きの出面表が無い場合。現場が数か所で、工事担当が毎日人数を目で確かめて足りる場合。入退場を記録する仕組みが現場に無く、照らす相手のデータが無い場合(読み取りと集計までは使えます)。なお、協力会社への支払額の決定は、この構成では代替できません。
07最小構成で試す方法
- 先月の出面表から、3現場・各5日分の計15枚を選ぶ(会社名の揺れが多い現場と、二次の会社が入っている現場を必ず入れる)
- その15枚について、集計表に打ち直した内容と、入退場の記録を用意する
- スキャンを手元のAIサービスの画面に1枚ずつ貼り付け、その現場の協力会社の一覧と職種の一覧も貼る
- 「この出面表の各行を、会社・職種・人数・作業内容の表にしてください。会社名と職種は一覧のどれに当たるかを示し、一覧に無いものは『該当なし』としてください。人数は書かれたとおりに写し、計算しないでください」と指示する
- 出てきた表を、打ち直した内容と突き合わせ、人数を手で入場記録と比べる
| 出てきた内容 | 判断 |
|---|---|
| 打ち直しとほぼ一致した。会社の対応付けも合っていた | OCRとプログラムの連携に進む |
| 一覧に無い会社を似た会社に寄せた | 指示の書き方で直る。構成は有効 |
| 行がずれて会社と人数が入れ替わった | 書式の見直しが先。 結合セルを探す |
| 人数の数字が読めない枚数が多い | スキャンの設定が先。 AIの問題ではない |
手で入場記録と比べる5番目の作業も、省かないでください。 15枚分の食い違いの件数と理由が、この構成で工事担当に毎日届く知らせの量の見積もりになります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 一覧に無い会社を似た会社に寄せる | unmatched を許し、寄せないことを指示に明記する |
| 「4+1」をAIが足す・割る | 人数は文字列で写させ、計算は Python で行う |
| 会社のセルが結合されて行がずれる | Form Parser は単純な表が対象。1行1会社1職種にする |
| 二次の会社で人数が合わない | マスタに一次の会社の列を持ち、合算してから比べる |
| 入退場の記録が届かない日がある | 比較せずに「比較できず」と知らせる。翌日にまとめて比べる |
| 食い違いの理由が自由記述でばらばら | 選択肢から選ぶ形にする |
| 知らせが多すぎて読まれない | 呼び名の一覧を育ててから照合を始める |
| 確かめの前の行が原価に入る | 集計表には確かめの済んだ行だけを入れる |
| 日付の書き損じ | ファイル名の日付を優先し、食い違いは確かめに回す |
| 国外での処理を確かめていない | 日本のリージョンが無い。導入前に社内で確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが書かれていない情報を足してしまうという同じ型の失敗です。会社を寄せることも人数を割ることも、AIにとっては親切ですが、元請にとっては事実が消えることです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 協力会社の名前、現場ごとの日々の人数と作業内容、職長の署名です。入退場の記録には技能者ごとの入場の時刻が含まれることがありますが、この構成では日ごと・会社ごとの人数だけを使います。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。出面表の内容を国外のリージョンで処理してよいかを、社内の情報管理の決まりで確かめます
- 技能者ごとの記録をAIに渡さない … 入退場の記録は Python が日ごと・会社ごとの人数に集計してから比べます。技能者の名前や入場の時刻は、AIにも知らせにも出しません
- 支払額を決めさせない … この構成が出すのは人数の食い違いと確かめの結果までです。常用の人工の単価や支払額は、契約に沿って経理が決めます
- 協力会社を責める材料にしない … 食い違いの理由の内訳は、運用の見直しの材料です。特定の会社の請求を疑う根拠として一方的に使うと、現場の協力関係が崩れます
- 元の出面表を残す … 現場での合意の記録は、職長が書き工事担当が印を押した紙です。スキャンと原本を残し、AIが整えたデータを原本の代わりにしません
誤りが起きた場合のリスクは、協力会社に払うべき人工を払わないことと、払わなくてよい人工を払うことの2つです。 どちらも、AIの対応付けの誤りが確かめを経ずに集計に入ると起きます。確かめの済んだ行だけを集計表に入れる設計は、外さないでください。
10まず何から始めるか
1週目:呼び名と職種のコードを集める
先月の出面表を3現場分めくり、会社名の書き方と職種の書き方を全部書き出します。 それを協力会社マスタの呼び名の列と、職種のコード表にします。
2週目:15枚で試す
3現場・各5日分の出面表を手元のAIサービスに貼り付け、行をそろえさせます。一覧に無い会社を寄せていないか、人数を計算していないかを最優先で見ます。 手で入場記録と比べ、食い違いの件数を数えます。
3週目:入退場の記録の書き出しを確かめる
現場で使っている入退場の仕組みごとに、日ごと・会社ごとの人数を書き出せるか、自動で書き出せるかを確かめます。あわせて、出面表の書式を「1行1会社1職種」に直します。
4週目:フォルダから集計表までをつなぐ
Python で毎日の処理を作り、OCRを呼び、そろえた行を確認前のシートに書き出すところまで作ります。この時点では入退場の記録との比較を出さず、経理がこれまでどおり打ち直した内容と見比べます。
2か月目: 入退場の記録との比較を足し、3現場で工事担当への翌朝の知らせを始めます。3か月目以降: 全現場に広げ、1枚5分が何分になったかを実測します。食い違いの理由の内訳が毎月見えるようになり、月末の常用の請求の突き合わせで問い合わせが残らなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| CCUSの就業履歴が技能者のカードタッチにより日々登録されること。元請・下請で就業履歴(月別カレンダー)を相互に確認できる機能があること。入退場のデバイスにカードリーダー、顔認証、スマートフォンなどがあり、API連携の認定システムを通じてCCUSと連携する形が示されていること(2021年10月の資料) | 国土交通省: 建設キャリアアップシステムについて(現場運用) | 2026-10-08 |
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が1回の要求で最大15ページであること | Google Cloud: Processor list | 2026-10-08 |
| 表の抽出が行や列をまたぐセルの無い単純な表を対象にすること | Google Cloud: Form Parser | 2026-10-08 |
項目名と値の組が formFields の fieldName/fieldValue で、表が headerRows/bodyRows で返ること。信頼度と位置が各要素の layout に入ること | Google Cloud: Handle the processing response | 2026-10-08 |
| 対応形式が PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などであること。スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと | Google Cloud: Supported files | 2026-10-08 |
マルチリージョンが us と eu で、単一リージョンにシンガポール(asia-southeast1)などがあり、日本のリージョンが一覧に無いこと | Google Cloud: Regional and multi-regional support | 2026-10-08 |
output_config.format に JSON スキーマを渡して応答の形を固定できること。列挙の値の大文字・小文字は保証されないこと。max_tokens で打ち切られたときはスキーマに合わない出力になりうること | Claude API: Structured outputs | 2026-10-08 |
どちらの人数に合わせるか、常用の人工をいくら支払うかは、工事担当と経理が協力会社との契約に沿って決めてください。 本記事は各製品の公式ページと国土交通省の資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0972)についてのご相談はこちらから。
