設定値を保持しておきたい

VBAやVB6までは、iniファイルなどで設定値を保存してたりしたと思います。また、.NETなどではAppConfigなどに保存して、ユーザの設定値に基づき、プログラム側で処理を分岐させたり、値を使って表示をしたりなど、この手の設定ファイルはプログラム作成上では欠かせない存在になっています。Google Apps Scriptでも、この設定値を保存する仕組みが用意されています。この設定値を利用すれば手順を省略する為に使えますし(毎回、フォルダを選択する必要性をなくしたり、ユーザ毎に挙動を替えたり、逆に固定させたり、便利な機能です(それそのものはとても地味ですが)。

ただし、スプレッドシートなどの場合には、別途設定値を保存するようなシートを用意して、そこに値を格納するようなケースもあるかと思います。この場合、設定値はユーザに晒されるので、場合によっては誤って消去されるリスクもあります。一方で、確認もし易いというメリットもあります。必要に応じてとなります。(ドキュメントやFormの場合にはこの手法は使えませんが、他のスプレッドシートを参照するような形であれば、iniファイルの参照のように値の読み書きができます)。

概要

実は、現時点では2種類のメソッドでこれが利用できるようになっていますが、もう一方のメソッドは廃止が決まっています。よって、ここでは旧メソッドは割愛し、現在用意されている新メソッドについて説明します。新メソッドはちょっと旧メソッドより扱い方にクセがあるのですが、決まり事なので、慣れてしまいましょう。使用するのは、PropertiesServiceと呼ばれるサービスで3タイプの値の保存をすることが可能です。これらの値はドキュメントに格納されますが、格納されている値は、スクリプトエディタで開いたプロジェクトのプロパティを開くと確認することが出来ます。

図:プロジェクトのプロパティ画面。様々な値が格納されています。

用意されているプロパティのタイプは以下の3つ

  1. ドキュメントプロパティ - 公開ドキュメントになっている必要性があるが、他のドキュメントに設定済みのプロパティを流用できるもの。
  2. スクリプトプロパティ - そのドキュメント内でだけ使用可能な、ドキュメント単体に設定された設定値。
  3. ユーザプロパティ - そのユーザだけがアクセス可能な設定値であり、他人からは参照ができない。

殆どの場合、2.を使用します。ここでも、2.について説明します。

また、iniファイルやAppConfigと同じく、プロパティ自体が存在しなくても、プロパティ名を付けて設定値を保存すると自動的にプロパティそのものが作成されるので、特にエラー処理等について考慮する必要性はありません。もちろん、読取りの時にそのプロパティそのものがない場合には、Null値が帰ってくるだけです。

プロパティの設定と読取り・削除

設定値を保存する

var Properties = PropertiesService.getScriptProperties();
Properties.setProperty("プロパティの名前", "設定する値");

1行目は必ず宣言する決まり事です。これを宣言しないと使用することが出来ません。

そしてその宣言で使用した変数につなげる形で、setPropertyメソッドを用いて値を保存します。プロパティの名前は自分で用意したプロパティの名前。設定する値はそのものずばり値を入れます。通常はここには変数に格納したものをそのまま変数を指定して用いるのが通常でしょう。

設定値を読み取る

var Properties = PropertiesService.getScriptProperties();
Properties.getProperty("プロパティの名前");

読み取る場合には、getPropertyメソッドに続けて、目的の値が格納されているプロパティの名前を指定するだけです。通常は、別の変数を用意して、そこに取得した設定値を格納して使うのが通常でしょう。

プロパティの削除

プロパティを削除するメソッドは2つ。全削除するメソッドと、個別に削除するメソッドの2つです。

// 全削除の場合
 var userProperties = PropertiesService.getScriptProperties();
 userProperties.deleteAllProperties();
// 個別に削除する場合
 var userProperties = PropertiesService.getScriptProperties();
 userProperties.deleteProperty("プロパティの名前");

プロパティの類というのは、残しておいても大して問題にもならないので、削除するというのはケースとしてあまりないかと思います。実際自分も使ったことがありません。

変わった値の設定法

これらプロパティは、いっぺんにまとめて設定をしたり、特定のプロパティを設定したら他を削除するといった設定方法も用意されています。正直、使ったことがありません。

まとめていっぺんにプロパティを設定

// いっぺんにまとめてプロパティを設定
 var Properties = PropertiesService.getScriptProperties();

var newProperties = {プロパティ名1: '設定値1', プロパティ名2: '設定値2', プロパティ名3: '設定値3'};

 Properties.setProperties(newProperties);

設定画面を用意して、いっぺんにプロパティを書き換える時に使用します。

変数を用意して、その変数に{ }で括った設定値達を格納します。それぞれは{ }内に、プロパティの名前:の形式で書き込み、値を設定、カンマで区切って次のプロパティ名と続けます。いくらでもいっぺんに設定できますが、この手のメソッドを使う場合には、別にこれらの値を入れる為のダイアログなどを用意するのが通常でしょう。

プロパティを設定したら他のプロパティを削除する

// プロパティを設定すると同時にその他のプロパティは削除
 var Properties = PropertiesService.getScriptProperties();
 var newProperties = {プロパティ名1:'設定値1', プロパティ名2: '設定値2', プロパティ名3: '設定値3'};
 userProperties.setProperties(newProperties, true);

殆どまとめていっぺんにプロパティを設定するコードと同じですが、setPropertiesの引数オプションにtrueを付け加えるとこれらで設定したもの以外にプロパティがあった場合、それらは削除されます。

関連リンク