🔲

GASを使ってGoogleスプレッドシートにShift-JISのCSVを読み込ませる

2024/04/15に公開

こちらの記事を参考にまとめたものを投稿します。Shift-JISつらい。
https://zenn.dev/code_diver/articles/5b6b5205cdc156
https://web-breeze.net/import-csv-to-sheet/

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 を指定するよりも広範囲の漢字や記号をサポートします。つらい。

https://weblabo.oscasierra.net/shift_jis-windows31j/
https://www.swisteria.com/posts/shift-jis_ms932/

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)

https://developers.google.com/apps-script/reference/utilities/utilities?hl=ja#parsecsvcsv

  • getRange(row, column, numRows, numColumns)

https://developers.google.com/apps-script/reference/spreadsheet/sheet?hl=ja#getrangerow,-column,-numrows,-numcolumns

実行

最後に ▷実行 ボタンをクリックするとShift-JIS(MS932)で読み込まれます。
実行ボタンのスクリーンショット

エクスポートについてはまた次回書きたいと思います。

Discussion