2021年12月に、この記事(2次元配列を連想配列にするテクニック)に関する最新情報をブログにしました。
[GAS]連想配列はMapオブジェクトを使おう 前半
どうも。つじけ(tsujikenzo)です。このシリーズでは「連想配列はMapオブジェクトを使おう」を、前半、後半でお送りします。今日は、前半戦です。今日のアジェンダはじめにMapオブジェクトの生成Mapオブジェクトの主な...
どうも。つじけ(tsujikenzo)です。このシリーズでは 「共同編集者(自分も含め)にスプレッドシートの列を移動したり、追加削除されたりすると、GASが動かなくなってしまうので、それを解決するライブラリ」 について連載を行っています。
「GASで2次元配列を連想配列化」 とか 「getDataRange()した配列をオブジェクト化」 といったキーワードで検索される方が多いと思います。
今回のアップデートについて
追加されたメソッドは1つです。こちらの記事でメソッドの成り立ちを紹介しています。
マニュアル
それでは [SpreadsheetDateConverterToObject Ver1.2] のマニュアルです。
Overview
SpreadsheetDateConverterToObject.js 1.2
(c) 2020-2021 Kenzo Tsuji all rights reserved
GitHub Repository
coming soon
Introduction
This library contains a function that converts the value of one sheet of a spreadsheet from a 2D array to a Key (column heading) -Value associative array.
Sample sheet
[ [ 'id', 'name', 'age', 'favorite', 'address' ],
[ 'tg001', 'Tsujike', 35, 'sushi', 'Hokkaido' ],
[ 'tg002', 'Etau', 37, 'coffee', 'Miyazaki' ],
[ 'tg003', 'Takahashi', 38, 'blog', 'Tokyo' ] ]
Returns(converted)
//Array type
[
{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'}
]
//Object type
{
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'}
}
//JSON
{
"SHEETNAME1":[
{ "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"}
],
"SHEETNAME2":[
{"名前":"名前","国語":"国語","算数":"算数","英語":"英語","合計":"合計","合否":"合否"},
{"名前":"Tsujike","国語":75,"算数":50,"英語":70,"合計":195,"合否":"不合格"},
{"名前":"Etau","国語":95,"算数":100,"英語":88,"合計":283,"合否":"合格"},
{"名前":"Takahashi","国語":92,"算数":94,"英語":90,"合計":276,"合否":"合格"}
]
}
Library ID
Library ID:1s4kGJwF2eG-WGmeqgLWeqQtIBRAXUZbbh3fQ3f7QHvNywubO99nduFIY
Methods
.getElementsArray(spreadsheetID, sheetName)
@param{string} Spreadsheet ID
@param{string} Sheet Name //e.g ‘Sheet1’
@Returns {object} Array type object from sheet. //e.g [{},{}]
.getElementsObject(spreadsheetID, sheetName)
@param{string} Spreadsheet ID
@param{string} Sheet Name //e.g ‘Sheet1’
@Returns {object} object type object from sheet. //e.g {{},{}}
.getElementData(spreadsheetID, sheetName, primaryKey)
@param{string} Spreadsheet ID
@param{string} Sheet Name //e.g ‘Sheet1’
@param{string} primaryKey(unique key) from a sheet column A //e.g ‘tg001’
@Returns {object} a record from sheet as an object. //e.g {id:’tg001’, name:'Tsujike',age:35,favorite:'salmon',address:'Hokkaido'}
.undoElementsArray(array)
@param{array} //e.g a return from .getElementsArray() method
@Returns {array} 2d array
//e.g
// [ [ 'id', 'name', 'age', 'favorite', 'address' ],
// [ 'tg001', 'Tsujike', 35, 'sushi', 'Hokkaido' ],
// [ 'tg002', 'Etau', 37, 'coffee', 'Miyazaki' ],
// [ 'tg003', 'Takahashi', 38, 'blog', 'Tokyo' ] ]
.undoElementsObject(object)
@param{object} //e.g a return from .getElementsObject() method
@Returns {array} 2d array
//e.g
//[ [ 'id', 'name', 'age', 'favorite', 'address' ],
// [ 'tg001', 'Tsujike', 35, 'sushi', 'Hokkaido' ],
// [ 'tg002', 'Etau', 37, 'coffee', 'Miyazaki' ],
// [ 'tg003', 'Takahashi', 38, 'blog', 'Tokyo' ] ]
[NEW].getJsonFromSpreadsheet(id)
@param {string} SpreadSheet ID
@Returns {object} JSON
//e.g{
// "シート1":[{"personId":"tg001", "name":"kenzo"},{},{}],
// "シート2":[{"clientId":"cl001", "name":"ノンプロ商事株式会社"},{},{}]}
README File
coming soon
Sources
/**
* オブジェクト群を配列で格納するパーツ
* @param {string} SpreadSheet ID
* @param {string} Sheet Name //e.g ‘シート1’
* @return {array} 配列 //e.g[{id:’tg001’, name:’kenzo’},{},{}]
*/
function getElementsArray(id,name) {
const elementsData = [];
const values = getSheetValues_(id, name);
const header = [...values].shift();
for (const value of values){
elementsData.push(getElementInfo_(header,value));
}
return elementsData;
}
/**
* オブジェクト群をオブジェクトで格納するパーツ
* @param {string} SpreadSheet ID
* @param {string} Sheet Name //e.g ‘シート1’
* @return {object} オブジェクト //e.g{{id:’tg001’, name:’kenzo’},{},{}}
*/
function getElementsObject(id,name) {
const elementsData = {};
const values = getSheetValues_(id, name);
const header = [...values].shift();
for (const [i,value] of values.entries()){
elementsData[values[i][0]] = getElementInfo_(header,value);
}
return elementsData;
}
/**
* SSID,シート名,keyを渡すとオブジェクト化した1レコードを返すパーツ
* @param {string} SpreadSheet ID
* @param {string} Sheet Name //e.g ‘シート1’
* @param {string} key //e.g ‘id001’)
* @return {object} オブジェクト //e.g{id:’tg001’, name:’kenzo’}
*/
function getElementData(id,name,key) {
const values = getSheetValues_(id, name);
const header = [...values].shift();
for (const value of values) {
if (value.includes(key)) return getElementInfo_(header,value);
}
}
/**
* 配列型オブジェクトを2次元配列に変換する
* @param {array} 配列型オブジェクト
* @return {array} 2次元配列
*/
function undoElementsArray(array) {
return array.map(element => Object.values(element));
}
/**
* オブジェクト型オブジェクトを2次元配列に変換する
* @param {object} オブジェクト型オブジェクト
* @return {array} 2次元配列
*/
function undoElementsObject(object) {
return Object.values(object).map( element => Object.values(element));
}
/**
* 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);
}
//++サブ関数ここから++//
/**
* 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
}
/**
* スプレッドシート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;
}
/**
* スプレッドシート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;
}
//++サブ関数ここまで++//
まとめ
以上で、ver1.2のマニュアルになります。今後とも末永くよろしくお願いいたします。
このシリーズの目次
- [GAS]はじめてのライブラリ -Day1-
- [GAS]2次元配列をオブジェクト化ライブラリ -Day2‐
- [ライブラリ][GAS]SpreadsheetDateConverterToObject
- [ライブラリ][GAS]SpreadsheetDateConverterToObjectに機能を追加しよう
- [ライブラリ][GAS][マニュアル]SpreadsheetDateConverterToObject ver1.1
- [ライブラリ][GAS]SpreadsheetDateConverterToObjectでJSONを取得しよう
- [ライブラリ][GAS][マニュアル]SpreadsheetDateConverterToObject ver1.2