スプレッドシート + Google Apps Scriptでアプリやツールを作る時、ある程度処理が複雑になってくると、データをオブジェクトで扱いたくなったりします。
参考までに、私がよく使うコードを紹介します。
function sample() {
// シート内の表を二次元配列で取得する
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('シート名');
const arrays = sheet.getDataRange().getValues();
// 二次元配列 → オブジェクトの配列
const objects = arraysToObjects(arrays);
console.log(objects);
}
/**
* 二次元配列からオブジェクトの配列を作成する
*/
function arraysToObjects(arrays) {
const [keys, ...records] = arrays;
return records.map(record =>
record.reduce((acc, value, i) => {
acc[keys[i]] = value;
return acc;
}, {})
);
}
実行結果( console.log(objects)の出力 )は下記のとおりです。
[ { name: '神田 庸司',
kana: 'カンダ ヨウジ',
position: '役員',
gender: '男',
blood_type: 'B',
date_of_birth: '1973/08/30',
phone_number: '0855-88-0943',
email: 'kanda1973@sannet.ne.jp' },
{ name: '米田 麻琴',
kana: 'マイタ マコト',
position: '部長',
gender: '女',
// ... 省略 ... //
phone_number: '03-3062-6202',
email: 'hiroyaayorih@sannet.ne.jp' } ]
この方法には以下のようなメリットがあります。
- マジックナンバーをなくして可読性アップ
例えば、3人目のメールアドレスを取得する時、配列のままだとemployees[2][7]のようになりますが、オブジェクトにすればemployees[2].emailのようにできます。 - 列順を変えてもコードの修正が必要ない
配列のままだと、列の順番が変わるたびに、添え字を変更する必要がありますが、オブジェクトであればコード変更の必要がありません。
とにかくコードが読みやすくなるのでおすすめです。
おまけ:セルに配列やオブジェクトが入っている場合
たまにですが、私は、セルに配列やオブジェクトをJSON化して記録しておくことがあります。
その場合は、オブジェクトの配列を作成する関数を少し修正します。
/**
* 二次元配列からオブジェクトの配列を作成する
*/
function arraysToObjects(array) {
const [keys, ...records] = array;
return records.map(record =>
record.reduce((acc, value, i) => {
value.match(/^\[.*\]$/) || value.match(/^\{.*\}$/)
? acc[keys[i]] = JSON.parse(value)
: acc[keys[i]] = value
return acc;
}, {})
);
}
matchメソッドで、 [ で始まり ] で終わる、または、 { で始まり } で終わる文字列だった場合に、JSON.parseすることで、文字列ではなく配列またはオブジェクトにしています。
コメント