GASを使ってGoogleスプレッドシートにShift-JISのCSVを読み込ませる
こちらの記事を参考にまとめたものを投稿します。Shift-JISつらい。
Shift-JIS の CSV を読み込む
通常スプレッドシートは UTF-8 で取り扱われますが、GAS を使うことによって明示的に文字コードを指定しながら CSV ファイルを読み込ませることが出来ます。
読み込ませ方はいくつかあるかと思いますが、
今回は Google Drive に配置した特定のファイルを読み込ませる処理を用意しました。
処理の全体像はこちらです。
function importCsvAtSjis(){
const sheet = SpreadsheetApp.getActiveSheet();
const folder = DriveApp.getFolderById(/* Google Drive フォルダの Slug */);
const files = folder.getFilesByName(/* 読み込む対象のファイル */);
if(!files.hasNext()) {
Logger.log('ファイルが見つかりません');
return;
}
const file = files.next();
const tmpCsvString = file.getBlob().getDataAsString("MS932");
const csvString = tmpCsvString.charCodeAt(0) === 0xFEFF ? tmpCsvString.slice(1) : tmpCsvString;
const csvResult = Utilities.parseCsv(csvString);
sheet.clear();
sheet.getRange(1, 1, csvResult.length, csvResult[0].length).setValues(csvResult);
}
フォルダの Slug(ID) を指定する
DriveApp.getFolderById
では Google Drive フォルダの Slug のみを指定します。
https://drive.google.com/drive/folders 以降を確認する。
例: https://drive.google.com/drive/folders/<SLUG>
ファイルを読み込む
const files = folder.getFilesByName(/* 読み込む対象のファイル */);
if(!files.hasNext()) {
Logger.log('ファイルが見つかりません');
return;
}
const file = files.next();
getFilesByName
でファイルの配列を取得し、hasNext
メソッドで存在有無をチェック。
存在すれば files.next()
でヒットした最初のファイルをアクティブなシートに読み込みます。
読み込む対象のファイルは拡張子を含めて指定してください。
例: Hoge.csv
文字コードは Shift-JIS ではなく MS932 を指定する
ポイントは以下の関数です。
file.getBlob().getDataAsString("MS932");
MS932 は拡張された Shift-JIS を指し、この文字コードで Blob データとして文字列を取得してくれます。
MS932 は歴史的経緯から IBM 拡張文字や NEC 選定 IBM 拡張文字などを含んでいるため、
通常の Shift-JIS を指定するよりも広範囲の漢字や記号をサポートします。つらい。
BOM を取り除く
CSV文字列の先頭にUTF-8のBOMがあるかチェックし、なければそのまま、あれば削除します。
const csvString = tmpCsvString.charCodeAt(0) === 0xFEFF ? tmpCsvString.slice(1) : tmpCsvString;
パースする
Utilities.parseCsv
で2次元配列を生成し、
sheet.getRange(1, 1, csvResult.length, csvResult[0].length).setValues(csvResult);
で展開します。
- parseCsv(csv)
- getRange(row, column, numRows, numColumns)
実行
最後に ▷実行 ボタンをクリックするとShift-JIS(MS932)で読み込まれます。
エクスポートについてはまた次回書きたいと思います。
Discussion