Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法


crane

photo credit: gsx-r750 Why? Because they could! via photopin (license)

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

初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズです。

前回の記事はこちら。

Google Apps Scriptのクラスでプライベートプロパティを作成する方法
「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。今回は、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プロパティを使いたいとなります。

Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。今回はGASでクラスに最も簡単なメソッドを追加する方法です。プロトタイプについても解説していますよ。

変数_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プロパティには定義できないので、コンストラクタ内に直接定義する必要があります。

次回は、プライベートプロパティにアクセスする別の方法を紹介していきます。

GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。今回はGASでdefinePropertiesメソッドを使ってプロパティを定義する方法です。

どうぞお楽しみに!

連載目次:初心者向け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でセッターを使ってプロパティの入力に制限をかける

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

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