
#22 変数の有効期限(値は、いつまで保持される?)
下のような GAS のプログラムを作成してみました。今回はプログラムの動作が目的ではなく、プログラム中で変数にいつまで保持されるのかを確認するためのものです。
確認のためのプログラム(1)
このプログラムを実行すると、以下のような結果になります。
このプログラムは、カーソルのあるセルの内容を数字として解釈して、その内容を、関数が実行されるたびに保存されている変数の内容を加算することを想定したものです。
しかしながら、この関数を何度実行しても結果は変わりません。

この実行結果から、関数外に宣言された変数であっても、実行されるたびに変数が初期化されていることがわかります。
このプログラムが実行されたとき、getCurrentCell( ) が指し示すセルには、1 が入力されています。
9 ~ 12行目で、変数 value の内容が undefined だった場合には、初期化されていないので 0 に初期化しています。
すなわち、GAS のプログラムの実行結果を変数に格納しておいただけでは、次の実行時にはすべて初期化されてしますのです。保持しておきたいのであれば、スプレッドシートなど、どこかに書き出しておかなければなりません。
解決策としてプロパティサービス
このようなときに、便利な方法がないかを調べたところ、プロパティサービス(Class PropertiesService)が便利に使えそうです。
プロパティサービスの API としては、以下のように 3種類が用意されていますが、「Class ScriptProperties」「Class UserProperties」については、非推奨と案内されています。

Deprecated. This class is deprecated and should not be used in new scripts.
getDocumentProperties()
getScriptProperties() ※非推奨
getUserProperties() ※非推奨
今回は、getDocumentProperties() でプロパティサービスを利用したプログラムを作ってみました。
確認のためのプログラム(2)
上記の「その2」と「その1」の違いは、次の 2点です。
8行目に、プロパティサービスから取得した内容を数値化して、変数 value に格納しています。
21行目に、関数の処理が終わった時点の変数 value の内容を、プロパティサービスに格納しています。
「その1」で確認したように、実行されるたびに変数 value の内容が初期化されますが、上記のようにプロパティサービスから取得・保存することで、前回の実行結果から処理を継続させられます。



まとめ
setProperty(key, value) の説明を見るとわかるように、プロパティサービスに保存できるのは文字列(String)となっています。どのように利用するかはアイディア次第ですが、文字列で表現できるものであれば、プロパティサービスに保存しておいて、次回以降の実行時に再利用できます。