GoogleAppsで、ウェブアプリケーション構築

佐野

佐野 2013年11月13日

20131113140752

GoogleAppsスクリプトには、
「ウェブアプリケーション」というものを作る機能も備えています。
簡単に言うと、専用のページを作成し、そこにアクセスすることで、
スクリプトで様々な処理を行い、スプレッドシートに入力または、
そこからデータを出力して内容を表示するといった処理を行う事も可能です。

まずは、ウェブアプリケーションのページとなるHTMLと、
それを出力するためのスクリプトを作成します。

20131113140230-2

「ファイル」→「版を管理」で、スナップショットを作成

20131113140317

「公開」→「ウェブアプリケーションとして導入」またはツールバーの雲マークから、
先ほど取得したスナップショットを、ウェブアプリケーションにします。

20131113140337

この方法で、基本的なウェブアプリケーションを作成でき、
後は、HTML表示を行うまでに様々な処理をからませる事により、
アクセスするだけで動作可能なアプリケーションが完成します。

これの難点は、いつもスプレッドシートを操作する際に使われると思われる
「getActiveSpreadsheet()」等は使用できません。
「アクティブスプレッドシート」というのは、
そのスクリプトに関連付いているスプレッドシートの事で、
スナップショット化されたスクリプトには、
その関連付けが存在しないのでしょう。

これは「openById()」などでスプレッドシートファイルを
指定すれば済む話なので、まだ簡単なのですが、
スクリプトを更新したら、それと同時にスナップショットを取り、
ウェブアプリケーションとしての公開も行う必要があります。
動作テストを行うたびに、それを行う事になる点が、
少し、めんどくさい点でもあります。

そして、アプリケーションのページが表示されるまでも、
やや時間を要するという点。
これは、その間の処理の量も、関わっているとは思いますが。

ですが、これをうまく利用すれば、従来ならスプレッドシート等にアクセスし、
特定の操作を行わなければ動かないスクリプトも、
たった1ページのアクセスのみで操作が可能となります。

そして、スプレッドシートの処理の際には、
通常ならば、シートの全範囲を取得し、取得した二次配列を変更し、
それをまた、そのまま戻すという過程を取ると思われます。

自分も、それを行うまでは1セルずつ
読み込み・書き込みを何度も行う処理を行っていましたが、
それだと、読み書きのたびにシートにアクセスをするという処理を
何度も繰り返す事になるため、結果として処理が大幅に遅くなる原因にもなります。
それを回避するために、全範囲を二次配列として受け取り、
中身をすべて処理してから戻すという過程を取っています。

ですが、ウェブアプリケーションを作成し、
数人がほぼ同時に起動するような処理の場合、
全範囲を処理するというやり方が、かえって問題になる場合もあります。

というのも、最終的なシートの形が、
最後にアクセスした人の処理のものに、なってしまうからです。
つまり、最初の人がアクセスをし、シートの全情報を取得、
書き込みが終わる前に、次の人がアクセス、
その直後に最初の人が書き込み、次の人が書き込みと行うと、
最初の人が書き込んだはずの情報が、
反映されていないシート情報で、上書きされてしまうからです。

どんなコンピューターであろうとも、処理は必ずしも一瞬で終わるものではなく、
あくまでも人間の感覚を越えているだけであり、
どんな処理にも、多少なりとも時間は生じるものです。

このような場合は、処理に必要な情報は、シート全体を取得し、
書き込む際には、1セルずつか、その人以外の人が書き込まないであろう
行か列の範囲のみを指定して、書き込みを行えばいいのです。

行・列単位で書き込むにも、当然ながら二次配列なのですが、
二次配列も、形式が合わないとエラーが起こる可能性もあるので、
その二次配列を取得するだけに、シート範囲を取得するというのも、
微妙ながらに処理は食うものの、確実な手段ではあります。

ウェブアプリケーションを作る際には、スナップショット化のめんどくささと、
処理のタイミングを考える点との戦いでもあるでしょう。
これをもし、使いこなすことが出来れば、
GoogleAppsの域を超えたものも作れるようになるかもしれません。