AppSheetからGoogle Apps Scriptを叩く方法【GAS】

AppSheetは「ノーコードツール」なわけですが、どうしてもそうなると出来る範囲が限られてしまいます。一方でGASは出来る範囲は広いものの「GUIの構築」はHTMLとCSSでゴリゴリ書く必要があります。GUIをAppSheet側で、バックエンドをGASでといった使い方が出来るとニコイチで良いアプリケーションが作れそうです。

そこで今回はこの2つの組み合わせでアプリを構築できるか?挑戦してみることにしました。

今回利用するサービス

今回の取組では3つの仕組みが必要です。AppSheetのアプリとその土台で利用するSpreadsheet、GASが記述されたスタンドアローンなファイル。AppSheetから呼び出せるGASの関数は、スタンドアローンのGASファイルしか指定できない為です(Spreadsheetに記述したものはコンテナバインドなので指定が出来ない)。

事前準備

スプレッドシートの構造

今回のサンプルアプリはdataシートにデータを追加したら、その内容を特定のGoogle Chatにメールで投稿するという仕組みにしています。ただし、スプレッドシート側にはGoogle Apps Scriptでは実装しません(前述の通りスタンドアローンである必要がある為)。

4列だけのシートを元にメニューからA拡張機能 => AppSheet => アプリを作成で作成をします。この時のスプレッドシートのファイルのIDがGASで必要になるので控えておきます。

図:スプシからアプリを直接作成可能

スタンドアローンのGASを用意

今回のアプリの仕様としては

  • 複数名で利用することが前提
  • 各レコードには連番を振る必要がある
  • 連番を元にレコードを特定してGoogle Chatへメールで送信

という形です。しかし、問題は現時点でAppSheetがAccessやMySQLのようにオートナンバー的に自動的に連番を振る機能がありません。一人で利用する前提ならば、「MAX関数 + 1でナンバーを生成」も出来ますが、複数名でアクセスしてる場合これだと不具合が出ます(別の人が先に書いてしまったりするとナンバーが重複する可能性がある)。AppSheetのヘルプにも出来ない旨の記載があります。よって、この部分はUNIQUEID関数を使うことにします。

そこで今回GAS側は引数として与えられたこのUNIQUEIDを元にスプシを探索し、レコードを特定し、Google Chatへ送信を担当しようと思います。

尚、スタンドアローンのGASのファイルを作成する手順は以下の通りです(URLにcopyをつけても複製は出来ません)

  1. Google Driveを開いて、左上の新規をクリック
  2. その他 => Google Apps Scriptをクリック
  3. スクリプトエディタが直接開いてドライブにはスタンドアローンファイルが生成される

昔はChrome Webstoreから拡張機能インストールする必要がありましたが、現在は標準装備されてるようです。

図:新規から作成することが出来る

Google Chat側の準備

レコードが投稿されたことを通知するためのGoogle Chatのスペースとメールで送信する為の設定を施します。2024年5月22日よりGoogle Chatにメールで投稿する機能が装備されたので早速利用したいと思います。

  1. Google Chatのトップを開く
  2. 既存のスペースを開き、上部にあるスペース名の横にある「∨」をクリックする
  3. スペースの設定を開く
  4. メールを開く
  5. メールを生成をクリックする
  6. しばらくするとメアドが生成されるのでコピーする(GASで利用します)

ちなみにこのメアド、実体は特殊なGoogleグループでしてオーナーとスペースが参加してるという不思議な構造をしています。

図:スペースのメアドを生成する

図:実体はグループアドレス

アプリを構築する

GAS側の実装

スタンドアローンスクリプトに対して関数を一個用意します(今回はsendNotifChatとでも命名します)。先にGAS側を準備しておかないと、AppSheet側でスクリプト指定時に関数名が出てこないことになるので、はじめにGASの処理を実装します。今回はAppSheet側でのレコードのIDを引数に取って、スプレッドシートを探索し、Chatのスペースにメールで投稿します。

  • 探索先のスプレッドシートのIDおよびスペースに設定したメアドを記述しておきます。
  • スプシのデータを取得する前に一旦flushしておきます(時々書き込みが反映する前にGASが走ってしまう為)
  • 引数のUUIDと一致するレコードを特定しレコードを取得
  • そのレコードの内容をもってして本文を構築し、Chatのメアドに対してMailAppでメール送信

必ず一度は手動で関数を実行し、権限の承認を済ませておく必要があります。

AppSheet側の実装

ID列を装備する

スプレッドシートから作成したAppSheetのアプリ作成画面を開いて、まずはID列を改造します。ここにはUNIQUEID関数で自動生成された値が入ります。

  1. 左サイドバーのDataをクリック
  2. 同じくID列に於いて、Initial Valueをクリックして、「UNIQUEID("UUID")」を入力する
  3. 右のほうにスクロールして、Showのチェックはオフにしておく(編集出来ないようにする)
  4. 右上のSAVEをクリックする

これで事実上のオートナンバーを作成することが出来ました。

図:ID列の設定を変更しておく

GAS連携を装備する

今回のテーマの一番の肝になるのが「レコード追加時にGASを発火させる」部分を構築するのがこのステージになります。GASに対しては引数で前述で指定したUUIDの値を渡して発動させます。

  1. AppSheetのアプリのトップ画面より、左サイドバーのAutomationをクリックする
  2. Create my first automationをクリックする
  3. 左下のCreate a new botをクリックする
  4. Configure Eventをクリックする
  5. Create a custom eventをクリックする
  6. 右サイドバーがSettingsの状態になってるので、Data change typeをAddsのみチェックを入れる
  7. 画面真ん中の「Add a step」をクリックして次のステップを追加する
  8. Create a custom stepをクリックする
  9. 作成されたステップをクリックすると右サイドバーが開かれる
  10. 右サイドバーよりCall a scriptをクリックする
  11. Apps Script ProjectのClick to Selectをクリックする
  12. 前述で作成したスタンドアローンのスクリプトを指定する
  13. Function Nameにて作成しておいた「sendNotifChat」を選択する
  14. Function Parametersにて引数recに何をいれるか?を指定します。IDの行のinsertをクリックします。
  15. 今回はReturn Valueについてはとくに設定しないのでスルーする
  16. 右上のSAVEをクリックして保存する

これで、レコードが追加されるとIDの値をGASに渡して実行させることが可能になります。

図:イベントの設定

図:GASプロジェクトの設定画面

図:ID列を引数としてinsertする

デプロイする

これでとりあえずアプリは閑静なのでデプロイをします。以下の手順でデプロイしましょう。

  1. アプリ作成画面の左一番上のボタン(Not Deploy)をクリックする
  2. Deployment Checkをクリックして、Move app to deployed stateをクリックします。
  3. これでアプリが使えるようになりました。

図:デプロイしたら完成

実際に動かしてみる

デプロイしたURLでも良いですし、開発画面のViewからでも実行してテストすることが可能です。できればデプロイする前にViewの画面からテスト動作をしてみて、無事にGAS連動できることを確認してからデプロイすると良いでしょう。

無事に動けば、GASが色々バックグラウンドで処理をしてくれてChatにメールで投稿されるハズです。

AppSheetで無理くり装備しようとしたり実装法を調べるよりもバックグラウンドの処理については素直にGASに任せることで、作業分担にもなる上にGASでUIを構築するよりかはずっと楽なのは事実なので、選択肢の一つとして覚えておいて損はないと思います。

図:アプリの画面

図:Chat欄に無事に投稿されました

フォーム上のボタンを押して実行できないの?

標準のGAS連携の仕組み

AppSheet標準のGAS連携機能はあくまでも「レコードの追加、更新、削除」のイベントに対してだけ発火する仕組みです。よって、ボタンをクリックして直接GASを叩くみたいな真似は現時点では出来ません。それ故に、既存のレコードを開いて例えば請求書を発行するであったり、インスタントに通知を送りたいといった事が出来ません。

逆を言えば「更新」を掛ければ動くということ。バッドノウハウではありますが、このレコードの更新を意図的にできれば発火させることが出来る。ということで、特定の列を用意し、値としてランダムな値を書き込み、書き込み前と後を比較して変わっていればGASを叩くみたいな仕組みで、ボタンをクリックすると発火するGASを作ってみたいと思います。

※注意点としてボタン1個に1列が必要になるため、複数設置したい場合はその個数分列を用意してAutomation判定を用意する必要があります。列を共用してしまうと、別のボタンの発火も同時に引き起こしてしまいます。

トリガー発火用の列を用意する

以下の手順でトリガー判定用の列を1つ追加して設定を施します。そして、開発画面にてRegenerate Schemeをクリックすると、開発画面にTrigger列が現れるようになります。

フォームに表示されても困るのでこの列のShowはチェックをオフにしておきます。

図:値書き込み用の列を追加する

アクションボタンを一個追加する

GAS発火させるためのアクションボタンをフォームに追加します。

  1. 左サイドバーからActionsをクリックする
  2. Actionの横にあるAdd Actionの+ボタンをクリックする
  3. Create a new actionをクリックする
  4. Action Nameは適当に入力する
  5. For a record of this tableは更新を掛けるテーブルを指定。今回は1個しかないのでスルー
  6. Do Thisは、「Data: set the value of some column in this row」を選択する
  7. Set these columnsでは、列はTriggerを指定してとなりの箱をクリックしたら関数として「UNIQUEID("UUID")」でも入れておく
  8. 右上のSAVEをクリックする

図:UUIDで意図的に値をセットさせる

GAS実行のAutomationを作る

新しいBotを作って、自動化を構築します。この時通常の更新作業でも発火してもらっても困るので、判定を加えます。GASや仕組みは前述のChat送信のものをそのまま流用しています。

  1. 左サイドバーのAutomationをクリックする
  2. Botsの横のCreate a new Botの+ボタンをクリックする
  3. Create a new botをクリックする
  4. Configure Eventをクリックする
  5. Create a Custom Eventをクリックする
  6. Event Nameは適当に入力
  7. 発火元のテーブルを選択する
  8. Data Change TypeはUpdatesのみにする
  9. Conditionには以下のような数式をいれる

    更新前と後を比較して異なる場合にだけ発火という意味の数式になります。
  10. Add a stepで次のアクションをいれる
  11. Create a custom stepをクリックする
  12. Settingsでは、Call a scriptを選ぶ
  13. Apps Script Projectのボックスをクリックして、スタンドアローンコンテナを選ぶ
  14. Function Nameでは実行する関数を選ぶ
  15. Function Parametersでは渡す引数を選択する
  16. 右上のSAVEをクリックする

すると、フォーム上にボタンがあるのでタップするとTriggerの値が更新されて、同時にActionが発火しTriggerの値が変わった場合にはGASを叩くという動作がこれで作れました。

図:Conditionで値の新旧を判定

図:手動発火用に別のGAS実行を作っておく

図:手動発火をタップするとGASが動く

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)