みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズです。
前回の記事はこちら。
GASのクラスにプライベートプロパティを作成する方法をお伝えしました。
今回は、そのプライベートプロパティの値を取得できるメソッドを作っていきます。
ということで、Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法です。
では、行ってみましょう!
前回のおさらい
まず、以下のようなスプレッドシートがあります。
前回までで、この表の各行を表すクラスを作成しました。
それがこちらです。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p); Logger.log(p._id); }
コンストラクタPerson内で宣言している変数_idがプライベートプロパティでした。
プライベートなので、実行しても14行目のログは「undefined」。アクセスはできません。
プライベートプロパティの値を取得するには?
今回は、このPersonクラスのプライベートプロパティ変数_idの値を取得する方法を考えたいのですが、どうすれば良いでしょうか?
普通に変数_idを参照することはできませんので、メソッドを経由して取得する方法を模索していくことにしましょう。
prototypeプロパティにメソッドを追加する
「メソッド」を作りたいわけですから、以下の記事でお伝えしたとおり、Personクラスのprototypeプロパティを使いたいとなります。
変数_idの値を返す、getIdというメソッドを追加してみましょう。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; }; Person.prototype.getId = function(){ return _id; } var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p); Logger.log(p.getId()); }
しかし、実行すると以下のように 『「_id」が定義されていません。』というエラーになってしまいます。
そうなんです、変数_idをプライベートにしているものはそのスコープ。
コンストラクタ関数内で定義されていることで、その関数内でのみアクセス可能になるから、だからこそのプライベートなんです。
コンストラクタ関数の外にあるステートメントからはアクセスはできないのです。
コンストラクタ内にメソッドを定義する
したがいまして、今回はprototypeプロパティへのメソッド追加は断念。
コンストラクタ内に、普通にメソッドを定義することにします。
こちらです。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; this.getId = function(){ return _id; }; }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p); Logger.log(p.getId()); }
実行結果はこちらです。
このように、プライベートプロパティの値を取得することができました。
prototypeの利点がなくなってしまいますが、プライベートプロパティにアクセスするには仕方なし、ですかね。
まとめ
以上、Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法をお伝えしました。
プライベートプロパティを取得するメソッドは、スコープの関係でクラスのprototypeプロパティには定義できないので、コンストラクタ内に直接定義する必要があります。
次回は、プライベートプロパティにアクセスする別の方法を紹介していきます。
どうぞお楽しみに!