GAS:スプレッドシートでShift JIS CSVをZIP化してダウンロード
- JavaScript -
2023.04.24
こんなふうに、GASで文字コードをUTF-8ではなく「Shift-JIS」に変換してスプレッドシートをCSVダウンロードする機能。
これは以下Qiitaの記事のコピペで実現できました。
参考記事Qiita:Google SpreadSheet のシートを Shift JIS の CSV 形式でダウンロードする GAS
ところが今回、
- ダウンロードするファイルはZIP化されている状態
- 解凍するとShift-JIS形式のCSVファイルが現れる
という1番目の要件を追加で満たす必要がありました。
結果できあがったので、Qiitaにあるコードに追加修正したものを載せておきます。
GAS:スプレッドシートでShift JIS CSVをZIP化してダウンロード
- ファイル名は、コード内に埋め込まれているものを書き換えれば何でも良いです
- 何も考えずコピペで動きます
download.gsfunction onOpen() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const entries = [
{name : 'CSVダウンロード', functionName : 'downloadSJIS_CSV'},
];
spreadsheet.addMenu(`🔶カスタム機能🔶`, entries);
}
function downloadSJIS_CSV() {
// 開いてるシートのデータを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('★シート名★');
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生成処理:成功');
}
download_dialog.html<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<a id="download" href="#" download="<?= name ?>.zip" 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 src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js" integrity="sha512-XMVd28F1oH/O71fzwBnV7HucLxVwtxf26XV8P4wPk26EDxuGZ91N8bsOttmnomcCD3CS5ZMRL50H0GgOHvegtg==" crossorigin="anonymous" referrerpolicy="no-referrer"></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' })
// JSZipでuint8Arrayをzip化
const zip = new JSZip()
zip.file("test-zip.csv", uint8Array)
zip.generateAsync({ type: "blob" }).then(function(content) {
// URL を a タグにセット
window.URL = window.URL || window.webkitURL
document.getElementById("download").href = window.URL.createObjectURL(content)
});
</script>
<p></p>
</body>
</html>
ちなみに:
本コードは、
ChatGPTにQiitaの元コードを投げて追加したい要望を伝える
↓
提案されたコードを実行したらエラー出る
↓
エラー出たよと聞く
↓
...何度も繰り返し...
↓
成功
という方法で出来上がりました(^^;