🗒️
GoogleSpreadsheetでシンプルなJSONを生成する
目的
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を出力する
Discussion