みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。
前回の記事はこちらです。

スプレッドシートの表の一行分を表すクラスを作成しました。
ただ、このクラスをもとに生成したインスタンス、すべてのプロパティが外部から読み書き自由です。
特にid…そう簡単に上書きされたら困りますよね。
ということで、今回はプロパティを上書きできないようにしていきます。
では、Google Apps Scriptのクラスでプライベートプロパティを作成する方法です。
では、行ってみましょう!
前回のおさらい
まず、対象としているスプレッドシートはこんな感じのものです。
このスプレッドシートの各行のデータを表すクラスを作成しました。
こちらです。
function myFunction() {
var Person = function(record){
this.id = record[0];
this.name = record[1];
this.gender = record[2];
this.birthday = record[3];
};
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);
};
var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
var p = new Person(values[1]);
p.log();
p.greet();
var q = new Person(values[2]);
q.log()
q.greet();
}
各列のデータをそれぞれid,name,gender,birthdayというプロパティで表して、かつ挨拶をするgreetメソッド、全部のデータをログ出力するlogメソッドを追加しました。
ただ、冒頭でもお話したとおり、idプロパティ…できれば上書きできないようにしたいですよね(実際、名前も性別も誕生日もですがw)。
ということで、今回はidを表すデータについて外部から上書きできないようにしていきます。
プライベートメンバーを定義する
idを表すデータについて外部から上書きできないようにする…要件を整理すると、以下のようなかたちです。
- インスタンス内にいわゆるプロパティ以外の方法でデータを保持をする
- そしてそのidのデータは外部からアクセスできない
これを実現する方法として、JavaScriptではプライベートメンバーという方法が用意されています。
プライベートメンバーの構文
なんか難しそうな名前ですが、コンストラクタ内でvarキーワードを使った変数や関数を普通に宣言するというものです。
プライベートプロパティであれば
プライベートメソッドであれば
//処理
}
とします。
プライベートプロパティを作るスクリプト
今回はプライベートプロパティをつくりたいので、以下のようにしてみました。
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);
}
ちなみに、変数名をアンダースコア(_)からはじめているのは、慣例的に使用されている「プライベートのしるし」です。
実行すると、以下のようなログが確認できます。
変数_idにはアクセスできませんね。
プライベートメンバーの仕組み
プライベートメンバーの仕組みですが、何も特別なことをしているわけではなく、スコープを利用しているだけです。
コンストラクタは関数ですから、その中の変数は外部からは参照することができません。
一方で、new演算子で呼び出されてインスタンス化されていますので、そのインスタンスが存在している間、その内部の変数は保持されているのです。
まとめ
Google Apps Scriptのクラスでプライベートプロパティを作成する方法をお伝えしました。
スコープの仕組みさえ頭に入っていれば、まあ普通のことですね。
ただ…このままでは上書きもできませんが、読み取りもできないですよね…
ということで、次回は読み取りをするためのメソッドを作っていきます。

どうぞお楽しみに!




