給与ソフトへ勤怠データを取り込もうとしたら、「出勤時間に文字は読込めません」というエラーで全件はねられる。給与の締切が迫っている夕方に、これが出ると本当に手が止まります。
北関東の会計事務所様の顧問先向けに、勤怠データから給与ソフト取込用のCSVを自動生成する仕組みを作っています。そのCSVがある月、取込画面で丸ごと弾かれました。CSVを作っているプログラムを何度見直しても、出力は正しい。原因はまったく別のところにありました。
犯人は、そのCSVをExcelで開いて保存したことでした。
この記事は、給与や勤怠のCSVを扱うすべての方に向けた実体験の記録です。エラーメッセージからは絶対に辿り着けない原因なので、同じ画面で止まっている方の助けになればと思います。
「175:00」が勝手に「175:00:00」へ書き換わる
給与ソフト(今回はTKCのPX4)は、時間のデータを 60進法の h:mm 形式、つまり 175:00 のような書き方でしか受け付けません。「175時間ちょうど」という意味です。
プログラム側の出力を確認すると、きちんと 175:00 になっていました。ではなぜ弾かれるのか。ダウンロードしたCSVをテキストエディタで開いて、初めて分かりました。
(プログラムの出力) 175:00
(実際に取り込んだCSV) 175:00:00
秒が付いていたのです。 そして 175:00:00 は給与ソフトから見ると「時間の書式ではない文字」なので、「文字は読込めません」というエラーになります。
秒を付けたのはExcelでした。CSVをダブルクリックするとExcelが開きます。このときExcelは 175:00 という文字を見て「これは経過時間だな」と勝手に解釈します。そして上書き保存した瞬間に、Excelの流儀である 175:00:00 に書き換えて保存し直すわけです。
厄介なのは、この書き換えが一切、画面に出ないことです。作業者は「中身をちょっと確認しただけ」のつもりで開いて閉じている。それだけでファイルが壊れます。しかも壊れるのはダウンロードした後なので、CSVを作るプログラムをいくら直しても直りません。ここに気づくまで、かなりの時間を使いました。
もうひとつの地雷、文字コード
「Excelがダメなら、Googleスプレッドシートで開けばいいのでは」と考えたくなります。これはさらに確実に壊れます。
給与ソフトへ渡すCSVは、日本語の文字コード(文字をデータとして記録する方式のこと)が Shift_JIS である必要がありました。ところがスプレッドシートのCSV書き出しはUTF-8に固定されていて、変更できません。
つまりスプレッドシートに読み込んで書き出した時点で、中身が正しくても文字コードが変わり、給与ソフトが読めなくなります。こちらも実際に一度やってしまいました。
見分け方があります。ファイル名が「〇〇.CSV - 〇〇.CSV.csv」のように二重になっていたら、スプレッドシートを経由した証拠です。名前が変な形になっていたら、そのファイルは使わずに作り直してください。
回避策3つ
実際に運用していて効果があった順に3つ挙げます。
1. 取込用CSVは、表計算ソフトで開かない
これが本命です。手順書にも「厳禁」のページを1枚立てました。生成されたCSVは開かずにそのまま給与ソフトへ渡す。中身を見たいだけなら、ダブルクリックせずにテキストエディタ(メモ帳やVS Code)へドラッグして開きます。テキストエディタなら、時間の書式を勝手に解釈しません。
どうしても直したい箇所がある場合も、テキストエディタで直接編集し、文字コードを ANSI(Shift_JIS)に指定して保存します。表計算ソフトは一切通しません。
2. すでにExcelで開いてしまったら、時間の列の表示形式を直す
うっかり開いて保存してしまった後でも、対処はできます。時間が入っている列を選び、表示形式を [h]:mm(秒なしの経過時間)に指定してから保存し直します。1件、2件なら 175:00:00 を手で 175:00 に打ち直すほうが早いです。
なお、この事故が起きたときのために、文字コードの自動判定・秒の削除・列数チェックをまとめて行う修復スクリプトも用意しました。毎月の作業で「壊れたかもしれない」と思ったときに、一度通すだけで済むようにしています。
3. 途中の受け皿に「文字列」の書式を強制する
現在の運用では、勤怠データをいきなりCSVにせず、内容を人が確認するためのシートを一度はさむ形にしています。ここにも同じ罠がありました。スプレッドシートも 175:00 を経過時間と解釈するので、シートの時間列に表示形式「@」(文字列)を当てておかないと、読み戻したときに 175:00:00 になります。 Excelで起きた事故と、まったく同じ経路です。
さらにCSVを書き出す直前に、プログラム側で「H:MM:SS になっていたら秒を落とす」処理を最後の保険として入れてあります。ただし、これはあくまでプログラムが出力する経路の保険です。ダウンロードした後にExcelで開いて保存されたら効きません。だからこそ、1番の「開かない」が結局いちばん強い対策になります。
この件から学んだこと
一連の調査でいちばん腹に落ちたのは、エラーメッセージは「壊れた場所」を教えてくれるだけで、「壊した人」は教えてくれないということでした。
「出勤時間に文字は読込めません」というメッセージは、給与ソフトが読んだ瞬間の話しかしていません。実際に壊したのは、その3工程前にファイルを開いたExcelです。プログラムの中だけを見ていても永遠に見つかりません。データが手元に届くまでに通った経路を、1つずつ疑っていくしかありませんでした。
そしてもうひとつ。自動化した仕組みの弱点は、たいてい人が手で触る継ぎ目に出ます。 自動生成の部分は毎回同じ結果を返すので安定していて、事故はいつも「ダウンロードして、開いて、渡す」という人の手の部分で起きていました。仕組みを作るときは、処理そのものより、この継ぎ目をどう守るかを先に決めたほうがいいと考えるようになりました。
まとめ
- 給与ソフトの「時間が読込めません」は、Excelが
175:00 を 175:00:00 に書き換えたのが原因のことがある - スプレッドシート経由は文字コードがUTF-8に変わり、さらに確実に壊れる
- 取込用CSVは表計算ソフトで開かない。確認も修正もテキストエディタで行う
- 途中に確認用のシートを置くなら、時間の列は書式「@」(文字列)で守る
「毎月なぜかエラーになる」「原因が分からないまま手作業で直している」という作業が残っているなら、それは仕組みで潰せる可能性が高いです。
【群馬・北関東の中小企業・ひとり社長のAI導入をサポート】
UMEO CREATE(ウメオクリエイト)では、群馬県(高崎・前橋・太田・伊勢崎・吉岡町など)を中心に、中小企業や個人事業主・ひとり社長様向けの「AI導入・業務自動化・DX伴走コンサルティング」を行っています。
「自社の業務でもAIを使える?」「何から手をつければいいかわからない」「面倒な事務作業を自動化したい」といったご相談は、お気軽に公式LINEまたはWebサイトのお問い合わせフォームよりご連絡ください。