GASでセッターを使ってプロパティの入力に制限をかける


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

「初心者でもわかるGoogle Apps Scriptのクラス」についてシリーズでお伝えしています。

前回の記事はこちら。

GASでゲッターを使って簡単なプロパティを作成する方法
「初心者でもわかるGoogle Apps Scriptのクラス」についてシリーズでお伝えしています。今回は、GASでget構文によるゲッターを使って簡単なプロパティを作成する方法をお伝えします。

「ゲッター」を使って簡単なプロパティを作成する方法をお伝えしました。

さて、今回は「セッター」というものを使って、上書きを禁止するプロパティを作ってみたいと思います。

ということで、GASでセッターを使って上書き禁止のプロパティを作る方法です。

では、行ってみましょう!

前回のおさらい

まずは、おさらいからです。

スプレッドシートのデータを使っていましたが、そのスプレッドシートはこちらです。

スプレッドシートのテーブル

このデータをもとに、以下のようなクラスPersonを作りました。

function myFunction() {
  
  class Person {
    constructor(record) {
      [this.id, this.name, this.gender, this.birthday] = record;
    }
    
    get isMale() {
      return this.gender === 'male';
    }
  }
  
  const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  const p = new Person(values[1]);
  console.log(p.gender, p.isMale);
  p.gender = 'female';
  console.log(p.gender, p.isMale);  
  
}

前回は、get構文で、他のプロパティの値を使って算出するisMaleプロパティを作ったということですね。

「id」を上書きできないようにしたい

さて、このクラスPerson。

constructorメソッドの呼び出しで、id、name、gender、birthdayと4つのプロパティが作成されます。

これらのプロパティは、インスタンス生成後は参照することはもちろん、代入文で上書きも可能となっています。

しかし、例えばidのように、一度格納した値を上書きしたくないという性質のプロパティもありますよね。

このような場合に「セッター」を使って、上書き禁止のプロパティを作ることができます。

set構文でセッターを定義する

セッターというのは、プロパティに値の代入が行われたときに関数を呼び出すことができるというものです。

セッターを作るためには、以下のset構文を使います。

set プロパティ名(仮引数){
 //処理
}

プロパティ名で示すプロパティに代入が行われるときに、この関数が呼び出されて実行されるのです。

なお、仮引数には、代入をしようとした値が渡されます。

セッターによる上書き禁止プロパティ

例えば、以下のようにしてみましょう。

function myFunction() {
  
  class Person {
    constructor(record) {
      [this.id, this.name, this.gender, this.birthday] = record;
    }
    
    set id(newId) {
      if(this.id) throw 'idは上書きできません';
      this._id = newId;        
    }
        
    get id() {
      return this._id;
    }
  }
  
  const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  const p = new Person(values[1]);
  console.log(p.id);
  p.id = 'hoge';
}

実行すると、以下のようにエラー「idは上書きできません」が発生します。

GASのセッターによるエラーメッセージ

ログを見ると以下のように、「a01」とエラーメッセージが表示されました。

GASのセッターを使用時のログ

詳しく解説していきましょう。

プロパティidの初期化時

まず、19行目のインスタンス生成時でのidプロパティの代入についてです。

constructorメソッドが呼び出され5行目が実行されます。

このとき、プロパティidについてはset構文が存在していますので、そちらが呼ばれ、仮引数として代入しようとしている値「a01」が渡されます。

9行目のif文の条件式ですが、初期状態では「this.id」はundefinedですからfalseです。

ですから、そのあとの処理が実行され、新たなプロパティ「_id」に、「a01」が格納されます。

ここでプロパティ「_id」はセッター・ゲッター経由でのみアクセスが可能という意味で、アンダースコアがつけています。

プロパティidの取得

20行目で、プロパティidの取得を行っています。

このとき、プロパティidについてはget構文が用意されていますから、それが呼び出されて、「_id」の値がリターンされます。

つまり、「a01」が返されるので、それがログ表示されたわけです。

プロパティidの上書き時

その後、21行目でidプロパティを上書きしようとするとどうなるでしょうか。

再度、プロパティidについてのset構文が呼び出されます。

このとき、if文の「this.id」は1文字以上の文字列を持っており、true判定になります。

ですから、if文の処理が実行され、「idは上書きできません」のエラーがスローされるのです。

つまり、結果的にプロパティidは上書きが禁止されているという形になります。

まとめ

以上、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をコピーしました