みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。
前回の記事はこちら。
クラスの定義を即時関数化しました。
さて、今回はスプレッドシートの表について、インスタンス配列化していきます。
もともと、そこが目標でしたからね。
ということで、Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法です。
では、行ってみましょう!
前回のおさらい
お題としているスプレッドシートはこちらです。
この一行ずつを表すクラスを前回まで作成しておりました。
そのコードがこちらですね。
(function(global){ var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; Object.defineProperties(this, { id: { get: function(){ return _id; } } }); }; Person.prototype.greet = function(){ Browser.msgBox(this.name + "です、こんにちは!"); }; Person.prototype.log = function(){ Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday); }; global.Person = Person; })(this);
そして、その検証用のmyFunctionがこちら。
function myFunction() { var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); p.log(); }
…まあ、そんなにたいしたことしていませんが汗。
さて、スプレッドシートの一行分のクラスを作ったのはわかったのですが、表全体はまだ上手に取り扱えていない感じです。
ということで、今回はスプレッドシートの表を取り扱えるようにしていきますよ。
スプレッドシートをインスタンスの配列として格納する
それで、GASの場合は「集合」を取り扱うのであれば、配列がすごく便利なんですよね~。
例えば、変数personsを配列として用意して、そこに各行を表すPersonクラスのインスタンスを要素として追加していけば良さそうです。
そのスクリプトがこちらです。
function myFunction() { var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var persons = []; values.shift(); for(var i = 0; i < values.length; i++){ persons[i] = new Person(values[i]); persons[i].log(); } }
実行すると…
おー、いい感じですね!
配列から見出し行を取り除く
5行目のshiftメソッドだけ紹介しておきますね。
これはArrayオブジェクトに用意されているメソッドで、配列の最初の要素を取り除くというものです。
戻り値は取り除いた要素ですが、破壊的メソッドですので対象となるオブジェクトについて操作して変化を加えちゃいます。
変数valuesは二次元配列になっていて、最初の要素は取得した範囲の一行目、つまり見出し行の配列になっているので、それを取り除いちゃってるわけですね。
二次元配列から見出し行を取り除きたいときに、便利っすよ!
まとめ
以上、Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法でした。
GASの配列、便利っすよね!
さて、今回は配列で集合を表したわけですが、これもクラス化していきたいですよね。
次回は、そのあたりを進めていきます。
どうぞお楽しみに!