こんにちは、もりです!
この記事では、スプレッドシートのデータを使って「オブジェクト」を作成する方法を紹介します!
スプレッドシートのデータから「オブジェクト」を作成します。
- 1行目:キー
- 2~n行目:値
Contents
【予備知識1】オブジェクト(連想配列)とは
まず、「配列」と「オブジェクト(連想配列)」の違いをみておきましょう。
オブジェクト(連想配列)とは、「キー」と「値」をペアにしたデータ構造です。
1 2 3 4 5 6 7 8 9 10 11 |
function Sample1() { //配列 var arr = [1, 'Tom', 20]; Logger.log(arr); //[1, Tom, 20] //連想配列 var obj = {'id':1, 'name':'Tom', 'age':20}; Logger.log(obj); //{name=Tom, id=1, age=20}※出力順は不定 } |
※正確には「配列」も「連想配列」ともに「オブジェクトの一種」ですが、JavaScriptでは「連想配列」を「オブジェクト」と表現するのが一般的なので、この記事では「オブジェクト」という単語を使用します。
【予備知識2】オブジェクトのキーに変数を使用する方法
GASでは、オブジェクトの「キー」に変数を使用することが可能です。
(参考サイト)[GAS]キーを変数から取得してオブジェクトを作る
サンプルコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function Sample2() { //オブジェクトのキーを準備 var key1 = 'id'; var key2 = 'name'; var key3 = 'age'; //空のオブジェクトを作成 var obj = {}; //各キーの値を設定 obj[key1] = 1; obj[key2] = 'Tom'; obj[key3] = 20; Logger.log(obj); //{name=Tom, id=1, age=20}※出力順は不定 } |
【予備知識3】配列とオブジェクトをネスト(入れ子)する方法
「配列」の定義には、角括弧(かくかっこ)を使います。
1 |
var arr = [] |
「オブジェクト」の定義には、波括弧(なみかっこを使います。
1 |
var obj = {} |
「配列」の中に「オブジェクト」を列挙する記述方法です。
スプレッドシートのデータからオブジェクトを作成
まず、全体のコードがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var values = sheet.getDataRange().getValues(); var key1 = values[0][0]; //id var key2 = values[0][1]; //name var key3 = values[0][2]; //age var arr = []; //空の配列 for (var i = 1; i < values.length; i++) { var obj = {}; //空のオブジェクト(初期化) obj[key1] = values[i][0]; obj[key2] = values[i][1]; obj[key3] = values[i][2]; arr.push(obj); //配列の末尾に追加 } Logger.log(arr); } |
ログ出力結果です。
1 |
[{name=Tom, id=1, age=20}, {name=Bob, id=2, age=30}, {name=Mom, id=3, age=40}] |
※GASではオブジェクトの並び順は保証されていません。
- スプレッドシート id, name, age の並び順
- ログ出力結果 name, id, age の並び順
スプレッドシートのデータを取得(二次元配列)
アクティブなシートのデータ範囲を、変数valuesに格納します。
1 2 |
var sheet = SpreadsheetApp.getActiveSheet(); var values = sheet.getDataRange().getValues(); |
二次元配列valuesの番地[x][x]は以下のとおりです。配列の長さ(length)は4です。
オブジェクトの「キー」にする変数を用意
スプレッドシート1行目の各項目を、オブジェクトの「キー」として使うために、変数に格納します。
(※この時点ではまだオブジェクトは存在しません。変数に値を代入しているだけです)
1 2 3 |
var key1 = values[0][0]; //id var key2 = values[0][1]; //name var key3 = values[0][2]; //age |
ループ1周目(i = 1)
空のオブジェクトを作成してから、オブジェクトの各「キー」に「値」を設定します。
1 2 3 4 5 |
var obj = {}; //空のオブジェクト(初期化) obj[key1] = values[i][0]; obj[key2] = values[i][1]; obj[key3] = values[i][2]; |
i = 1 なので、スプレッドシートの2行目の値です。
ここでオブジェクト(変数obj)の中身を確認してみます。各「キー」に、スプレッドシート2行目の「値」が設定されています。
1 |
Logger.log(obj);//{name=Tom, id=1, age=20} |
つづいて、「配列」に「オブジェクト(変数obj)」を追加します。配列の末尾に要素を追加するpushメソッドを使用します。
1 |
arr.push(obj); |
この時点の配列(変数arr)の状態です。
以上がfor文1周目の処理です。同じ処理を繰り返します。
ループ2周目(i = 2)
オブジェクトの各「キー」に「値」を設定します。i = 2 なので、スプレッドシートの3行目の値です。
pushメソッドで「配列」の末尾に「オブジェクト」追加します。
ループ3周目(i = 3)
オブジェクトの各「キー」に「値」を設定します。i = 3 なので、スプレッドシートの4行目の値です。
pushメソッドで配列の末尾に追加します。
結果出力(ログ)
処理が終了しました。結果を見てみましょう。
1 |
Logger.log(arr); // [{name=Tom, id=1, age=20}, {name=Bob, id=2, age=30}, {name=Mom, id=3, age=40}] |
まとめ
スプレッドシートのデータから、オブジェクトを作成する方法を紹介しました!
- 「配列」と「オブジェクト」の違い
- 「配列」と「オブジェクト」をネストする方法
- 「オブジェクト」のキーに変数を使用する方法
この方法の嬉しいポイントは2つ!
- オブジェクトの「キー」に変数を使用するので、キー名称を変更する場合、スプレッドシートのデータを書き換えるだけでOK!(スクリプトの修正不要)
- ループ処理なので、スプレッドシートの行数が増減してもOK!