「ダウンロード」メニューの CSV (Shift JIS) を選ぶとダイアログが表示され、ダウンロードリンクをクリックすると SJIS 形式で DL できる。
動作確認は Chrome でしかしてない。
download.gs:
function onOpen() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const entries = [{
name : 'CSV (Shift JIS)',
functionName : 'downloadSJIS_CSV'
}];
spreadsheet.addMenu('ダウンロード', entries);
}
function downloadSJIS_CSV() {
// 開いてるシートのデータを取得
const sheet = SpreadsheetApp.getActiveSheet();
const sheetName = sheet.getName();
const values = sheet.getDataRange().getValues();
// 文字列のままテンプレートに渡して html を表示
const template = HtmlService.createTemplateFromFile('download_dialog');
template.values = JSON.stringify(values)
template.name = sheetName;
SpreadsheetApp.getUi().showModalDialog(template.evaluate(), 'CSV (Shift JIS)');
}
download_dialog.html:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<a id="download" href="#" download="<?= name ?>.csv" target="_blank">ダウンロード</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.3.7/papaparse.js" integrity="sha256-QvijOmxLUGxTuoxamQikzFRUJ5hFoDOG71tl2M+LULw=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/encoding-japanese/1.0.28/encoding.min.js" integrity="sha256-vvOjQJ89zzmmngTqmXugSMR1JFKbDZuOxHMP3Ia8EdA=" crossorigin="anonymous"></script>
<script>
const values = JSON.parse(<?= values ?>)
// CSV 文字列にする
const csv = Papa.unparse(values)
// encoding.js を使って csv 文字列を sjis array に変換
const sjisCodeArray = Encoding.convert(csv, {
from: 'UNICODE',
to: 'SJIS',
type: 'array'
})
// sjis array を blob に変換
const uint8Array = new Uint8Array(sjisCodeArray)
const blob = new Blob([ uint8Array ], { type: 'text/csv' })
// URL を a タグにセット
window.URL = window.URL || window.webkitURL
document.getElementById("download").href = window.URL.createObjectURL(blob)
</script>
</body>
</html>
GAS タグついてるけど全然 GAS 書いてない
GAS でやってるのはシートの二次元配列を JSON にしてテンプレートに渡すだけで、あとの処理はダイアログで開いた HTML でクライアント側にやらせちゃってる。
自分で言うのもなんだけど、なかなかおもしろいアプローチで他にも使える場面あるんじゃないかと思うし、きっちりメンテされてる JS のライブラリをそのまんま使えるので筋もいいと思う。