Google Apps Scriptで䜿う情報はプロパティを利甚しよう【GAS】

プログラムを開発しおいるず、䞀時的な情報もしくは恒久的な情報を甚いお様々な凊理の分岐や、パラメヌタを甚いお凊理を続行するずいった凊理が出おきたす。䟋えば、ナヌザ毎に「認蚌を実行した結果埗た、Access Tokenを栌玍しおおく」であったり、ナヌザの氏名や個人情報、プログラムで䜿う固定的な倀斜蚭名リストなどを栌玍したスプレッドシヌトのIDなどなどなど。

これらの情報をスクリプト内に盎曞きだずセキュリティ的にたずかったり、たた倉曎が生じる堎合にスクリプトを曞き盎す必芁があったり。かずいっおスプレッドシヌトのセルに保存ずいうのはあたりにも雑。ずいうこずでよく䜿うのがプロパティサヌビス。地味な機胜なのですが、このプロパティを䜿う事で、プログラムのメンテナンス性やセキュリティ向䞊など様々な効甚をもたらしおくれたす。今回はこのプロパティサヌビスを芋おゆきたいず思いたす。

今回䜿甚するスプレッドシヌト

プロパティサヌビスに぀いお

抂芁

プロパティサヌビスずは、ファむルもしくはナヌザ単䜍などでプログラム内で利甚する「倀」などを栌玍しおおく保管堎所です。その倀も様々な倀を栌玍する事が可胜で、以䞋の特城がありたす。

  1. プロゞェクト内であればグロヌバルに読み曞きが可胜である。
  2. 倀は玠の文字列だけでなく、JSON圢匏でも保存する事が可胜である
  3. スクリプトプロパティずいう圢匏の堎合、スクリプト゚ディタから線集が可胜になっおいる。
  4. ナヌザプロパティなどはスクリプト゚ディタからの線集は出来るものの䜿えたせん。Issue Trackerにも残ったたた攟眮されおるバグのようです。たた他のナヌザからは芋えない。
  5. GASからナヌザプロパティを操䜜するこずは可胜。LocalStorageのような扱い。でも、ブラりザに保存されおるわけじゃない。
  6. キヌ名ず倀ずいうペアで保存されおいる
  7. プロゞェクトをたたいで利甚したい堎合はラむブラリ化する必芁がある。
  8. 数倀を保存するず、敎数であっおも䟋えば1.0ずいったように小数点が付く。けれど文字列ずしお保存される。
  9. 䜆し取埗時は文字列ずしお扱われるので、蚈算時はNumber()などで型倉換しおあげないずしくじる
  10. G Suite BasicやBusinessでは日に読み曞きできる䞊限は500,000回。
  11. G Suite BasicやBusinessでは、保存出来る文字のサむズは、1぀の倀に぀き9KBたで
  12. G Suite BasicやBusinessでは、そのプロゞェクト内に保存できるプロパティの合蚈倀䞊限は、500KBたで
  13. JSONは型厩れせずに保存できたすが、配列デヌタなどは型厩れしたりしたす。1プロパティに耇数倀盛り蟌みたい堎合には、JSONにしお栌玍したしょう。
  14. HTML偎でも䜿いたい堎合は、GAS偎で呌び出した倀をreturnするように関数を甚意する必芁がある。
  15. Null倀は保存できない。セットしおも消えおしたう。
  16. スクリプトから保存する堎合、該圓のキヌ名が存圚しない堎合自動的に䜜成されお保存される。
  17. 存圚しない倀を取埗しようずするず、nullが返っおくる
  18. 倉数ではないので、プログラムが終了しおも消えない。なので、6分の壁を超えるテクニックなどで䜿える。
  19. スクリプトトリガヌなどに斌いお、誰かがセットしたらフラグずしおスクリプトプロパティに保存し、二重蚭眮防止などのテクニックにも利甚できる。
  20. レコヌド登録時の連番を取る時に、uidずいうプロパティを甚意しお、1ず぀足しおいくずいう䜿い方はよくありたす。排他制埡は必須です。
  21. ファむルをコピヌするず、コピヌしたファむルには元のファむルにあったプロパティ倀はありたせん。空の状態です。

ずなっおいたす。VBAで蚀うずころのiniファむル読み曞きやレゞストリ読み曞き、.NETでいうずころのappconfigのようなものだず思えばOKだず思いたす。ただし容量に制限があるので泚意。特にナヌザプロパティは利甚しおるG Suiteのナヌザ数が倚いず堎合によっおは䞊限倀に到達しやすくなりたす。

プロパティサヌビスの皮類

プロパティサヌビスは3皮類のプロパティサヌビスで構成されおいたす。スクリプトプロパティ、ドキュメントプロパティ、ナヌザプロパティの぀です。

それぞれに特城があり

  1. スクリプトプロパティはそのプロゞェクト内から自由にアクセスでき、暩限があれば誰でも芋るこずが可胜
  2. ナヌザプロパティはそのナヌザだけが閲芧でき線集が可胜である。たたそのプロゞェクト内でだけ有効。
  3. ドキュメントプロパティはスクリプト゚ディタ䞊からは䞀切芋えない。䜆し、党員がアクセス可胜である。ドキュメント共通。䜆し、プロゞェクトを跚いで参照は出来ない。

普通は1.および2.を利甚する事になるかず思いたす。ドキュメントプロパティはアドオンなどの圢匏で䜿う堎合に䜿うもので、アドオンですから、いろいろなドキュメントを芋る時に、「そのドキュメントにバむンドされおるプロパティは○○」ずいった具合に䜿うシヌンで、通垞䜿いたせん。

ですので、スクリプトプロパティが党ナヌザ共通の蚭定項目、ナヌザプロパティがナヌザ単䜍の蚭定項目ず芚えお䜿い分けをするず良いでしょう。

スクリプトプロパティを線集

䞀番よく利甚するスクリプトプロパティだけは、党員がスクリプト゚ディタ䞊から線集する事が可胜ですナヌザプロパティは各個人だけ。ただ通垞はあたりスクリプト゚ディタ䞊から線集䜜業は行いたせん。スクリプトから読み曞きを行いたす。たた、スクリプトプロパティはその性質䞊スクリプト線集が出来る人間であれば、その内容を線集できおしたうので、センシティブな情報を栌玍する堎合たずえ、クラむアントIDやクラむアントシヌクレット、スプレッドシヌトの線集暩限はオヌナヌのみずし、プログラムHTML Serviceから䜿わせるの実行暩限もオヌナヌずするず隠蔜が可胜です。

  1. スクリプト゚ディタを開く
  2. ファむル⇒プロゞェクトのプロパティを開く
  3. スクリプトプロパティタブを開く
  4. 行を远加をクリック
  5. キヌ名ず倀を入れお保存するずストアされる。
  6. 削陀をクリックすれば削陀するこずが可胜

図こんな感じでtomatoずいうキヌに0ずいう倀を保存しおみた

䜿っおみる

スクリプトプロパティ

そのプロゞェクト共通で利甚する倀を栌玍したす。以䞋のような構文になりたす。党ナヌザが共通しお読み曞きが可胜です。

  • スクリプトプロパティなので、PropertiesService.getScriptPropertiesを利甚したす。
  • getProperty(キヌ名)で倀を取埗出来たす。
  • setProperty(キヌ名,倀)で倀をセットできたす。
  • サンプルコヌドでは、valueずいうキヌにui.promptの倀を栌玍しおいたす。

ナヌザプロパティ

そのプロゞェクト内に斌ける各ナヌザだけが読み曞きできるプロパティです。ナヌザ固有の他の誰にも閲芧䞍可なデヌタ類を栌玍する時に利甚したす。

  • ナヌザプロパティなので、PropertiesService.getUserPropertiesを䜿甚したす。
  • getずsetはスクリプトプロパティず党く同じです。
  • 以前のナヌザプロパティは、各プロゞェクト単䜍ではなく党プロゞェクト共通でしたが、珟圚は他のプロゞェクトから他のプロゞェクトのナヌザプロパティは盎接参照できたせん。
  • ただし、GASでナヌザプロパティをセットするず、プロゞェクトのプロパティ䞊で手動でセットした時ず違い、芋えたせん・・・ここ嵌たるポむントです。ですが、確実にセットされおいるので、必芁に応じお次項のプロパティを削陀するを装備すべきでしょう。

プロパティを削陀する

プロパティの削陀は非垞に単玔です。以䞋のメ゜ッドで削陀するだけです。

トリッキヌなテクニック

ラむブラリ化しお耇数プロゞェクト内で同䞀プロパティを共有

ワヌクフロヌな仕組みを䜜る時に、䟋えば読み曞きするスプレッドシヌトのIDなどや送信先メアドなどをプロパティサヌビスを䜿っお保存し、プログラムで利甚するこずがありたす。しかし、申請甚フォヌムず承認甚フォヌムで共甚の぀で共甚したくずも、スクリプトプロパティはそのプロゞェクト内しか参照できたせん。

そこでラむブラリ機胜を䜿っお1箇所で読み曞き出来るようにしお䜿っおたりしたす。この堎合そのスプレッドシヌトには申請甚、承認甚に加えおスクリプトプロパティ甚の3぀目のプロゞェクトを远加しおおく必芁がありたす。この3぀目がラむブラリずなりたす。

呌び出し偎は、ラむブラリ登録し識別子を加えlibraryず名付けたずする、䟋えばlibrary.getPropでプロパティを取埗したす。library.setPropでプロパティを保存したす。呌び出し偎でPropertiesServiceをいちいち蚘述する必芁もないので楜ちんです。共通蚭定甚のプロゞェクトずしおこれを版保存し呌び出し偎のラむブラリに远加しおあげたしょう。

この手法を䜿うず、1぀のプロゞェクトを甚意しおラむブラリ化。ナヌザプロパティの読み曞きを実装しおおけば、1箇所で党プロゞェクト共通で䜿えるナヌザ蚭定を実珟できたす。䜆し、この堎合党プロゞェクト共通なので、API_KEYなんお蚭定にしおしたうず、他のAPI_KEYずごっちゃになったり、区別が぀かなくなったりするので、キヌ名の付け方に泚意が必芁です。

倧きなサむズの蚭定倀を栌玍したい

倧芏暡な組織で1個のファむルにスクリプトプロパティでいろいろ栌玍したり、ナヌザプロパティずは蚀え結構な量のデヌタを芏定の情報ずしおキヌプしおおきたい堎合、1キヌの䞊限9KBや合蚈倀の500KBに到達しお、プロパティサヌビスでは保存しきれないケヌスがあるず思いたす。この堎合、圓然情報を保存できないので、以䞋の策を取る必芁がありたす。

  1. 別途キヌ情報栌玍甚のスプレッドシヌトを甚意し保存する
  2. Google DriveにJSONファむルずしおプロパティデヌタは保存し、ナヌザプロパティにはそのファむルのIDだけを保存しおおく。

前者の堎合、そのファむルのアクセス暩限は党員が芋られる状態にしなければならないので、ナヌザプロパティ保存をするには適しおいたせん。たた、党ナヌザの各個人の情報を栌玍するため、色々ずロゞックが必芁になりたす。

䞀方埌者の堎合、そのナヌザのドラむブにそのナヌザだけがアクセスできる暩限で取っおおけば良いだけなので、倧容量のナヌザプロパティ情報を保存するのに適しおいたす。たたJSONなので構造化されおいおアクセスしやすいずいう利点もありたす。埌者のケヌスを研究しおみたした。

  • 今回は日付デヌタを栌玍するようにしおみたした。userずいうキヌに日付デヌタを入れおありたす。setpropJsonを実行する床に日付デヌタが曞き換わりたす。
  • setpropJsonではファむルがない堎合には、JSONファむルを生成し、ナヌザプロパティにはそのFileのIDが栌玍されたす。
  • getpropJsonは、キヌがある堎合にはJSONファむルをパヌスしおuserキヌの日付情報を返したす。無い堎合ぱラヌを返したす。
  • このファむルは実行ナヌザだけが芋られる暩限にしおおきたしょう。他人ず共甚しおはなりたせん。
  • 新芏䜜成されるファむルはただのテキストファむルで、ScriptIDずナヌザメアドを組み合わせたファむル名になっおいたす。
  • ファむルはGoogle Driveのルヌト盎䞋に生成されたす。
  • この手法の堎合、ファむルサむズの䞊限はDriveAppの扱える䞊限である50MBたで察応可胜になりたす。

図JSONなので倉なロゞックも䞍芁

りェブアプリから利甚する堎合

盎接スプレッドシヌト䞊からスクリプトプロパティの操䜜をする堎合は、必ずナヌザ暩限で実行されたす。よっお、getUserPropertiesを䜿った堎合ナヌザ毎のプロパティに察しお読み曞きが行われたす。

しかし、りェブアプリケヌションから実行する堎合は、りェブアプリケヌションをデプロむした際に指定した「次のナヌザずしお実行」のナヌザ暩限にお動䜜するこずになるため、りェブアプリケヌションにアクセスしおるナヌザの堎合は期埅通りに動䜜したすが、りェブアプリ䜜成者の暩限で動䜜する堎合、䜜成者のプロパティからの読み曞きずなるため、実質getScriptPropertiesず倉わらない動䜜になっおしたいたす。

しかし、りェブアプリは䜜成者暩限で動かしたい、けれど挙動はナヌザ毎に倉えたい堎合はプロパティを利甚するのではなく、Webアプリ偎でLocalStorageを䜿っお実装する必芁があるでしょうこの堎合、PC毎にデヌタが保存されるため、Chromeを利甚する堎合はプロファむルず共にLocalStorage Syncなどの拡匵機胜を䜿うず他のPCからのLocalStorageが別のPCぞ同期出来お流甚可胜です。

以䞋は怜蚌で䜿ったコヌドです。

GAS偎コヌド

HTML偎コヌド

関連リンク

コメントを残す

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です

このサむトはスパムを䜎枛するために Akismet を䜿っおいたす。コメントデヌタの凊理方法の詳现はこちらをご芧ください。