社労士事務所が顧問先から預かる紙のタイムカードを読み取り、出退勤の時刻と打刻漏れを給与計算の取込表に起こす
顧問先から毎月預かる紙のタイムカードを読み取り、日ごとの出勤・退勤・外出・戻りの時刻を給与計算ソフトの取込表に起こします。打刻漏れ、手書きの訂正、読めない打刻は、顧問先に確かめる一覧にまとめます。
- 生成AI
- ChatGPT/Claude
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 士業/小売/製造/飲食
- 対象部門
- 人事
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 顧問先から届いたカードのスキャン、または預かった原本を事務所でスキャンしたものを、顧問先ごとのフォルダに保存する
- 担当がカードを1枚ずつ開き、従業員の名前と社員番号を確かめる
- 日付の行ごとに、出勤・外出・戻り・退勤の時刻を給与計算ソフトの勤怠の画面に打ち込む
- 打刻が無い欄、手で書かれた時刻、読めない打刻を見つけたら、メモに書き出す
- メモがたまったところで、顧問先ごとに確認の依頼をメールか電話で送る
- 顧問先の回答を待って打ち込みを直し、給与の計算を進める
- 【人/顧問先】 顧問先がカードをスキャンして共有フォルダに入れる。原本を預かったものは事務所でスキャンして同じフォルダに入れる
- 自動Google Apps Script が数分おきにフォルダを確かめ、新しいカードの画像を処理待ちに回す
- 自動Google Document AI の Form Parser が、カードの欄、日付ごとの打刻の表、各要素の信頼度を返す
- 自動Claude API が、読み取り結果を日付ごとの行(出勤・外出・戻り・退勤)にそろえ、印字の打刻と手書きの時刻を分けて写す
- 自動Apps Script が、顧問先の勤務カレンダーとシフトに照らして、打刻漏れ・手書きの訂正・読めない打刻・前後の矛盾を規則で拾う
- 自動顧問先ごとの「取込待ち」のシートに行を書き込み、印の付いた行にカードの写しのリンクを付ける
- 人担当が印の付いた行をカードの写しと見比べ、顧問先への確認の一覧を作って送る
- 人顧問先の回答を取込待ちのシートに書き、確定した顧問先の分を給与計算ソフトの取込用CSVに書き出して取り込む
各工程の詳しい説明を読む
- 顧問先から届いたカードのスキャン、または預かった原本を事務所でスキャンしたものを、顧問先ごとのフォルダに保存する
- 担当がカードを1枚ずつ開き、従業員の名前と社員番号を確かめる
- 日付の行ごとに、出勤・外出・戻り・退勤の時刻を給与計算ソフトの勤怠の画面に打ち込む
- 打刻が無い欄、手で書かれた時刻、読めない打刻を見つけたら、メモに書き出す
- メモがたまったところで、顧問先ごとに確認の依頼をメールか電話で送る
- 顧問先の回答を待って打ち込みを直し、給与の計算を進める
(a)打ち込みに時間を取られる。 1枚のカードには、出勤日が20日あれば少なくとも40の打刻があります。
(b)打刻漏れに気づくのが計算の途中になる。 打ち込みながら空欄に気づき、メモに書き出しても、確認の依頼を送るのは、その顧問先の全員分を打ち終えてからになりがちです。回答が返ってくるのは支払日の直前で、計算をやり直す時間が残りません。
(c)手で書かれた時刻がまぎれる。 店長が手で書き込んだ時刻は、印字の時刻と同じ欄に並びます。急いで打ち込んでいると、レコーダーの打刻と手書きの訂正の区別がつかないまま取込表に入ります。 どの時刻が客観的な記録で、どれが後から書かれたものかが、データの上では分からなくなります。
(d)かすれた打刻を推測で読む。 インクリボンが古いレコーダーの打刻は、「3」と「8」、「1」と「7」の見分けがつかないことがあります。読めない打刻を、前後の日の時刻から推測して打ち込んでしまうことがあり、それが賃金の計算の根拠になります。
- 【人/顧問先】 顧問先がカードをスキャンして共有フォルダに入れる。原本を預かったものは事務所でスキャンして同じフォルダに入れる
- 【自動】 Google Apps Script が数分おきにフォルダを確かめ、新しいカードの画像を処理待ちに回す
- 【自動】 Google Document AI の Form Parser が、カードの欄、日付ごとの打刻の表、各要素の信頼度を返す
- 【自動】 Claude API が、読み取り結果を日付ごとの行(出勤・外出・戻り・退勤)にそろえ、印字の打刻と手書きの時刻を分けて写す
- 【自動】 Apps Script が、顧問先の勤務カレンダーとシフトに照らして、打刻漏れ・手書きの訂正・読めない打刻・前後の矛盾を規則で拾う
- 【自動】 顧問先ごとの「取込待ち」のシートに行を書き込み、印の付いた行にカードの写しのリンクを付ける
- 【人】 担当が印の付いた行をカードの写しと見比べ、顧問先への確認の一覧を作って送る
- 【人】 顧問先の回答を取込待ちのシートに書き、確定した顧問先の分を給与計算ソフトの取込用CSVに書き出して取り込む
7番目が、この設計の分かれ目です。 担当が見るのは印の付いた行だけです。印の無いカードは、出勤日数と打刻の数を流し見て次に進みます。
02今回想定するシステム構成
紙のタイムカード(顧問先でスキャン、または事務所でスキャン) │ 顧問先ごとの共有フォルダに保存 ▼【トリガー】Apps Script の時間主導型トリガー(数分おき) Google Apps Script ── 新しいカードの画像を見つけ、処理待ちへ ▼ Google Document AI(Form Parser) │ 欄のキーと値、打刻の表、各要素の信頼度 ▼ Claude API ── 日付ごとの行にそろえ、印字と手書きを分けて写す ▼ Google Apps Script ── 勤務カレンダー・シフトとの照合/打刻漏れ/矛盾の確認 ▼ 顧問先ごとの「取込待ち」シート(印とカードの写しのリンク) ▼ 【担当が印の付いた行を確かめ、顧問先に確認を依頼】 ▼ 担当の操作で取込用CSVを書き出し、給与計算ソフトへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(打刻を日付ごとの行にそろえる) | OpenAI API |
| 連携 | Google Apps Script(フォルダの確認、OCRとAIの呼び出し、シートへの書き込み) | Python |
| 差異計算 | Google Apps Script(勤務カレンダー・シフトとの照合) | Python |
| 保管 | Google ドライブ(カードの画像と読み取り結果) | 事務所のファイルサーバー |
新しく足すのは、顧問先ごとの「カードの書式の表」と「取込待ち」のシートの2つです。 書式の表には、レコーダーの表裏の使い方や24時を過ぎた退勤の印字の仕方を書きます(第7章)。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。カードの上部の「氏名」「社員番号」「月度」はキーと値のペアとして、日付ごとの打刻は表として読めます。
Form Parser の注意書きのうち、この題材で効くのは2つです。 1つは、値が空のキーと値のペアは確実には読み取れないとされていること。もう1つは、表はセルが行や列にまたがらない単純なものだけが対象とされていることです。タイムカードの打刻の欄は単純な格子が多い一方で、「外出」「戻り」の見出しを1つにまとめた書式では、列がずれて返ることがあります(第7章)。
処理する場所は、リージョンの一覧から選びます。 マルチリージョンの us と eu、シンガポール(asia-southeast1)などの単一リージョンがあり、日本のリージョンはありません。 カードには従業員の氏名と毎日の出退勤の時刻が載っています。顧問先との委託契約や事務所の決まりに照らして、国外で処理してよいかを導入前に確かめます(第13章)。
03どうやって実装するのか
処理の起点を決める
Apps Script の時間主導型トリガーで、数分おきに顧問先ごとの共有フォルダを確かめます。 公式のページでは、時間主導型のトリガーは最短で1分ごとから月1回まで設定でき、実行の時刻はわずかにずれることがあるとされています。インストール型トリガーの一覧にドライブのファイルの追加を起点とするものは無いので、一定の間隔で新しいファイルを探す形にします。
フォルダは顧問先ごとに分け、その中に「受付」「処理済み」「要確認」の3つのフォルダを置きます。Apps Script は各顧問先の「受付」フォルダの getFiles() を順に見て、まだ処理の記録が無いファイルを拾います。
処理が終わったカードは「処理済み」へ移します。移すのは、取込待ちのシートへの書き込みまで終わったときだけにします。途中で止まったカードは次の実行で拾い直され、「受付」に残っている枚数が、そのまま未処理の枚数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| タイムカードの画像 | カードの表と裏。顧問先、スキャンした日時 | 顧問先ごとの共有フォルダ |
| 読み取り結果 | 欄のキーと値、打刻の表のセル、各要素の信頼度と位置 | Google Document AI |
| カードの書式の表 | 表裏の前半・後半、締め日、外出と戻りの有無、24時を過ぎた退勤の印字の仕方 | 新しく作る顧問先ごとの表 |
| 従業員の一覧 | 社員番号、氏名、雇用の区分 | 給与計算ソフトから書き出した一覧 |
| 勤務カレンダーとシフト | 顧問先の休日、従業員ごとの出勤予定日 | 顧問先から預かる表(無い顧問先は休日だけ) |
質を決めるのは、カードの書式の表です。 表と裏のどちらが月の前半かを取り違えると、すべての打刻が半月ずれた日付に入ります。 機種が変わったときに書き直す決まりにし、表の更新日を取込待ちのシートに出します。
勤務カレンダーとシフトは、打刻漏れを拾うために使います。 出勤予定の日に打刻が1つも無ければ欠勤か打刻漏れ、出勤の打刻だけがあって退勤が無ければ打刻漏れの疑いです。シフトを預かれない顧問先では、出勤の打刻があって退勤が無い日だけを拾います。
データの取得方法を決める
Apps Script は、カードの画像を Form Parser のプロセッサに送ります。オンラインの処理は1回の要求で最大15ページなので、表と裏の2ページのカードは1回で足ります。顧問先が全員分をまとめて1つのPDFにしてきた場合は、従業員ごとのページに分けてから送ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| カードの見出し | 各ページの formFields(fieldName/fieldValue) | 氏名、社員番号、月度 |
| 打刻の表 | 各ページの tables(headerRows/bodyRows の cells) | 日付ごとの出勤・外出・戻り・退勤 |
| 全文 | 応答の text | 表として取れなかった打刻を本文から拾う |
| 信頼度 | 各要素の layout の confidence | かすれた打刻の見分け |
| 位置 | layout の boundingPoly | 確認のときに、カードの写しの該当箇所を示す |
打刻の無い欄の見分けは、表のセルだけに頼りません。 公式のページでは、text が文書の文字の唯一の置き場所で、ほかの要素は textAnchor でそこを指すとされています。セルが空で返ったときは、そのセルの位置の近くに時刻らしい文字が検出されているかを全文と位置から見ます。何も検出されていなければ打刻なし、検出されていて信頼度が低ければ読めない打刻として扱います。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。顧問先がスマートフォンで撮った写真はJPEGのまま受けます
- 解像度の確認 … 公式のページでは、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。顧問先のスキャンの設定がこれを下回るときは、設定を変えてもらいます
- 表と裏の組み合わせ … 表と裏が別のファイルで届いたら、ファイル名と氏名の欄で1人分に組み合わせます。組み合わせられないものは、日付を入れずに要確認へ回します
- 向きの確認 … 横向き・逆さまに撮られたものは、向きを直してから送ります
- カードの枚数の確認 … 従業員の一覧の人数と、届いたカードの人数を比べます。足りない人を、その時点で顧問先に知らせる一覧に入れます
- 重複の確認 … 同じ従業員の同じ月度のカードが2枚あれば、撮り直しか、カードを2枚使ったかを担当に確かめる印を付けます
AIに処理させる
させるのは、読み取り結果を日付ごとの行に、印字されたとおりに写すことと、表が崩れたときに行と列をそろえ直すことです。 打刻漏れの判断も、労働時間の計算も、Apps Script と給与計算ソフトが行います。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 見出しの写し | 氏名、社員番号、月度 | 読めなければ unreadable |
| 打刻の写し | 日付ごとの出勤・外出・戻り・退勤の時刻 | 欄が空なら blank、読めなければ unreadable |
| 印字と手書きの区別 | レコーダーの印字か、手で書かれた時刻か | 区別がつかなければ source_unclear |
| 日付のそろえ直し | 表と裏の前半・後半を、書式の表に沿って日付に当てる | 当てられなければ date_unclear |
| 列のそろえ直し | 見出しがまとまった書式で、ずれた列を戻す | 戻せなければ table_broken |
| 印字の印の写し | 赤字の印字、レコーダーが付けた記号 | 意味は解釈せず、そのまま写す |
3行目が、この構成でいちばん大事な区別です。 公式のガイドラインでは、使用者が始業・終業の時刻を確かめる方法として、タイムカード、ICカード、パソコンの使用時間の記録などの客観的な記録を基礎とすることが挙げられています。レコーダーの印字と、後から手で書かれた時刻は、同じ欄にあっても性質が違います。 取込表で区別が消えると、顧問先が後から確かめる手がかりが残りません。
| させないこと | 理由 |
|---|---|
| 打刻の無い欄の補完 | 何時に帰ったかを決めるのは顧問先。推測が賃金の根拠になる |
| かすれた数字の補正 | 前後の日の時刻に寄せると、推測の打ち込みを機械が繰り返す |
| 労働時間・時間外・深夜の計算 | 給与計算ソフトが行う。AIが計算した値を混ぜない |
| 手書きの時刻の採否 | 印字と手書きのどちらを使うかは顧問先が決める |
| シフトとの照合 | Apps Script が規則で行う |
1行目がいちばん起きやすい失敗です。 退勤の打刻が無い日を渡すと、前後の日がいつも18時台なら「18:02」のような時刻で埋めようとします。その瞬間、顧問先に確かめるべき欄が取込表から消えます。
指示内容を固定する
あなたは社会保険労務士事務所の給与計算の担当で、顧問先から預かった
タイムカードの読み取り結果を、日付ごとの行に写す立場です。
OCRが返した結果だけを見て、印字されたとおりに写してください。
推測で埋めないでください。
【写す項目】
見出し:employee_name(氏名)、employee_no(社員番号)、month(月度)
日付ごと:day(日付)、clock_in(出勤)、out(外出)、back(戻り)、
clock_out(退勤)。各時刻に value、status、source を付ける
【厳守事項】
- 時刻は印字されたとおりの文字列で写してください。
かすれた数字を、前後の日の時刻に近い数字に直さないでください。
- 欄が空なら status を blank、文字はあるが読めなければ unreadable に
してください。空欄と読めない欄を混ぜないでください。
- 打刻の無い欄を、いつもの時刻やシフトの時刻で埋めないでください。
欄が空であること自体が、確かめるべき情報です。
- 時刻がレコーダーの印字か、手で書かれたものかを source に書いてください
(printed / handwritten)。区別がつかなければ unclear にしてください。
- 手書きの時刻の近くに印やサインがあれば、seal を true にしてください。
- 二重線で消された時刻と書き直された時刻があれば、両方を写してください。
- 表と裏のどちらが月の前半かは【カードの書式】に従ってください。
日付を当てられない場合は date_unclear を true にしてください。
- 列がずれていると判断した場合は、位置をもとに行と列を戻してください。
戻せない場合は table_broken を true にし、無理に行を作らないでください。
- 赤字の印字やレコーダーの記号は、意味を解釈せずに mark に写してください。
- 労働時間、時間外、深夜の時間を計算しないでください。
- タイムカードでない書類と判断した場合は、document_type に種類を書いてください。
【読み取り結果】{ocr_result}
【カードの書式】{card_format}
AIにシフトを渡していないことが、このプロンプトのいちばんの工夫です。 シフトを見せると、打刻の無い欄をシフトの時刻で埋め、かすれた数字をシフトに近い数字に読みます。照らす相手を見せなければ、合わせることもできません。 シフトとの照合は Apps Script が、AIの写した値と並べて行います。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマを渡す方式)を使い、形を固定します。
{
"document_type": "time_card",
"employee_name": "", "employee_no": "", "month": "",
"date_unclear": false,
"table_broken": false,
"days": [
{
"day": "",
"clock_in": { "value": "", "status": "read | blank | unreadable", "source": "printed | handwritten | unclear" },
"out": { "value": "", "status": "read | blank | unreadable", "source": "printed | handwritten | unclear" },
"back": { "value": "", "status": "read | blank | unreadable", "source": "printed | handwritten | unclear" },
"clock_out": { "value": "", "status": "read | blank | unreadable", "source": "printed | handwritten | unclear" },
"seal": false, "corrected": false, "previous_value": "", "mark": ""
}
]
}
1つ目の理由は、時刻ごとに status と source を持てることです。 取込表の1つの欄に、読めたか、空か、印字か手書きかが一緒に残ります。顧問先に確かめるときに、どの欄が何だったかをそのまま示せます。
2つ目は、打刻漏れの判断を Apps Script の規則で持てることです。
| 条件 | 扱い |
|---|---|
| 出勤予定の日に打刻が1つも無い | no_record(欠勤か打刻漏れかを顧問先に確かめる) |
出勤があって退勤が blank、またはその逆 | missing_punch |
外出があって戻りが blank | missing_return |
時刻が unreadable | check_image(事務所でカードの原本を見る) |
時刻の source が handwritten | handwritten(手書きの訂正として顧問先に示す) |
| 退勤が出勤より前、24時を過ぎた退勤が書式の表と合わない | order_error |
| 休日の行に打刻がある | holiday_work(休日の出勤として顧問先に示す) |
date_unclear または table_broken | check_layout |
check_image は、顧問先に送る前に事務所で片づけます。 読めない打刻は、多くがカードの原本を見れば読めます。原本を預かっていない顧問先には、その欄だけ撮り直しを頼みます。 顧問先に時刻を尋ねる一覧には入れません。
公式のページでは、列挙の値の大文字・小文字までは保証されないとされているので、status と source は Apps Script で小文字にそろえてから使います。stop_reason が max_tokens のときは出力が途中で切れているので、出勤日の多いカードでは max_tokens を大きめにし、切れたらシートに書かずに呼び直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 顧問先ごとの共有フォルダ | Apps Script(getFiles()) | 新しいカードの画像を拾い、処理済みへ移す |
| Google Document AI | REST API の呼び出し | 欄、打刻の表、信頼度、位置を返す |
| Claude API | REST API の呼び出し | 打刻を日付ごとの行に写す |
| 従業員の一覧・書式の表・勤務カレンダー | スプレッドシートの読み取り | 社員番号、書式、出勤予定日を引く |
| 取込待ちのシート | 顧問先ごとのシートへの書き込み | 日付ごとの行、印、カードの写しのリンク |
| 給与計算ソフト | 担当が書き出した取込用CSVの取り込み | 確定した顧問先の分だけ |
給与計算ソフトには、この構成から直接書き込みません。 取込待ちのシートから取込用CSVを書き出すのは担当の操作で、missing_punch や no_record が残っている顧問先は書き出せないようにします。 読み取りの誤りが、そのまま賃金の計算に流れることはありません。
顧問先への確認の依頼も、この構成からは送りません。 確認の一覧は、従業員ごと・日付ごとに「どの欄が空か」「どの欄が手書きか」を並べたシートとして作り、担当が中身を見てから顧問先に送ります。
人が確認する
担当が見るのは、印の付いた行のあるカードだけです。 印の無いカードは、出勤日数と打刻の数を流し見て、確定の列に印を付けます。
check_layoutを先に見る … 日付や列がずれたカードは、ほかの印がすべて当てになりません。書式の表の誤りなら、表を直してその顧問先の分を読み直しますcheck_imageを見る … カードの写しの該当箇所を開き、読めない打刻を確かめます。読めないものは推測せず、原本を見るか撮り直しを頼みますmissing_punch・no_record・missing_returnを確かめる … カードの写しで、本当に打刻が無いかを目で見ます- 顧問先への確認の一覧を送る … 打刻の無い欄、手書きの時刻、休日の打刻を、従業員ごとに並べて送ります
- 回答を書き込む … 顧問先が示した時刻と、回答した人の名前と日付を取込待ちのシートに残します
- 取込用CSVを書き出す … 印がすべて片づいた顧問先の分だけを書き出し、給与計算ソフトに取り込みます
目標は、900枚をならして1枚3分です。 印の無いカードは流し見で数十秒、印の付いたカードは写しとの見比べと確認の一覧づくりで数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 表と裏が別々に届き、組み合わせられない | 日付を入れずに check_layout。担当が組み合わせる |
| 打刻の表の列がずれて返る | AIが行と列を戻す。戻せなければ table_broken で担当へ |
| インクリボンがかすれて読めない | check_image。原本を見るか撮り直しを頼む。顧問先に時刻を尋ねない |
| 従業員の一覧に無い氏名 | 新しく入った人か、表記の違いか。担当が社員番号を確かめる |
| カードの枚数が従業員の人数と合わない | 届いた時点で顧問先に知らせる一覧に入れる |
| 24時を過ぎた退勤の印字が書式の表と合わない | order_error。書式の表を直すか、顧問先に機種を確かめる |
| タイムカードでない書類が混ざる | document_type を見て、処理せずに要確認へ |
| 月の途中でカードが2枚目になっている | 同じ月度の2枚を1人分につなぎ、日付の重なりを確かめる |
| OCR・AIが応答しない | 「受付」に残す。次の実行で拾い直す |
記録を残す
- 元のカードの画像と、受け取った日時・経路(顧問先のスキャン/事務所のスキャン)
- OCRが返したJSONの全文と、Claude API の応答の全文
- そのとき使ったカードの書式の表の版と、勤務カレンダーの版
- 付いた印と、担当が確かめた結果、顧問先に送った確認の一覧、回答した人と日付
- 取込用CSVを書き出した日時と担当
- 顧問先ごとの
missing_punchとcheck_imageの件数
4つ目で「回答した人と日付」を残すのは、打刻の無い欄の時刻を誰が決めたかを残すためです。 取込表の時刻のうち、どれがレコーダーの印字で、どれが顧問先の回答で埋めたものかを、後から1行ずつたどれるようにします。
04実装レベルの3段階
最小構成は確かめるための段階です。 1枚ずつ貼り付けるので、月900枚には使えません。 半自動化で、1枚8分が5分程度になります。 打ち込みは無くなりますが、打刻漏れと手書きの欄を探す作業と、顧問先ごとの確認の依頼づくりは、目で行う作業として残ります。 本格構成で3分になり、この段階が本記事の想定です。 差が大きいのは、空欄探しが規則に移り、人が見るのが印の付いた行だけになるためです。
05工数削減シミュレーション
導入後 900件 × 3分 ÷ 60 = 45 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 給与計算を受託している顧問先のうち、町工場・小売店・飲食店など、タイムレコーダーで紙のタイムカードに打刻している先を数十社抱え、毎月の締め後に預かったカードを事務所の担当が1枚ずつ見ながら給与計算ソフトに打ち込んでいる社会保険労務士事務所。打刻漏れや手書きの訂正に気づくのが給与の計算の途中になり、顧問先への確認が支払日の直前に重なっている場合。
- 顧問先の大半がクラウドの勤怠システムを使っており、勤怠のデータをファイルで受け取れる場合。紙のタイムカードの顧問先が数社で、月に数十枚しかない場合。顧問先との委託契約や事務所の決まりで、従業員の勤怠の記録を国外のリージョンで処理することが認められない場合。なお、打刻の無い日の始業・終業の時刻をどう確定するか、どの時間を労働時間として扱うかは顧問先(使用者)が決めることで、この構成では代替できません。
07最小構成で試す方法
- 先月預かったカードから30枚を選ぶ(打刻漏れのあったカード、手書きの訂正があるカード、かすれたカード、表と裏のあるカードを必ず入れる)
- その30枚について、給与計算ソフトに打ち込んだ値と、顧問先に確かめた記録を用意する
- カードの画像を手元のAIサービスの画面に1枚ずつ貼り付ける
- 「このタイムカードの日付ごとの出勤・外出・戻り・退勤の時刻を、印字されたとおりに写してください。打刻の無い欄は『空欄』、読めない欄は『読めない』とし、手で書かれた時刻には『手書き』と付けてください。いつもの時刻で埋めないでください」と指示する
- 写された値を、当時打ち込んだ値と比べる
| 出てきた内容 | 判断 |
|---|---|
| 当時の値と同じ時刻が写せ、空欄と手書きも同じ欄で見つかった | OCRと Apps Script の連携に進む |
| 打刻の無い欄を、いつもの時刻で埋めた | 指示の書き方で直る。構成は有効 |
| 表と裏で日付が半月ずれる | 書式の表が先。 顧問先ごとに表と裏を確かめる |
| かすれて読めない欄が多い | スキャンの設定とレコーダーのリボンが先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 打刻の無い欄をAIがいつもの時刻で埋める | シフトをAIに見せない。 空であること自体が情報だと指示に書く |
| かすれた数字を前後の日の時刻に寄せる | 書かれたとおりに写させ、読めないものは unreadable |
| 表と裏で日付が半月ずれる | 顧問先ごとの書式の表に表裏の前半・後半を書く |
| 「外出」「戻り」の見出しがまとまった書式で列がずれる | 単純な表だけが対象。AIに列を戻させ、戻せなければ人へ |
| 空欄と読めない欄が混ざる | 値が空のキーと値は確実に読めない。全文と信頼度と位置で分ける |
| 手書きの訂正が印字と区別されない | source を時刻ごとに持たせる |
| 24時を過ぎた退勤の印字を日付と取り違える | 書式の表に印字の仕方を書き、合わなければ order_error |
| カードが1枚足りないことに計算の途中で気づく | 届いた時点で従業員の一覧の人数と比べる |
| 社員番号の先頭の0が落ちる | 文字列のまま読む |
| 国外での処理を確かめていない | 日本のリージョンが無い。顧問先との委託契約を先に確かめる |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧問先の従業員の氏名、社員番号、毎日の出退勤と外出の時刻です。時刻の並びは、その人の生活の様子そのもので、病院に通っている日、子どもの送り迎えをしている日が読み取れることもあります。18歳未満のアルバイトの記録も含まれます。
- 国外で処理することを確かめる … Document AI のリージョンの一覧に日本はありません。顧問先との委託契約と事務所の決まりで、従業員の勤怠の記録を国外のリージョンで処理してよいかを確かめます。認められない顧問先は、この仕組みに載せません
- 外部へ渡す範囲を絞る … AIに渡すのはカードの読み取り結果と書式の表だけです。シフト、従業員の一覧、賃金の情報はAIに渡さず、照合は Apps Script の側で行います
- 時刻を決めない … 打刻の無い欄の時刻を決めるのは顧問先です。公式のガイドラインは、タイムカードなどの客観的な記録を基礎として始業・終業の時刻を確かめることを使用者に求めています。社労士事務所の側で推測した時刻を、記録として残さない設計にします
- 給与計算に自動で流さない … 取込用CSVを書き出すのは担当の操作だけです
- 顧問先への確認を自動で送らない … 確認の一覧は担当が見てから送ります
- 共有フォルダの権限を顧問先ごとに分ける … 顧問先には自社のフォルダだけが見えるようにします。取込待ちのシートも顧問先ごとに分けます
- カードの原本と画像を残す … 公式のガイドラインは、タイムカードなどの労働時間の記録に関する書類を保存すべき書類として挙げています。原本を保存するのは使用者である顧問先で、事務所に残す画像の扱いは委託契約で決めます
誤りが起きた場合のリスクは、推測した時刻で賃金を計算することと、打刻漏れを見落として欠勤として計算することの2つです。 前者はAIに埋めさせると起き、後者は missing_punch の確かめを省くと起きます。
10まず何から始めるか
1週目:カードの書式の表を作る
紙のタイムカードの顧問先35社について、レコーダーの機種、表と裏の前半・後半、外出と戻りの有無、24時を過ぎた退勤の印字の仕方を表にします。先月のカードを1社1枚ずつ見れば埋まります。
2週目:30枚で試す
先月のカードから30枚を選び、手元のAIサービスに貼り付けて日付ごとの時刻を写させます。打刻の無い欄を埋めていないか、表と裏で日付がずれていないかを最優先で見ます。
3週目:顧問先との確かめ
従業員の勤怠の記録を外部のサービスで、国外のリージョンで処理してよいかを、顧問先との委託契約と事務所の決まりで確かめます。 あわせて、勤務カレンダーとシフトを預かれる顧問先を洗い出します。
4週目:フォルダから取込待ちのシートまでをつなぐ
Apps Script で共有フォルダを確かめ、OCRとAIを呼び、写した値を取込待ちのシートに書き出すところまで作ります。この時点では印を出さず、担当がこれまでどおり打ち込みながら、シートの値が合っているかを見ます。
2か月目: 勤務カレンダーとシフトとの照合を足し、印の付いた行だけを見る運用を始めます。3か月目以降: 確認の一覧づくりを足し、1枚8分が何分になったかを実測します。顧問先への確認の依頼が締め日の翌日に出せるようになり、check_layout がほとんど出なくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。Form Parser の言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(ページの原文を取得して確認)。オンラインの処理が1回の要求で最大15ページであること | Google Cloud: Processor list | 2026-10-08 |
| 値の入っていないキーと値の組を確実には読み取れないこと。表はセルが行や列にまたがらない単純なものが対象であること | Google Cloud: Form Parser | 2026-10-08 |
項目名と値の組が formFields の fieldName/fieldValue で返ること。表が headerRows/bodyRows の cells で返ること。信頼度と位置が各要素の layout に入ること。text が文書の文字の唯一の置き場所で、ほかの要素は textAnchor で指すこと | 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 |
| 時間主導型のトリガーが最短1分ごとから月1回まで設定でき、実行の時刻がわずかにずれることがあること。インストール型トリガーの一覧にドライブのファイルの追加を起点とするものが無いこと | Apps Script: Installable triggers | 2026-10-08 |
| 使用者が始業・終業の時刻を確かめる方法として、タイムカード、ICカード、パソコンの使用時間の記録などの客観的な記録を基礎とすることが挙げられていること。タイムカードなどの労働時間の記録に関する書類が保存すべき書類として挙げられていること(PDFの原文を取得して確認) | 厚生労働省: 労働時間の適正な把握のために使用者が講ずべき措置に関するガイドライン(リーフレット) | 2026-10-08 |
打刻の無い日の時刻をどう確定するか、手書きの訂正を使うかどうか、勤怠の記録を外部のサービスで処理してよいかは、顧問先と事務所の取り決めに沿って決めてください。 本記事は各製品と厚生労働省の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1133)についてのご相談はこちらから。
