🗒️

GoogleSpreadsheetでシンプルなJSONを生成する

3 min read

目的

JSONは便利ですが一覽性が無いのでマスターデータ等を管理するには不向きです。そこで、スプレッドシート(GS)でデータを管理しそれを元にJSONを生成します。

対応するJSON

以下の様な配列が一つ存在する様なJSONを作成出来る様にします。

{
	"animalData": [
		{
			"id": 1,
			"name": "neko",
			"engName": "cat",
			"maxHP": 80
		},
		{
			"id": 2,
			"name": "inu",
			"engName": "dog",
			"maxHP": 100
		}
	]
}

スプレッドシート

まずは下記の様なスプレッドシートを作成します。
1行目は人が理解する為の項目でJSONには反映されません。2行目の項目が実際にJSONに記述される項目になり、3行目以下はそれに対応する値が入ると言う単純なものです。
シート名が配列のキー名、又ファイル名となります。

シート名:animalData

ID 名前 名前(英語) 最大HP
id name engName maxHP
1 neko cat 80
2 inu dog 100

コード

[ツール]から"スクリプトエディタ"があるのでそこからファイルを作成下記コードをまるごと貼り付け、folderIdの<ドライブのフォルダID>をドライブ内の任意のフォルダIDに書き換え実行すれば指定フォルダにJSONが作成されます。

gs2JSON.gs

// 1行目に理解の為の項目名、2行目にJSONに記述する項目名、3行目以下から対応する値を設定する。
// データオブジェクト配列が一つだけのシンプルJSONを作成する時に使用する。
// ファイル名はシート名から取得する。
function gs2JSON (){
  // 保存するフォルダIDと名前
  const folderId = '<ドライブのフォルダID>';
  // 現在のスプレッドシートを取得
  var sheet = SpreadsheetApp.getActiveSheet();
  // キー名取得
  var keyName = sheet.getSheetName();
  // シート名の最初の文字列を大文字に設定
  var fileName = keyName.charAt(0).toUpperCase() + keyName.slice(1)

  // 項目名取得 jsonで記述する項目名は2行目
  var headRange = sheet.getRange(2, 1, 1, sheet.getLastColumn());
  var headValues = headRange.getValues().flat().filter(String).map(String);
  // 全ての値取得 データは3行目から始まる
  var dataRange = sheet.getRange(3, 1, sheet.getLastRow() - 2, sheet.getLastColumn());
  var dataValues = dataRange.getValues();

  // データ全体を格納し、出力に用いるオブジェクト
  var jsonObj = {};
  // レコード内のデータを格納するオブジェクト
  var dataObj = {};
  // データオブジェクトを配列として格納
  var dataObjAry = [];

  // 1行ずつデータを取り出し、オブジェクトに設定
  dataValues.forEach((datas)=> {
    var cnt = 0
    dataObj = {}; // dataObjの初期化
    headValues.forEach((head)=>{
      // dataObjに項目名に対応した値を設定
      dataObj[head] = datas[cnt];
      cnt++;
    });
   // dataObjをまとめる
    dataObjAry.push(dataObj);
  });
  // キー名をつけてdataObjAryをjsonObjに格納。
  jsonObj[keyName] = dataObjAry;

 // タブ区切りでオブジェクトをシリアライズ化
  var jsonObj = JSON.stringify(jsonObj, null, '\t')
  console.log(jsonObj);

  // JSON書き出し
  createJsonFile(folderId, fileName, jsonObj);
}


/**
 * テキストファイル書き出し
 * @param {string} folderId フォルダID
 * @param {string} fileName ファイル名
 * @param {string} contents ファイルの内容
 */
function createJsonFile(folderId, fileName, contents) {  

  // コンテンツタイプ
  const contentType = 'application/json';
  // 文字コード
  const charset = 'UTF-8';
  // 出力するフォルダ
  const folder = DriveApp.getFolderById(folderId);
  // Blob を作成する
  const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(contents, charset);
  // ファイルに保存
  folder.createFile(blob);
}

コード詳細

やっている事はスプレッドシートの項目名とデータを取得し対応するオブジェクトにした上でJSON.stringifyでシリアライズ化しJSONとして書き出しているだけです。


このコードを元にもう少し複雑なJSONも作れる様にしました。
GoogleSpreadsheetでちょっと複雑なJSONを出力する