さて、久しぶりのブログです。
今回はスプレッドシートのデータをShift_JISに変換して、csv形式でダウンロードする方法の紹介です。
個人的にはあまり使わない(というか使いたくないshift_jis)ですが、日本の古き良き会計ソフト様(T◯C全国会とかが提供してるやつとか)には、utf-8受け入れてくれずshift_jisしかダメみたいな制限があるソフトもあります。
今回もそんな事例にぶち当たったので、スプレッドシートをshift_jisでcsv化してダウンロードする方法の紹介をしていきます。
使わなくて済むなら、使わない方がいいと思うコードです。。
そもそもshift_jisとは?
そもそもshift_jisとは何か、という話からスタートします。
Shift JISとは、JIS規格として標準化された日本語を含む様々な文字を収録した文字コードの一つ。
https://e-words.jp/w/Shift_JIS.html
IT用語辞典の説明を記載しましたが、理解としては文字コード(文字符号化方式)の一つ、と認識してもらえればいいと思います。
スプレッドシートはUNICODE
スプレッドシートはUNICODE(UTF-8)がベースになっています。csvを取り込んでSSへ変換するときも部分的に文字化けするのは、shift-jisのデータだと発生(ある程度はgoogle側が変換してくれますが)。
体験したこともある方も多いと思うので、納得できる部分かなと。
どうやったら実現できる?shift-jisへの変換方法
shift-jisへの変換はDLした後に、変換することも可能ですし、基本皆さんそうやって対応されているかと思います。ただ、そもそもファイル自体を変換することも可能です。
今回は2つのパターンを紹介します。
パターン1はドライブにデータが残して置けるので、ログをちゃんとDriveで管理していきたい方向け。デメリットは結局自分でドライブからDLしなければならず、少しめんどくさい。ただ、ローカルで文字コードを変換する工数は削減可能。
パターン二はローカルPCのダウンロードフォルダに直接shift-jis形式のcsvファイルをDLできるので、作業効率は高い。ただし、ログ保存するためには、結局別途保存用ファイルをuploadする必要がある(もちろん、コード実行時にdriveに同一データを保持するコードを追加すればこの問題は解消可能)。工数削減は変換・DL両方とも簡易化可能。
パターン1:ドライブにshift-jisで保存する方法
では、まずドライブにshift-jisで保存する方法を紹介します。shift-jisのフォーマットになるようにデータを改修して、blob化させた上で、保存します。
function outputSheetToCsvFile() {
// 定数
let fileName = "xxx.csv";
let contentType = "text/csv";
let charSet = "Shift_JIS";
let lineDelimiter = ",";
let newLineChar = "\r\n";
let _ = Underscore.load();
// outputシートからデータを取得
let range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output").getDataRange();
let values = range.getValues();
// 2次元配列になっているデータをcsvのstringに変換
let csvString = _.map(
values,
function(row){return row.join(lineDelimiter);}
).join(newLineChar);
// Shift_JISなBlobに変換
let blob = Utilities.newBlob("", contentType, fileName).setDataFromString(csvString, charSet);
// Blobをファイルに出力
DriveApp.createFile(blob);
}
特に難しいスクリプトもないので、説明はここまでで終了ですw
パターン2:ローカルフォルダにshift-jisで保存する方法
Google driveに保存するには、blobを作成してcreateFileメソッドを使えば、shift_jisベースのcsvファイルを作成することができました。
では、外部のソフトにCSVアップロードするのであれば、ローカルフォルダに直接保存してくれた方が楽ですよね。続いてローカルフォルダにそのままダウンロードするための方法を紹介していきます。
ダウンロード機能の設計
まずは何より、データをダウンロードして、フォルダに保存できるようにならなければ話がスタートしません。
これは、GASでは対応できないので、純粋jsの範囲内のタスクになります。今回はshift-jisへ変換するスクリプトは除いて、純粋にcsvをダウンロードするだけのスクリプトになります。
では、実際にダウンロードするためのスクリプトを見ていきましょう。
ダウンロードするためのjs
GAS側とjs(html)双方で設定が必要になります。
GAS側はDL画面をevaluateするだけです。js側で動作設定は行います。
GAS側
それではまずはシンプルなGAS側のスクリプトです。
function dialog_action() {
// 今回はdialog.html をもとにHTMLファイルを生成
// evaluate() は dialog.html 内の GAS を実行するため( <?= => の箇所)
let html = HtmlService.createTemplateFromFile("dialog").evaluate();
// 上記HTMLファイルをダイアログ出力
SpreadsheetApp.getUi().showModalDialog(html, "ファイルダウンロード");
}
HTMLサービスを利用して、htmlファイルからcreateTemplateFromFileで指定のhtmlファイルをevaluateするだけです。
その上で、modal表示を実行するためです、getUiからshowModalDialogで対象ファイルを指定します。
html/js側
では、次にダウンロードするための動作を設定するhtml/js側のスクリプトです。
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script type='text/javascript'>
function handleDownload() {
let content = <?= getData(); ?>; // 出力データを GAS から取得する
let blob = new Blob([ content ], { "type" : "plain/text"});
document.getElementById("download").href = window.URL.createObjectURL(blob);
}
</script>
</head>
<body>
<a id="download" href="#" download="file_name.csv" onclick="handleDownload()">ダウンロード</a>
</body>
</html>
function handleDownloadメソッドが今回のキーとなります。
blobを作成して、download elementに対して、window.URLでblobオブジェクトを作成するメソッドを設定して、onclickで実行時に動作するように設定しています。
ここら辺は純粋js使ってる方は理解しやすいかもですが、GAS勢はMDNなど見ながら把握されるといいかと思います。
実行結果
以下のような感じでスプレッドシート上にmodal windowが表示されます。

このリンクされたダウンロードリンクをクリックするとDLが実行されます。
まとめ
今回は【GAS: スプレッドシートをShift_JISに変換してダウンロードする方法】として、ドライブへshift-jisでcsvファイルを保存する方法、そして、ダウンロードするための方法を紹介しました。
次回、ダウンロード実行時にshift-jisへ変換する方法も紹介していきます。