今回も、ある架空のクリニックで使う診療記録アプリを AppSheet というノーコードツールで作成する話の続編です。
前々々回の記事では、AppSheet でつくる業務アプリで使うデータの構造を考え、Google スプレッドシートで準備を行いました。また、前々回の記事では、そのスプレッドシートを AppSheet に読み込み、データベースとして適切に動くように、型や制約、参照などに関する設定を行いました。さらに、前回の記事では、このようにして用意されたデータベースを操作する画面を AppSheet の機能で作成しました。
今回は、AppSheet で用意されている Action と Automation という機能を使い、アプリに何らかの動作を行う機能を追加してみたいと思います。
前回の記事では、主にテーブル「診療」から作られた View のカスタマイズについて説明し、記事の最後で、「診療」以外のテーブルから作られる View についても同じようにしてカスタマイズができるということも述べておきました。今回の記事では、「診療」以外のテーブルから作られる View についてもカスタマイズがされているという前提で話を進めることにします。
目次
Action と Automation
Action について
Appsheet では 様々な動作を行う Action を設定することができ、View に実行ボタンを用意し、クリック1つで設定した Action を実行できるようにすることができます。
テーブルに対して Add, Delete, Edit のような基本的動作を行う Action、つまりデータベース(ここでは Google スプレッドシートで用意したデータソース)に対してデータの追加、削除、編集を行う Action は、 Google スプレッドシートで用意したデータソースを AppSheet に読み込んでテーブルを作ると自動的に作成されます。そのとき実行ボタンも View に自動的に作られます。
そして、あるテーブルから別のテーブルへの参照がある場合には、参照される側から参照している側のデータを見るためのボタンも View に自動的に作成されます。
さらにまた、例えば、テーブルに「電話番号」を扱う列があり、Phone 型 として設定されている場合は電話をかけるためのボタンも自動的に View に作られるようです。
これら以外にも必要に応じてアプリ開発者が設定できる Action が多数あります。
Action は大きく次のような4つの種類に分類されています。
- Navigation: アプリの別の View へ移動
- Data-change: アプリのデータを変更 (add, delete, update)
- External: 電話の発信、外部サービスへの情報送信(例えばプッシュ通知やSMS の送信)
- Grouped: 決めた順に複数の Action を実行
それぞれのタイプの Action で実行できることの例をいくつか挙げておきましょう。
Navigation というタイプの Action としては、
- AppSheet で作られた別のアプリを開く
- 現在のアプリの別の View に移動
- 表示されている画面のデータを CSV ファイルとしてエクスポート
などがあります。
Data-change というタイプの Action としては、
- 現在表示している行データのいくつかの列の値を何らかの値に設定
- 表示されている画面のデータのいくつかの列の値を使って別のテーブルに新しく行データを追加
などがあります。
External communication というタイプの Action としては、
- あるウェブサイトへアクセス
- ファイルを開く
- メールを送信
- 電話をかける
- テキストメッセージを送信
というものがあります。
そして、Grouped というタイプの Aciton は上記のようないくつかの Action を連続して実行するものです。
Action についての詳しいことは公式サイトヘルプページのアクションの基礎などを見てください。
Automation について
Bot を作ることによりいろいろな作業を自動化できる機能です。
Bot は、
- イベント(きっかけとなる事象)
- プロセス(実行すべき一連の作業)
を設定して作成します。つまり、どんなときにどんな作業を行わせるのかということを設定します。
イベントでは、データーが変更されたときに発動するトリガーやスケジュールをもとに発動するトリガーを設定できます。
プロセスでは、実行すべき処理を必要に応じて複数のステップをつないで設定します。このとき、各ステップには、「タスク」、「データ操作」、「条件分岐」、「待機」、「プロセスの呼び出し」、「特定の値を返す」が設定できます。
用意されているタスクとして、2025年1月時点では、
- メールを送信する
- プッシュ通知を送信する
- SMS メッセージを送信する
- Webhook で外部サービスと通信する
- PDFなどのファイルを作成して保存する
- Google Apps Scriptを実行する
があるようです。
Automation についての詳しいことは公式サイトヘルプページ自動化を構築するを見てください。
診療記録アプリにPDF出力機能を実装
ここではこれから、一人ひとりの患者の詳細を表示する View 「患者_Detail」にボタンを用意し、そのボタンをクリックすると患者がこれまで受けた診療の履歴が PDF ファイルとして出力される機能を実装したいと思います。
ところで、AppSheet で用意されている Action の中には PDF ファイルを出力する機能がありません。一方、Automation には PDF ファイルを作成して保存する Bot をつくる機能があります。そこで、Action と Automation の機能を組み合わせることにより実行ボタンを押すと PDF ファイルが出力される機能を実装してみたいと思います。
Automation のところで説明したように、何らかのイベントをきっかけに Bot はトリガーされます。そこでまず、PDF 出力をしたいデータを扱っているテーブルに Bot のトリガーだけを目的とした列を適当な名前で用意しておきます。そして、このトリガー用の列の値を変更する Action を設定し、その Action の実行ボタンを View に用意します。一方 Automation ではトリガー用の列の値が変更されると Bot がトリガーされて PDF ファイルが作成、保存されるように設定しておきます。
つまり
- Action 実行ボタンを押すとトリガー用の列の値が変更される
- Bot がトリガーされ PDF ファイルを作成、保存する
という流れにするわけです。
トリガー用の列をテーブル「患者」に用意

上の図は、テーブル「患者」に「PDF出力カウンター」という名前でトリガー用の列を新たに用意したところをあらわしています。
この列は、(後に用意することになる )Action 実行ボタンを押すことで値が 1 ずつ増えるように設定しておこうと考えているもので、整数を扱うため型を Number にしてあります。
ところで、この列は Virtual Column としてではなく、実際にスプレッドシートに値が保存される列として用意します。ですから、AppSheet のアプリ作成画面だけでこの列を用意することはできません。この列を用意するには、まず、次の図のように、データソースとして使っている スプレッドシートの「患者」シートに「PDF出力カウンター」という列を挿入しておきます。

このシート「患者」を後に AppSheet に再読込します。またこの図では、列「PDFカウンター」には適当な値を入れてあります。これまでに出力したPDF の正確な数をこの列に格納しておきたい場合は、全て 0 にしておくと良いでしょう。
さて、スプレッドシートの改良ができたら、次は AppSheet に戻り、Data > 患者 と辿ってテーブル「患者」の設定画面を開きます。

そしてこの図のように、患者の横にある3点リーダをクリックします。するといくつかの操作を選択するナビゲーションが現れるので、「Regenerate schema(スキーマの再生成)」を選択します。すると「Regenerate structure?」という確認を求めるダイアログがあらわれるので「Regenerate」をクリックします。このようにすると、テーブル「患者」のデータソースであるスプレッドシートの「患者」シートが再読込され、先程追加した列「PDFカウンター」が AppSheet のテーブル「患者」にも追加されます。
これでトリガー用の列をテーブル「患者」に用意することができました。
トリガー用の列の値を変更する Action を設定
まず、画面左に縦に並ぶメニューで Actions をクリックしましょう。

すると上の図のように、Add、Edit、Delete など、AppSheet によって自動的に作られた Action がいくつか並んでいるのがわかります。(実はテーブル「スタッフ」にPhone 型の列「電話番号」を用意しておいたので、Call a Phone という Action や Send SMS という Action も自動的に作られています。)
さて、これから設定しようとしている Action はテーブル「患者」に用意された列「PDF出力カウンター」の値を変更するためのものでした。
いま、Action が縦にいくつも並んでいますが、Action はテーブルごとにグループ分けされています。そこで、「患者」と書いてあるところにマウスをホバーさせてみましょう。すると次の図のように、「+」のボタンがあらわれ、補足説明として黒い「Add Action」というツールチップが表示されます。

では、「+」ボタンをクリックし、Action を追加していきましょう。
すると、次の図のように、ダイアログがあらわれ、AppSheet が提案する Action の中から選ぶか自分で一から Action を設定するか決めるように求められます。(今回はたまたま AppSheet が提案する Action は1つもありませんでした。)ここでは、次の図のように、「Create a new action for 患者」をクリックします。

すると、次の図のように、Action を設定するパネルが開きます。

ここでは以下のように設定してみました。
- Action name:PDF出力
Action の名前を「PDF出力」にした。 - For a record of this table:患者
Action の対象となるテーブルを「患者」にした。 - Do this:Data: set the values of some columns in this row
Action が実行する内容を「この行データに含まれているいくつかの列の値を何かしらの値にする」とした。 - Set these columns:PDF出力カウンター=[PDF出力カウンター]+1
Action が設定する列を「PDF出力カウンター」にして、「値をもとの値から1増やす」とした。 - Position:Prominent
Action の実行ボタンの位置を「Prominent」つまり Detail View の上部にした。
これで Action の設定ができました。Action 実行ボタンが View 「患者_Detail」の上部に「PDF出力」という名前で表示されていることがわかります。
この Action が実行するのはあくまでも、テーブル「患者」の列「PDF出力カウンター」の値を 1 増やすことだけです。 PDFファイルが作成されるわけではありません。
トリガー用の列の値の変更時に PDFを作成する Automation を設定
AppSheet では、Automation 機能を使い、あるイベントをトリガーとして PDF、CSV、HTML 、JSON、XML などのファイルを自動的に作成する機能を実装することができます。そしてこれらのファイルは、あらかじめ用意しておいたテンプレートにテーブルの列の値を差し込むことで作成される仕組みになっています。
次は、作成されるPDFの例と、そのPDFを作成するために使うテンプレートです。


テンプレートでは、差し込みたい列名を「<<」と「>>」で囲んで<<[列名]>>のようにして差し込みたい場所に書いておきます。
では、このようなテンプレートの作り方について詳しく見てみることにしましょう。
PDFファイルのテンプレートを作成
PDF出力のためのテンプレートは Google Document や Microsoft Word などで作成できるようです。ここではテンプレートをGoogle Document で作成してみることにします。
まず、PDF ファイルに出力したい列について確認しておきます。
次の図は、Data > 患者 と辿り、テーブル「患者」の設定を開き、(すでにある程度カスタマイズして作られている) View「患者_Detail」との対応を確認しているところをあらわしています。

テーブル「患者」はテーブル「診療」の列「患者id」から参照されているので、Virtual column「Related 診療s」があります。ですから、各患者が受けた診療がテーブル「診療」からリストとして取得され、次の図のように View「患者_Detail」に埋め込まれています。

各患者に対して作られる PDF ファイルに出力したいのは、上の2つの図で赤い四角で囲まれていた列の値です。
では、テンプレートを Google Document で作ってみることにしましょう。
テンプレートを格納しておく Google Drive 上の場所
AppSheet は作成しているアプリが使う一群のファイルやフォルダを自動的に Google Drive 上に作ります。
特にデフォルトの設定を変えずに AppSheet でアプリ作成をしている場合には、作成しているアプリに関する一群のファイルが
マイドキュメント > appsheet > data > “Default app folder”
に格納されています。
“Default app folder” は作成しているアプリによって異なる名前になります。例えば
診療記録-5704995-24-10-12
のようになっていると思います。
“Default app folder”の名前を確認したい場合は、AppSheet のアプリ作成画面で、Settings > Information > App Properties と辿り、Default app folder の欄を見てみるとわかります。
このフォルダの中にはさらに2つのフォルダ「Content」、「Files」とファイル「empty.txt」があります。
管理のし易さを考えに入れると、今作ろうとしているテンプレートは「Contents」の中に格納しておくのが良いでしょう。(必ずそうしなければならないというわけではありません。任意の場所に格納しておくことができます。)
テンプレートを格納するフォルダで新規に Google ドキュメントを作成
Google Drive でテンプレートを格納するフォルダへアクセスできたら、画面左上にある「+ 新規」をクリックし、「Google ドキュメント」を選びます。すると新しいタブが開き「無題のドキュメント」という名前で新しい Google Document のファイルが作成されます。
わかりやすくするためにファイルの名前を、例えば「PDF出力ステップテンプレート」などと変更しておきましょう。
そして、先に見たように、

というように作成してみます。
このようにすると、後に Automation の設定を適切に行うことにより、View「患者_Detail」に表示されている「PDF出力」ボタンを押したとき、例えばテンプレートの <<[患者名]>> のところには View に表示されている「患者名」の値が差し込まれ、<<[患者id]>> のところには View に表示されている「患者id」の値が差し込まれた PDFファイルが作成されるようになります。
作成したい PDF にはこれまでの診療の一覧を表として挿入するようにしています。この表では、テーブル「患者」の Virtual column「Related 診療s」に格納されているリストに含まれるデータを順に繰り返して差し込みます。AppSheet では、リストの繰り返しの差し込みのためには 「Start expression」と呼ばれるものを使うようです。
Start Expression は、<<Start: 行データのリスト>>で始まり、 <<End>>で終わります。
今の場合、行データのリストは列「Related 診療s」に格納されているので、
<<Start: [Related 診療s]>>で始まり、 <<End>>で終わる
と記述することになります。
そして、<<Start: 行データのリスト>> と <<End>> の間に差し込みを行いたい列を指定します。差し込みできる列は、行データのリストが持っている列です。
今の場合、「Related 診療s」 が持っている列(今の場合、テーブル「患者」を参照しているテーブル「診療」が持っている列)の中から「id」、「日付」、「症状・状態」、「処置」、「備考」、「担当スタッフ」を差し込みたいので
<<Start: [Related 診療s]>><<[id]>><<[日付]>><<[症状・状態]>><<[処置]>><<[備考]>><<[担当スタッフ][スタッフ]>><<End>>
というようになります。担当スタッフのところが[担当スタッフ][担当]となっているのは、実はテーブル「診療」の列「担当スタッフ」を Virtual Column として作成し、AppFormula を[Related 診療−スタッフs][スタッフid] としてテーブル「スタッフ」から参照されるようにしているためです。このことについての詳しいことは、AppSheet 公式ヘルプの 列値の式 や 式の間接参照 などを見てください。
出力される PDF ファイルにはこれらの列の値を表として挿入したいので、テンプレートとなる Google Document ファイルでは、適当な位置に2行×6列の表を挿入しておいてから、一行目に見出し、2行目には Start expression を適切なセルに記入するようにします。
これでテンプレートは完成です。
Start expression の詳しいことは、AppSheet 公式ヘルプの テンプレートで Start 式を使用する を見てください。
ここではゼロからテンプレートを自作しましたが、実は、AppSheet にはテンプレートを自動で作成する機能も備わっています。ですから、自動で作成されたテンプレートをカスタマイズして目的に合うようにすることもできます。
Automation の設定
自動化された作業を行う Bot を作成するときには、画面左に縦に並ぶメニューで「Bot 」をクリックします。すると次のような画面があらわれます。

ここにはいくつでも Bot を作成できますが、、新しく Bot を追加するときには上の図で「+」と書かれているボタンをクリックします。すると次のように、ダイアログがあらわれ AppSheet が自動的に処理を行う作業の候補をいくつか提案し自動的に Bot を作ろうとします。実はよく見ると、この候補の中に今の目的のために適当なものがあるのですが、ここでは AppSheet の使い方について慣れるためにあえて提案は見送り、「Create a new bot 」をクリックします。

すると次の図のように、New Bot という名前で何も設定されていない Bot が作られますが、わかりやすくするためにこの Bot の名前を変え、「PDF出力」とすることにします。そのためには図にあるように、3点リーダをクリックし、Rename を選択します。そして New Bot と書かれていたところに「PDF出力」と書き込みます。

次の図を見てください。Bot 作成では、「Bot をトリガーするイベント」と「トリガーされたときに Bot が行う処理」を設定していきます。まず、「Bot をトリガーするイベント」を設定したいので、青くなっているボタン「Configure event」をクリックしましょう。

するとイベントを設定するパネルになり、 AppSheet がいくつかイベントの内容を提案してきますがここでは提案は見送ります。そしてイベントの名前を「PDF出力カウンターの更新」とでもしておき「Create a new event」をクリックします。

すると次の図のように画面右側にイベントの内容を設定するパネルがあらわれます。
今、テーブル「患者」の列「PDF出力カウンターの値」が変更されるイベントがトリガーとなって Bot が処理を行うように設定したいのですが、設定パネルを見ると、例えば、Table が「スタッフ」になってしまっています。そこでこれから、他の項目も含めて1つ1つ修正していきます。

まず Table を「患者」に、Data change type を「update」のみにします。
次に Condition、つまりテーブルがどのように update されたときにトリガーされるようになるのかということを設定します。
Condition の入力欄をクリックすると次の図のように Condition を式(expression)で設定する画面があらわれます。

今の目的を達成するためには、ここに
[_THISROW_BEFORE].[PDF出力カウンター]<>[_THISROW_AFTER].[PDF出力カウンター]
という式を入力します。この式は
今アプリで View を通して見ている行データが持っている列「PDF出力カウンター」の値が、直前の値と直後の値で違っている
という条件をあらわしたものです。このような列に関する式、つまり column expression についての詳しいことは、AppSheet 公式ヘルプの 列値の式 を見てください。
Bot をトリガーするイベントの設定はこれで良いので、次は Bot が行う処理の設定をします。
Bot は複数のステップからなる処理を順に実行したり、条件に応じて異なった処理を行うように設定できますが、今回は、ファイルを作成するという1つだけのステップで済みます。
ステップの内容を設定するために Run this process で「Add a step」をクリックします。

するとダイアログがあらわれステップ名を入力する欄とともに AppSheet がいくつか処理の内容を提案してきます。今回は提案を見送り、次の図のように、ステップの名前を「PDF 出力ステップ」とし、「Create a new step」をクリックしてみます。

すると、次の図のように、Run this process に「PDF出力ステップ」が表示され、画面右側にステップの処理内容を設定するパネルが開きます。

この図を見ると、AppSheet がこのステップの処理内容を自動的に「Send an email」にしていることがわかります。実行したい処理はこれではなくファイルの作成なので、「Create a new file」を選択し直します。すると、下には 「Create a new file」に対応した設定項目が現れるようになります。以下、このパネルで「HTTP Content Type」、「Template」、「File Store」、「File Folder Path」、「File Name Prefix」、「Disable Time Stamp?」という項目の設定をすることにします。

HTTP Content Type では作成するファイル形式を選択します。今回は PDF を選択します。
Template では、ファイルを出力するときに使うテンプレートが格納されている場所を指定します。今回は先程 Google Drive 中のアプリデフォルトフォルダ直下の 「Contents」というフォルダにテンプレートを作成しました。Template の入力欄をクリックすると次のようなダイアログがあらわれるので、Google Drive Files をクリックしてから目的のテンプレートを見つけて選んでください。そうすると、 Template の欄にテンプレートとして使うことにした Google Document の ファイルid が設定されます。

File Store では、利用するクラウドストレジを指定するようになっているようです。今回は Google Drive をそのまま使うので Default のままにしておきます。

また、File Folder Path では、出力するファイルを格納するフォルダを指定します。今回は空欄のままにしておきます。そうすると、アプリデフォルトフォルダの中にある「Files」というフォルダに出力されるようになります。
さらに、File Name Prefix では、出力されるファイルのファイル名の接頭辞を設定することができます。今回はデフォルトのまま、ファイル名の先頭に「AppSheetDoc」がつくようにしておくことにします。
またさらに、Disable Timestamp? では出力されるファイルのファイル名の最後にタイムスタンプをつけるかどうかを選択できます。ファイル名は一意になる方が良いので、ここではそのまま Off にしておくことにします。
これで 今回目的とする処理を行う Bot の設定は終わりです。画面を見ると、次の図のように、テーブル「患者」のところに Bot があるのがわかります。

以上の設定で、各患者の詳細を見るための View「患者_Detail」に用意したボタン「PDF出力」を押すと Google Drive の中にあるアプリデフォルトフォルダの中の「Files」というフォルダに PDFファイルが出力されるはずです。試してみてください。
Google Document で PDF ファイルのテンプレートを作ると、出力される PDF ファイルのレイアウトが崩れてしまうことがあります。(ただし、この記事で作成したテンプレートではそのようなことは起きないと思われます。)このことは、AppSheet の公式ヘルプ ファイル作成のトラブルシューティング の「PDF ファイルが正しく書式設定されていないのはなぜですか?」で説明されています。レイアウト崩れが起きる原因は、AppSheet は Google Document で作られたテンプレートを一旦 HTML 形式に変換し、その後 PDF に変換するということを行っているからとのことです。そして公式ヘルプでは、レイアウト崩れが起きる場合、出力される PDF とテンプレートを見比べながらテンプレートを調整すること、さらに Google Document の機能を使って HTML を出力してテンプレートと見比べ HTML でレイアウト崩れが起きないようにテンプレートを調整することをアドバイスしています。とはいえ、これらの方法は結構厄介なので、現実的な対応の1つとしては、テンプレートでは表を挿入してレイアウトを決めるようにし、不必要な罫線を表示しないという方法が良いかもしれません。
まとめ
今回は、AppSheet に用意されている Action と Automation という機能を組み合わせて、PDFファイルを出力する動作を行う機能をアプリに付け加えました。
このような動作をノーコードツールを使わずに実装する場合、アプリユーザーから送信されてきた指示をアプリが稼働しているサーバーで受け取り、受け取った指示をもとにサーバーで必要な処理(今回は PDF を出力する処理)を行いユーザーへデータを返す処理やデータベースとして使っているクラウドシステム(今回は Google Drive)との連携を行うためのプログラミングが必要になります。ですから、コードを一行も書かずに動作が実装できるのは大きなメリットと言えるでしょう。
AppSheet で作成するアプリが行うことができる動作は AppSheet であらかじめ用意されているものからしか選ぶことができないため限界はあるとは言えますが、業務アプリで必要となる典型的な動作はだいたいできるようです。