GAS:スプレッドシートでShift JIS CSVをZIP化してダウンロード

- JavaScript -
2023.04.24
google

スプレッドシートshift-JIS CSVをZIP化

こんなふうに、GASで文字コードをUTF-8ではなく「Shift-JIS」に変換してスプレッドシートをCSVダウンロードする機能。

これは以下Qiitaの記事のコピペで実現できました。

参考記事Qiita:Google SpreadSheet のシートを Shift JIS の CSV 形式でダウンロードする GAS

ところが今回、

  1. ダウンロードするファイルはZIP化されている状態
  2. 解凍すると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の元コードを投げて追加したい要望を伝える

提案されたコードを実行したらエラー出る

エラー出たよと聞く

...何度も繰り返し...

成功

という方法で出来上がりました(^^;

↑TOP