2021年12月に、この記事(2次元配列を連想配列にするテクニック)に関する最新情報をブログにしました。
どうも。つじけ(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);
}
問題ないようですね。
次回は、ライブラリのマニュアルを更新したいと思います。お楽しみに。