スプレッドシートの見出し行の項目をプロパティにして各データ行をオブジェクト化
ノンプロ研でGAS勉強中です。
ただいま絶賛GAS中級講座を受講中です。
今日は中級講座の宿題にとりくむなかで、いつかやらないとなと思っていた「スプレッドシートに入力されたデータのヘッダー行の項目をプロパティとして、各行のデータをオブジェクトにする関数」を作りました。
言葉だとナンノコッチャですが、以下の表を
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getDataRange();
const data = range.getValues();
console.log(data);
こんな風に値を取得すると
[ [ '商品名', '販売金額', '在庫数' ],
[ '塩', 100, 11 ],
[ '鮭', 200, 22 ],
[ 'おかか', 150, 33 ],
[ '玄米', 100, 44 ],
[ 'ちりめんじゃこ', 200, 55 ] ]
みたいな二次元配列になります。これを
[ { '商品名': '塩', '販売金額': 100, '在庫数': 11 },
{ '商品名': '鮭', '販売金額': 200, '在庫数': 22 },
{ '商品名': 'おかか', '販売金額': 150, '在庫数': 33 },
{ '商品名': '玄米', '販売金額': 100, '在庫数': 44 },
{ '商品名': 'ちりめんじゃこ', '販売金額': 200, '在庫数': 55 } ]
こんな風にしたいイメージです。
実際は、プロパティが日本語だと扱いづらいので、もとのスプレッドシートのヘッダー行は、name, price, stockとするのが良いですが、とりあえず今回はこのままで行きます。
でつくった関数がこれです。
/**
* キー配列と値配列からオブジェクトを戻り値として返す関数
*
* @param {Array} keys オブジェクトのプロパティとなる配列
* @param {Array} ary オブジェクトの値となる配列
* @return {Object} obj キー配列と値配列それぞれのインデックスに対応したオブジェクト
*/
function aryToObj(keys, ary) {
const obj = {};
const numKeys = keys.length;
for (let i = 0; i < numKeys; i++) {
obj[keys[i]] = ary[i];
}
return obj;
}
キー配列と値配列を引数で渡してあげるとオブジェクトにしてくれます。
const keys = [ '商品名', '販売金額', '在庫数' ];
const ary = [ '塩', 100, 11 ];
aryToObj(keys, ary)
{ '商品名': '塩', '販売金額': 100, '在庫数': 11 }
みたいな感じです。後は各配列に繰り返しこの関数を適用していけば、目的は達成されます。
また、こんな感じで中途半端に一部のみを関数化するのでなく、ヘッダー行とデータ行から構成されるスプレッドシートの範囲(rangeオブジェクト)を引数で渡してヘッダー項目をプロパティにオブジェクト化した各行を格納した配列にする関数も便利そうと用意してみました。
/**
* スプレッドシートのデータ範囲から、ヘッダー項目をプロパティにオブジェクト化した各行を格納した配列を戻り値として返す関数
*
* @param {Range} range ヘッダー行とデータ行で構成されるrangeオブジェクト
* @return {Array} dataObjs 全データ行をヘッダー項目をプロパティにオブジェクト化したものを格納した配列
*/
function rangeToDataObj(range) {
const data = range.getValues();
const keys = data.shift();
const dataObjs = []
const numKeys = keys.length;
for (const values of data) {
const obj = {};
for (let i = 0; i < numKeys; i++) {
obj[keys[i]] = values[i];
}
dataObjs.push(obj);
}
return dataObjs;
}
こうして、ちょっとした小ネタをBasic Scriptsと名前をつけたスクリプトデータにコツコツためて、お仕事に活用していきたいと思います。
この記事が気に入ったらサポートをしてみませんか?