[ライブラリ][GAS]SpreadsheetDateConverterToObjectでJSONを取得しよう

GAS

2021年12月に、この記事(2次元配列を連想配列にするテクニック)に関する最新情報をブログにしました。

[GAS]連想配列はMapオブジェクトを使おう 前半
どうも。つじけ(tsujikenzo)です。このシリーズでは「連想配列はMapオブジェクトを使おう」を、前半、後半でお送りします。今日は、前半戦です。今日のアジェンダはじめにMapオブジェクトの生成Mapオブジェクトの主な...

どうも。つじけ(tsujikenzo)です。今日は 「SpreadsheetDateConverterToObjectでJSONを取得しよう」 というタイトルでお送りします。

単発の記事ですが、内容的には、「以前公開したライブラリに、機能を追加しましたよ」というお知らせです。

今回は、新しいメソッドを追加します。

これまでのおさらい

このライブラリは、スプレッドシートの値を2次元配列に格納し、{カラム名:値}のオブジェクトに変換する .getElementsObject()メソッド を持っていました。

//.getElementsObject()
{
id:{ id:'id', name: 'name', age: 'age', favorite: 'favorite', address: 'address' },
tg001:{id:'tg001', name:'Tsujike',age:35,favorite:'salmon',address:'Hokkaido'},
tg002:{id:'tg002', name:'Etau',age:37,favorite:'coffee',address:'Miyazaki'},
tg003:{id:'tg003', name:'Takahashi',age:38,favorite:'blog',address:'Tokyo'}
}

今回は、このオブジェクトの形式を少し変更しまして、このようなオブジェクトで戻り値を返すメソッドを実装します。

//Object type
{
sheetName:[
{ id:'id', name: 'name', age: 'age', favorite: 'favorite', address: 'address' },
{id:'tg001', name:'Tsujike',age:35,favorite:'salmon',address:'Hokkaido'},
{id:'tg002', name:'Etau',age:37,favorite:'coffee',address:'Miyazaki'},
{id:'tg003', name:'Takahashi',age:38,favorite:'blog',address:'Tokyo'}
]
}

成果物の確認

「シート1」と「シート2」をもつ、このようなスプレッドシートがあります。

成果物その1

「シート1」のみをこのようなオブジェクト形式に変換します。

成果物その2

「スプレッドシート全体」をこのようなJSON形式に変換します。

既存のサブ関数の確認

このライブラリには、「スプレッドシートid」と「シート名」を渡すと2次元配列のVALUESを返す、サブ関数が用意されてます。

/**
* スプレッドシートidとシート名を渡すと2次元配列のVALUESを返すパーツ
* @param {string} SpreadSheet ID
* @param {string} Sheet Name //e.g ‘シート1’
* @return  {object} 2次元配列 //e.g [[],[]]
*/
function getSheetValues_(id, name){
const values =
SpreadsheetApp.openById(id).getSheetByName(name).getDataRange().getValues();
return values;
}

同じように、「header」と「1レコード」を渡すと、オブジェクト化してくれるサブ関数が用意されています。

/**
* 1レコードをオブジェクト化してくれるパーツ
* @param {array} header  //e.g [‘id’,’name’]
* @param {array} value //values = Sheet.getDataRange().getValues()の、value
* @return  {object} オブジェクト //e.g{id:’tg001’, name:’kenzo’}
*/
function getElementInfo_(header,value) {

const object = {};
for(const [i, element] of header.entries()){
object[header[i]] = value[i];
}
return object
}

この2つをサブ関数として、新たなオブジェクト形式を返す getRecordsObject_() というサブ関数を作成します。

/**
* スプレッドシートidとシート名を渡すと、プロパティに配列として連想配列を持つオブジェクトを返す関数
* @param {string} SpreadSheet ID
* @param {string} Sheet Name //e.g ‘シート1’
* @return  {object} オブジェクト //e.g{シート名:[{id:’tg001’, name:’kenzo’},{},{}]}
*/
function getRecordsObject_(id,sheetName) {

const values = getSheetValues_(id, sheetName);
const header = [...values].shift();

const records = {};
const mappedValue = values.map(value => getElementInfo_(header,value));
records[sheetName] = mappedValue;

return records;

}

getRecordsObject_() は1シート(テーブル)を、オブジェクト形式で返すサブ関数でした。

さらに、「スプレッドシートID」を渡すと、スプレッドシートに含まれるシート(テーブル)をすべてJSON形式に変換する getJsonFromSpreadsheet()関数 を作成します。これが今回の最大の目的です。

/**
* SSIDを渡すと、全てのシートデータをJSONで返す関数
* @param {string} SpreadSheet ID
* @return  {object} JSON
* //e.g{
"シート1":[{"personId":"tg001", "name":"kenzo"},{},{}],
"シート2":[{"clientId":"cl001", "name":"ノンプロ商事株式会社"},{},{}]}
*/
function getJsonFromSpreadsheet(id) {

const sheets = SpreadsheetApp.openById(id).getSheets(); //[]
const sheetsName = sheets.map(sheet => sheet.getName());

const json = {};
for (const sheetName of sheetsName) {
Object.assign(json,getRecordsObject_(id,sheetName));
}

return JSON.stringify(json);

}
念のため、JSONチェッカーなどで、確認しましょう。
https://lab.syncer.jp/Tool/JSON-Viewer/:embed

問題ないようですね。

次回は、ライブラリのマニュアルを更新したいと思います。お楽しみに。

タイトルとURLをコピーしました