Categories: ITコラム

GASでスプレッドシートのデータをjson化

この記事では、スプレッドシートのデータからjsonデータを作るGASについて解説しています。

Qiitaの記事を参考にしてGASを作成、使ってみたものの、データ量が多く時間がかかるという悩みを解消すべく、より高速に処理できるようにリファクタリングをしたものになります。

json形式のデータを簡単に作成したい場合におすすめのGASになっておりますので、ぜひ参考にしてください。

スポンサーリンク

やりたいこと

  • スプレッドシートのデータを1行目をKey2行目以降をvalueとする整形済みjson形式のデータに変換したい。
  • json形式のファイルとしてダウンロードしたい。
  • 大きいデータでも短時間で処理したい。

gasとhtmlファイルの作成

拡張機能 > app script から gasエディタを開くと、コード.gs というgasファイルが存在するため以下のコードをコピペする。

gasファイルのファイル名は何でもよい(例:jsonConversion.gas)

//ダウンロードダイヤログ表示
function toJSON() {
  //ダイヤログテンプレート読み込み
  var dl_html = HtmlService.createTemplateFromFile("dl").evaluate();

  //ダイヤログ表示
  SpreadsheetApp.getUi().showModalDialog(dl_html, "JSONファイルをダウンロード");
}

//データ取得
function getData() {
  //データ取得するシート(現在開いているシートを指定)
  var sheet = SpreadsheetApp.getActiveSheet();
  //行(横軸)と列(縦軸)の最大数を取得
  var maxRow = sheet.getLastRow();
  var maxColumn = sheet.getLastColumn();
  
  // すべてのデータを一度に取得(これが高速化の鍵)
  var allData = sheet.getRange(1, 1, maxRow, maxColumn).getValues();
  
  //JSON用のkey(1行目)
  var keys = allData[0];
  
  //データ格納配列
  var data = [];
  
  //データの取得(2行目から)
  for (var i = 1; i < allData.length; i++) {
    var json = {};
    
    for (var j = 0; j < keys.length; j++) {
      json[keys[j]] = allData[i][j];
    }
    
    //データ格納
    data.push(json);
  }
  
  //整形してテキストにします
  return JSON.stringify(data, null, '\t');
}


//スプレッドシート読み込み時に実行
function onOpen() {
  //メニューバーにJSON出力用メニューを追加
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "JSONで出力",
    functionName : "toJSON"
  }];
  spreadsheet.addMenu("JSON", entries);
};

次にダウンロードするためのポップアップウィンド用に、ファイルを追加から新規でhtmlファイルを作成する。

上記の12行目でファイル名を指定しているため、ファイル名は dl.html とする。
(※変更する際は上記と合わせて変更すること)

以下のコードをコピペする。

<!DOCTYPE html>
<html>
<head>
    <base target="_top">
    <script type='text/javascript'>
        //ダウンロード実行
        function handleDownload() {
            //JSONデータの取得
            var content = <?= getData(); ?>;
            //ダウンロード用URL生成
            var blob = new Blob([content], { "type": "application/json" });
            document.getElementById("download").href = window.URL.createObjectURL(blob);
        }
    </script>
</head>
<body>
    <!-- JSONダウンロードボタン:json名は適宜設定してください-->
    <a id="download" href="#" download="download_file.json" >

以上、完了したら保存する。

gas実行

保存したらスプレッドシートに戻ってメニューから実行する。
(※メニューに表示されていない場合、シートの再読み込みを行うと表示される。)

初回は認証が必要になるため、許可をする必要がある

メニューバーに「JSON」が追加される
処理が終わるとダウンロード用のポップアップ(モーダル)が表示される

ダウンロードをクリックするとjson形式のファイルをダウンロードできる。

参考

スプレッドシートからjsonを作る - Qiita
やりたいことスプレッドシートからjsonを作りたい。見出しをkeyにするパターンと{id:001, name=aaa, flg=true},{id:002, name=bbb, flg=fal…

修正内容と理由

参考元はループ内でAPIを実行し取得しているため、処理に時間がかかってしまっていた。
⇒最初に一度APIを実行、データを一括で取得し配列として持ち、そのデータを取り出す形にリファクタしたものである。

不要なログ出力の削除
デバッグ用かログ出力の記述が残ったままとなっていた。
⇒実挙動には不要な記述となるため、少しでも処理速度を向上するため削除した。

maruta

Recent Posts

正規表現を使って文字列をヒットする方法 | JavaScript

「特定の単語やパターンを一瞬で…

1か月 ago

【JSTQB】3章 静的テスト|解説

(※当記事は、2024年12月…

5か月 ago

【JSTQB】1章 テストの基礎|解説

(※当記事は、2024年12月…

5か月 ago

Gitとは?利便性や用途について深掘りして解説

エンジニアとしてプログラミング…

5か月 ago

This website uses cookies.