Google Apps Scriptのクラスでプライベートプロパティを作成する方法


closure

photo credit: verchmarco Ein schwarzes Schweinchen hinter weißem Zaun via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。

前回の記事はこちらです。

Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
「初心者でもわかるGoogle Apps Scriptのクラスの作り方」をテーマにシリーズをお送りしています。今回は、GASでスプレッドシートのデータの1行分を表すクラスを作る方法です。

スプレッドシートの表の一行分を表すクラスを作成しました。

ただ、このクラスをもとに生成したインスタンス、すべてのプロパティが外部から読み書き自由です。

特に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キーワードを使った変数や関数を普通に宣言するというものです。

プライベートプロパティであれば

var 変数名

プライベートメソッドであれば

var メソッド名 = function(引数1, 引数2,…) {
 //処理
}

とします。

プライベートプロパティを作るスクリプト

今回はプライベートプロパティをつくりたいので、以下のようにしてみました。

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のクラスでプライベートプロパティを作成する方法をお伝えしました。

スコープの仕組みさえ頭に入っていれば、まあ普通のことですね。

ただ…このままでは上書きもできませんが、読み取りもできないですよね…

ということで、次回は読み取りをするためのメソッドを作っていきます。

Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズをお送りしています。今回は、GASでクラスのプライベートプロパティを取得するメソッドを作成する方法についてお伝えします。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
  4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
  5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
  6. GASでゲッターを使って簡単なプロパティを作成する方法
  7. GASでセッターを使ってプロパティの入力に制限をかける

タイトルとURLをコピーしました