アップススクリプトでウェブアプリからサーバ関数を実行する

アップススクリプトでウェブアプリからサーバ関数を実行する

アップススクリプトで作成したウェブアプリの実行画面から、アップススクリプトの関数を起動するためにはgoogle.script.runを使用します。

サーバ関数を使うウェブアプリのサンプルコード

ウェブアプリからアップススクリプトの関数を使用するためにはgoogle.script.run.の後に関数名を書きます。

ただし、関数は非同期で実行されるため、関数実行後に行いたい処理がある場合にはwithSuccessHandlerを使用して、続く処理を指定します。

また関数で実行エラーが発生した場合の処理はwithFailureHandlerを使用して指定します。

gsファイル

function doGet(e) {
  var html = HtmlService.createTemplateFromFile("html").evaluate();
  return html.setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function serverFunc(obj) {
  obj.result = "success";
  return obj;
}

doGetはウェブアプリを起動するスクリプトです。テンプレートを経由してHtmlOutputを作成していますが、特にパラメータなどは使用していません。

HtmlOutputを返す時に、setSandboxModeを使用しています。これはウェブアプリからアップススクリプトを実行するための設定です。引数は常にHtmlService.SandboxMode.IFRAMEで問題ありません。

SandboxModeについて詳しくはAPIリファレンスのSandboxModeを参照してください。

serverFuncはウェブアプリから呼び出される関数です。引数のオブジェクトにresult="success"を追加して返します。

HTMLファイル

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function clickButton() {
        var obj = {};
        google.script.run.withSuccessHandler(success).withFailureHandler(fail).serverFunc(obj);
      }
      function success(obj) {
        document.getElementById("disp").innerHTML = obj.result;
      }
      function fail() {
        document.getElementById("disp").innerHTML = "Server Error";
      }
    </script>
  </head>
  <body>
    <button onclick="clickButton()">ボタン</button>
    <div id="disp"></div>
  </body>
</html>

bodyにはボタンと結果を表示するための領域(div id="disp")だけがあります。

ボタンをクリックした時に実行される関数はhead内のclickButtonです。clickButtonで空のオブジェクトを作成して、serverFuncを実行します。

serverFuncでエラーがなければ、serverFuncの返り値を引数としたsuccessが実行されます。successでは引数のオブジェクトのresultを表示します。

serverFuncでエラーが発生すればfailが実行され、Server Errorを表示します。

google.script.runの実行結果

ウェブアプリのボタンをクリックした結果

ボタンクリック前(左)とボタンクリック後(右)の実行結果です。ボタンをクリックすることで、サーバー側のアップススクリプト関数を実行できたことが分かります。

これでユーザーインターフェースを表示して、インターフェースの操作に応じてスプレッドシートやカレンダー、Gメールを利用するウェブアプリを簡単に作成できます。

ただし、サーバ関数は実行速度が少し遅めなので、時間を気にするならできる限りjavascriptに処理をさせた方が有利です。

今回のサンプルの実行URLです。successが表示されるだけですが実行できます。

お読みくださり、ありがとうございました。