AppSheetからGASの関数を呼び出す

AppSheet を本格的に業務で使おうとする際、既存システムやデータとの連携にGAS(Google Apps Script)を利用したいと思われる方は多いでしょう。

もちろん、単にスプレッドシートのデータを読み書きするのであれば、AppSheet のデータソースとしてスプレッドシートを使えばよいのですが、そうではなくて、「従来から利用しているテスト済みのGAS関数を利用したい」とか「スプレッドシートだと無秩序になり管理が難しい」など様々な理由で、「公認されたAPIとしてのGAS関数」を叩きたくなりますよね*1

そのような時のために、AppSheet には Apigee 経由でGAS関数を呼び出す方法があります。ちょっとマニアックなのですが、今回はその手順をサンプルコードも使いながら説明します。

※ AppSheet と Apigee の連携環境に関しては前回記事を参考に構築してください(無償の評価ライセンスが使えます)。今回の記事は、Apigee EdgeでAPI Proxyを構築できる基礎的な知識を前提としています。

happyman.hatenablog.jp

 1.GAS関数を「実行可能API」として作成する

まずは呼び出したいGAS関数を作成します(サンプルはこちら)。よく使われる「Webアプリ」ではなく、「実行可能API」としてデプロイする必要があります。

設定は、

Create a Target Project to Execute with the Apps Script API

あたりを参考にすると良いでしょう。GASプロジェクトを、自分で明示的に作成したGCPプロジェクトと結び付ける必要があることに注意です。ちなみに、以下のページのStep1にある「Enable the Google Apps Script APIボタンを押すと、GCPプロジェクトの作成からAPIの有効化、この後の手順に必要となるクレデンシャル(credentials.json)の作成までできてしまうのでお勧めです。

Node.js Quickstart  |  Apps Script API  |  Google Developers

また、今回のサンプルでは Google Driveと連携する(DriveAppを使う)ので、明示的に対象となるGCPプロジェクトのDrive APIをOnにしておく必要があります。

2.Node.jsでGAS関数を呼び出すREST API一式を作成する

Node.js Quickstart  |  Apps Script API  |  Google Developers

こちらのページも参考に、Node.js でGAS関数を呼び出すAPIを作成します。(サンプルはこちら

前回記事にも書いたのですが、AppSheet から接続できるApigee APIには決まり事があります。サンプルを参考に、RESTの各メソッドにGAS関数をマッピングしてください。

もちろん、この段階ではApigee がなくても動作するので、ローカル環境でテストしましょう。動作確認のやり方は、サンプルリポジトリのREADMEを参考にしてみてください。

3.ApigeeにREST APIをデプロイする

ここまでできたら、いよいよ Apigee に取り掛かります。Apigee(Apigee Edge)には、apigeetool というコマンドラインツールが用意されていて、これを使うことで、ローカルでテスト済みのNodeアプリをApigee (Apigeeが提供するNode.js環境はHosted Targetsと呼ばれます)にアップロード&デプロイできます。インストールや利用方法は以下チュートリアルやリファレンスを参考にしてください。

Hosted Targets tutorials  |  Apigee Docs

apigeetool - npm

成功すると、Node.jsで作成したAPIが Hosted Targets にデプロイされ、API Proxyとして利用できるようになります。Apigee の設定画面で見ると、index.js などのファイルがResoucesとして確認できるかと思います。

f:id:HappymanOkajima:20210306145713p:plain

API ProxyとしてデプロイされたNodeアプリ

 

4.AppSheetから呼び出す

この時点で、APIとして呼び出すことができます。ブラウザやPostmanなどを使って、API Proxyのエンドポイントを呼び出してみます。

f:id:HappymanOkajima:20210306150654p:plain

API Proxy経由でGAS関数を呼び出した結果

フォルダの一覧が出力されていますね。ただ、APIの全機能をAppSheetから利用するために、もうひと手間必要です。前回記事でも解説した通り、AppSheet から Apigee API Proxyを呼び出すには、①APIの仕様を記述したOpen API Spec、②AppSheetから指定するAPIキー、両方を準備する必要があります*2

やってみよう!という方は、こちらのOpen API Specサンプル中の「server」部分を適宜変更してお使いください。ApigeeからのAPIキーの発行方法は前回記事で解説していますので、参考にしてください。

これでやっと、AppSheetから接続することができます*3APIキーの値と、SpecのURL(AppSheetからアクセスできるURLとして公開してください。GitHubでもOK)を入力しデータソースを作成します。

f:id:HappymanOkajima:20210214184125p:plain

AppSheetのApigeeデータソース設定(OpenAPI Spec)

成功すると、「folders」があたかもテーブルのように扱われ、次のような状態でAppSheetアプリが作成されます。

f:id:HappymanOkajima:20210306153236p:plain

AppSheetからデータソースとして接続されたAPI

一覧を出すためには「GET /folders」が、データの追加のためには「POST /folders」が、データの更新と削除にはそれぞれ、「PUT /folders/folderId」「DELETE /folders/folderId」の各REST APIが呼び出され、それはApigeeにデプロイされたNode.jsで書かれたAPI Proxy経由でGAS関数を実行することにより実現されているんですね。うまいことできてる。

でも、、

「えっ、コード書かなくちゃいけないの?」 

って思われたかたも多いかもですね。これには現時点では「はい」とお答えすることになりそうです。細かい話なのですが、GASの実行可能APIには、GCPのサービスアカウントでは接続できない仕様(制限)があるのですが、一方、Apigee Edge のAPI ProxyからGCPに接続するための拡張ポリシー(Google Authentication Extention)は、サービスアカウントの利用が前提になっているからです。もしかすると他に方法があるのかもしれませんが、私は見つけられませんでした。

なので、(2021年3月時点で)フルアクセスのGAS関数をAppSheetから利用するには、Apigee と、GCPやNode.jsでの開発スキル・知識が必要となります。

ただ、Google のロードマップでは、近々AppSheetから Google Apps Script を利用できるコネクタがリリースされるとのことです。詳細は不明なのですが、もっと手軽に(Apigeeを利用しなくても)GASの関数を利用できることも期待できるので、楽しみに待ちましょう。

 

 

 

 

*1:

AppSheet には「データが更新された」などのイベントに反応して Webhook を呼び出す機能があるため、GASでWebアプリとして作成された関数(doGetやdoPost)を実行することは可能です。ただし、Webhook 経由でGAS関数を実行できたとしても戻り値を取得することはできないため、基幹システムの最新の在庫情報を取得する、などのユースケースを実現することは困難です。AppSheet はCloud SQLと接続できるので昔ながらのDBを経由したデータのやり取りもできますが…。あと、GASからAppSheetにAPIアクセスし値を書き戻す方法もあります

*2:Open API Specを利用しないManualモードで接続することもできますが、その場合はデータの取得しかできません

*3:ただし今回のサンプルではAPIキーの検証を割愛していることに注意ください。実用する際にはApigeeの「Verify API Key」ポリシーや、Node.js 中のコードとして検証を実装する必要があります。検証はポリシーで実現し、APIチェーンという仕組みを利用してNode実装APIを呼び出す手もあります。