スプレッドシートからjsonデータを生成する

スプレッドシートの内容からjsonデータを生成する方法を試してみました。

設定方法

例として、以下のようなスプレッドシートを用意します。

拡張機能 > Apps Script を選択します。

コード.gsの内容を下記に変更します。

function generateJson() {
  const jsonKey = 'data'; // jsonのkey名

  // データの取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  const lastRow = sheet.getLastRow();
  const lastColum = sheet.getLastColumn();
  const keys = sheet.getSheetValues(1, 1, 1, lastColum).flat();
  const values = sheet.getSheetValues(2, 1, (lastRow-1), lastColum);

  // データの整形
  const data = values.reduce((data, currentValue) => {
    const d = keys.reduce((previousValue, currentKey, index) => {
      previousValue[currentKey] = currentValue[index];
      return previousValue;
    }, {});
    data[jsonKey].push(d);
    return data;
  }, {[jsonKey]: []});
  const json = JSON.stringify(data);

  return json;
}

function downloadDialog() {
  const html = HtmlService.createTemplateFromFile("dialog").evaluate();
  SpreadsheetApp.getUi().showModalDialog(html, 'json形式でダウンロード');
}

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('json')
    .addItem('json形式でダウンロード', 'downloadDialog')
    .addToUi();
};

次にHTMLファイルを追加します。

dialog.htmlというファイル名にして、以下の内容にします。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <button onclick="dl()">ダウンロードが始まらない場合はクリック</button>

    <script type='text/javascript'>
      function dl() {
        const json = <?= generateJson(); ?>;
        const blob = new Blob([json], {
          "type" : "application/json"
        });
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = 'data.json';
        link.click();
      }
      dl();
  </script>
  </body>
</html>

スプレッドシートに戻ってリロードすると、上部メニューにjsonという項目が追加されます。

json > json形式でダウンロードを選択します。

以下のようなダイアログが表示され、data.jsonというファイル名で以下の内容でダウンロードできました。

{"data":[{"id":1,"name":"asakura","age":17},{"id":2,"name":"higuchi","age":17},{"id":3,"name":"ichikawa","age":15},{"id":4,"name":"fukumaru","age":16}]}

色々と試してみましたが、GAS側でファイルのダウンロードまで完結できなさそうだったので、HTMLファイルを用意してスプレッドシート側で呼び出す形での対応になりました。

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年11月
 12
3456789
10111213141516
17181920212223
24252627282930