不動産の申込システムからデータをCSVで出力して、他のシステムに取り込もうとした時のことです。こちらで作ったCSVを担当者が開くと、日本語の列名がすべて豆腐(□□□)になっていました。
ファイルは正しく作れている。でも開けない。こういうときの原因のほとんどはエンコードの不一致で、対処も「変換を一手挟む」だけです。ただ、その一手が思ったより面倒でした。
Shift-JIS変換で詰まった流れ
GASで申込データをCSVに変換する処理を作っていました。出力先は業務担当者のWindows PC。ExcelはデフォルトでShift-JISを読みにいくので、CSVもShift-JISで出せばいい、という判断でした。
AIに頼んでコードを作り、Encoding.jsというライブラリで文字コードを変換する処理を書いてもらいました。動かしてみると、こういうエラーが返ってきました。
TypeError: Encoding.convert is not a function
ライブラリは追加済みでした。でも動かない。AIと一緒に確認すると、関数の呼び出し方の形式が違っていました。引数をオブジェクト形式で渡していたのを、位置引数に変えたら通りました。
ただ、これで終わりではなかったです。変換はできたように見えたのに、出力されたCSVをExcelで開くとやはり文字化けしました。今度はShift-JIS変換の処理が本当に効いているのかが怪しくなって、デバッグのために確認コードを追加して確かめる時間が発生しました。
BOM付きUTF-8という迂回路
「Shift-JISに変換するのが無理なら、BOM付きUTF-8を試してみる」という提案が出ました。
BOM(Byte Order Mark)は、ファイルの先頭に付ける3バイトの目印で、「このファイルはUTF-8で書かれている」とソフトに伝える役割があります。ExcelはBOM付きのCSVを見ると「UTF-8として開く」と判断してくれます。BOMがないと「Shift-JISかな」と推測してしまうため、文字化けが起きます。
BOM付きUTF-8で出力するように変えたら、Excelで正しく開けました。
Shift-JISに変換するよりずっとシンプルな実装で、GASの標準機能だけで完結します。文字コードを変換するライブラリも要りません。
この話の整理
文字化けの原因をまとめると、こうなります。
データ(UTF-8)
↓ ここで変換しないまま出力
CSVファイル(UTF-8・BOMなし)
↓ Excelが「Shift-JISかな」と誤判断
開くと文字化け
解消するには、出口で「このファイルの文字コードはこれです」とソフトに伝える仕組みを入れる必要があります。方法は2つです。
- Shift-JISに変換してから出力する(Excelのデフォルトに合わせる)
- BOM付きUTF-8で出力する(「UTF-8だよ」と宣言する)
GASでは1の方法がライブラリへの依存や実装コストが重くなりやすいので、特別な理由がなければ2のほうが確実です。
どこで詰まりやすいか
Shift-JIS変換は「できそうだけど意外と引っかかる」作業の典型です。今回は次の2か所で止まりました。
ひとつは、Encoding.jsライブラリの呼び出し方の形式。サンプルコードと実際に求められる形式が違っていて、そのままでは動きませんでした。AIが出してくれた初版コードも引数の渡し方が違っていたので、エラーを見ながら直す工程が必要でした。
もうひとつは、変換後のファイルが本当にShift-JISになっているかの確認。変換処理が通っても、ファイルの中身は変わっていないことがあります。確かめる手が要ります。
BOM付きUTF-8に切り替えてからは、こうした引っかかりがなくなりました。
AIへの頼み方
このとき私がAIに投げた指示の骨格はこういうものでした。
GASでJSONデータをCSVに変換して、Googleドライブに保存したい。CSVはWindowsのExcelで開けるようにしたい。文字化けを防ぐ処理もつけてほしい。
最初にShift-JIS変換を試みたのもAIが提案した方法でしたが、詰まった後に「BOM付きUTF-8という方法もある」と気づかせてくれたのも同じやり取りの中でした。
ライブラリが要るかどうか、どちらの方法がGASで動きやすいか。こういう判断を一緒に考えてもらいながら進めるのが、今の私のやり方です。
同じ構造の困りごと
「出力したCSVが取り込めない」「開くと文字化けする」という相談は、業種を問わずよく来ます。
受注データ、申込データ、帳票の出力結果。システムからCSVが出るようになると、次に出てくるのが「別のシステムに読み込めない」です。原因のほとんどはエンコードの不一致で、変換を一手挟むと解消します。
そのひと手間を自動化の流れに組み込んでしまうと、担当者がCSVをいじらなくて済むようになります。
