どうも。つじけ(tsujikenzo)です。このシリーズでは「2次元配列をオブジェクトに変換する」という内容で全6回でお送りします。今日は第1回目です。
シートの運用管理にもううんざり
このようなスプレッドシートを社内で共有している際、できれば他の人に列を増やしたり、列を移動したりしてほしくないものです。できればじゃなくて『禁止!列の移動、追加、削除』のルールを徹底したいです。
しかし、ルールの運用でうまくいった人はいますか?日に日にストレスは溜まる一方です。
このシリーズでは「2次元配列をオブジェクトに変換して管理する方法」を研究してみたいと思います。
配列で全データを取得する
まず基本ですがおさらいしておきます。GASで書いていきます。
const values = SpreadsheetApp.getActiveSpreadsheet().getDataRange().getValues();
console.log(values)で確認すると、2次元配列で取得できていますね。
[20-11-12 05:44:52:379 JST] [ [ 'id', 'name', 'age', 'favorite', 'address' ],
[ 'tg001', '辻健蔵', 35, 'salmon', '北海道' ],
[ 'tg002', '江藤大', 37, 'coffee', '宮崎県' ],
[ 'tg003', '高橋宣成', 38, 'blog', '東京都' ] ]
しかしこのままだと
const tsujiAge = values[1][2]; //35
のように、配列のインデックスNoを数値で指定することになります。
コードの量が少ない内は大丈夫ですが、コード量が多くなってくるとメンテナンス性に欠けます。
それに、前述の通り予期せぬ誰かに列を変更されてしまった時に、数値で指定したインデックスNoを目と手で変更しなければなりません。
配列をオブジェクトに変換する
そこで配列を連想配列(キーバリュー方式)であるオブジェクトに変換してみます。
それぞれの行に対して、 ‘name’(キー)と’辻健蔵’(値)がコロン:でセット(’name’:’辻健蔵’)になっている形式です。
{
id:{ id:’id’,
name: 'name',
age: 'age',
favorite: 'favorite',
address: 'address' },
tg001:{
id:’tg001’,
name:'辻健蔵',
age:35,
favorite:'salmon',
address:'北海道'
}
}
という形です。
よく見ると{id:{}, tg001:{}}という風に、データ全体もキーと値がセットになったオブジェクトになっています。
行(レコード)が複数あっても問題ありません。カンマ区切りですね。(見やすいように改行を止めました。)
{
id:{ id:’id’, name: 'name', age: 'age', favorite: 'favorite', address: 'address' },
tg001:{id:’tg001’, name:'辻健蔵',age:35,favorite:'salmon',address:'北海道'},
tg002:{id:’tg002’, name:'江藤大',age:37,favorite:'coffe',address:'宮崎県'},
tg003:{id:’tg003’, name:'高橋宣成',age:38,favorite:'blog',address:'東京都'}
}
では、扱いやすいように変数に格納します。
const objValues = {
id:{ id:’id’, name: 'name', age: 'age', favorite: 'favorite', address: 'address' },
tg001:{id:’tg001’, name:'辻健蔵',age:35,favorite:'salmon',address:'北海道'},
tg002:{id:’tg002’, name:'江藤大',age:37,favorite:'coffe',address:'宮崎県'},
tg003:{id:’tg003’, name:'高橋宣成',age:38,favorite:'blog',address:'東京都'}
}
【MEMO】次回以降に詳しくお話しますが、テーブルには必ず1つ以上の主キー(ユニークである必要があります)が必要になります(ここでは’id’)ので、主キーが見当たらない場合はテーブル構造を見直しましょう。そして主キーは必ずテーブルの左端(今回の場合A列)になければいけないルールがあることを覚えておいてください。
オブジェクト化したデータを呼び出す
これで、配列のインデックスNoを気にしなくても、要素を呼び出すことができるようになりました。
オブジェクトのプロパティの呼び出し方法は「ドット記法」と「ブラケット記法」の2種類がありますが、今回は「ブラケット記法」で統一したいと思います。
理由はいつか説明させていただきますが、「2次元配列をオブジェクト化した時の要素の呼び出し方法はブラケット記法」 で丸暗記しましょう。
console.log(objValues['tg001']);
//{id:’tg001’, 'name':'辻健蔵','age':35,'favorite':'salmon','address':'北海道'}
console.log(objValues['tg001']['age']);
//35
結果として「一行目のタイトル文字列は変更しないでね!」という運用上のルールが発生してしまうのは仕方ありません。
しかし、列の順番を変えたり増やしたり減らしたりしても影響がないので、メンテナンス性が飛躍的に上がると思います。
オブジェクト化した配列を再び2次元配列に変換する
最終的には再び2次元配列に変換してスプレッドシートへ出力して作業は完了します。ごにょごにょ。。。(後ほど解説しますので今はイメージのみでお伝えしています)
無事に再変換できたようです。
[20-11-12 05:44:52:379 JST] [ [ 'id', 'name', 'age', 'favorite', 'address' ],
[ 'tg001', '辻健蔵', 35, 'salmon', '北海道' ],
[ 'tg002', '江藤大', 37, 'coffee', '宮崎県' ],
[ 'tg003', '高橋宣成', 38, 'blog', '東京都' ] ]
これで2次元配列→オブジェクト化→処理→2次元配列という流れを、簡単に確認することができました。
今後やること
さて、2次元配列をオブジェクトに変換する方法について大まかな流れをお伝えしました。
勘のいい方は気付いているかもしれませんが、次回以降に深掘りするのはこのような内容です。
- 2次元配列→オブジェクト化って、まさか手作業じゃないですよね?
- オブジェクト化→処理って抽出(必要な列だけ、ある範囲の日時)とかできるんですか?
- 処理→再2次元配列ってごにょごにょしてましたよね。さっき。
- idが無い時ってどうすれば?というか元に戻した時に最初の状態に順番ちゃんと戻るの?
- 「テーブル」とか「主キー」とか「レコード」とか説明無しに出てきたから途中で読むのを止めた方!大変申し訳なかたったでのデータベースの基礎勉強してみましょう!
- あれ?これってJSONじゃないの・・・?
- そもそもオブジェクトってなに?
ぜひお楽しみに!
このシリーズの目次
[GAS]2次元配列をオブジェクトに変換する‐1日目‐
[GAS]オブジェクトリテラルと仲良くなろう【前編】‐2日目‐
[GAS]オブジェクトリテラルと仲良くなろう【中編】‐3日目‐
[GAS]オブジェクトリテラルと仲良くなろう【後編】‐4日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【前編】‐5日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【後編】‐6日目‐