2018年4月13日金曜日

【GAS】Google スプレットシート で BOM付きUTF-8 な CSV出力をしてみよう!

Chrome 管理コンソールなど、BOM付きUTF-8 のCSVしかインポートを受け付けないシステムがあるようです。Windows なら「メモ帳」で UTF-8 保存すると BOM付きになります。ただし Windows10よりBOMなしUTF-8がデフォルトになったようなので、明示的にBOM付きUTF-8での保存が必要です。macOS なら、CotEditor あたりを使えば、BOMあり、なしを選択できます。

Chromebook では Chromeブラウザしかつかえなーい!


下記の事例のように、Chromebook ではBOM付きUTF-8に保存することが難しい模様。


Google スプレットシート > 形式を指定してダウンロード > カンマ区切りの値(.csv 現在のシート)

は、BOMなしのUTF-8なのでした。
下記のようにバイナリエディタ(HexEdit)でみるとBOMがないのが分かります。



ちなみに BOMありの場合には、先頭が EF BB BF で始まります。
参考:Byte_order_mark  (Wikipedia)



CotEditor で見ても BOMなしですね。



BOMありの場合




じゃあ Google Apps Script で実装できるのかな


と思って
を参考に作成してみました。ちょっとハマったところがあったり、バタバタしていたので、小一日掛かってしまいました。

以下、ツールの利用方法です。

実装 - Google スプレットシートに CSV出力のカスタムメニューを追加する


今回3種類追加してみました。


  • OUTPUT to CSV カスタムメニューを追加
    1. Shift_JISコードの CSVを保存
    2. UTF-8(BOM付き)の CSVを保存
    3. UTF-8(BOM無し)のCSVを保存
なお Microsoft Excel で文字化けせずに開くことができるのは、「1」「2」です。つまりは Googleスプレットシートの標準機能で CSV保存したものは Microsoft Excel で開くと日本語が文字化けしまーす。

STEP 1. Google スプレットシートを作成


適当に日本語テキストを入力します。

な感じ。

STEP 2. スクリプトエディタを開き、サンプルコードをコピー&ペーストします。


1. ツール > スクリプトエディタを開きます。
2. 中身を、outputSheetToCsvFile.gs (GitHUB)にあるコードに置き換えます。
3. 保存します。



な感じですね。

STEP 3. コードのいくつかの箇所を変更する


var drive = DriveApp.getFolderById('=== Folder ID ===');

=== Folder ID === は、スプレットシートを保存した Googleドライブのフォルダに移動して、URLの
https://drive.google.com/drive/u/0/folders/=== Folder ID====
の部分をコピー&ペーストで入れて下さい。

var base_fileName = "aaa";
ファイル名のプレフィックス名を設定してください。
aaa_UTF8.csv、aaa_Shift_JIS.csv などで保存されます。

var entries 内の name 変数の値を変更することで、


上記の名称を変更できます。

spreadsheet.addMenu("OUTPUT to CSV", entries);

カスタムメニューの名称を変更できます。

※上記変更をしたら保存してください。

STEP 4. Google スプレットシートを再読込する


開いていた スクリプトエディタが閉じ、カスタムメニュー「OUTPUT to CSV」が表示されているはずです。



のように、それぞれ選択してみましょう。
最初の一度だけ、「承認が必要」画面がでてきます。


「続行」ボタンを押すと



のように警告がでますが、自分がつくったものですので「詳細」リンクをクリックし、
「outputSheetToCsvFile(安全ではないページ)に移動」
リンクをクリックしてください。



そうすれば、このコードが Googleドライブへアクセスしてよいかどうかの許可をきいてくるので「許可」ボタンを押します。

※もし警告を出したくないなら、下記を参考に申請してみてください。
https://support.google.com/cloud/answer/7454865

以上で完了です。
3つのCSV出力をすると下図のように、3つのファイルができると思います。



  • aaa_UTF8N.csv = UTF-8 (BOMなし)
  • aaa_UTF8.csv = UTF-8 (BOMあり)
  • aaa_Shift_JIS.csv = Shift_JIS


です。

STEP 5. 正しくコンバートされているか確認する


aaa_UTF8N.csv


下記のようにバイナリエディタ(HexEdit)でみるとBOMがないのが分かります。



CotEditor で見ても BOMなしですね。



aaa_UTF8.csv


ちなみに BOMありの場合には、先頭が EF BB BF で始まります。
参考:Byte_order_mark  (Wikipedia)



BOMありの場合



aaa_Shift_JIS.csv



のように正しく判定されていますね!!

2018年4月13日 @kimipooh

3 件のコメント:

  1. Kitani様

    お世話になっております。
    G Suite Help Forumに本件についての質問を投稿させて頂いております、yyamaneです。

    この度は、とても丁寧な解説と、本件の対応方法を探って頂き、ありがとうございます!
    取り急ぎになり恐縮ですが、お礼申し上げます。

    本対応方法を試させて頂き、またご報告させてください。
    それでは、失礼いたします。

    返信削除
  2. kitani様

    お世話になっております。
    yyamaneです。

    ヘルプフォーラムのほうにもコメントを返させて頂きましたが、
    私のChromebookの環境で上記対応方法を実施させて頂き、文字化けすること無く正常にユーザー登録ができるようになりました。
    本当にありがとうございました!

    返信削除
  3. うまく解決してなによりでした!

    返信削除