AppSheetには、ボタンクリックで処理を実行したり、作業を自動化するActionという機能があります。Actionには大きく分けて、
- UI Navigations:Viewを切り替える
- Data Changes:データの一部を変更(追加、更新、削除)する
- External Communications:情報を外部サービスに送信する(プッシュ通知やSMS)
の3つがあります。
このブログでは、Data Changesの「Data: set the values of some columns in this row」を何度か解説してきました。
今回は、Data Changesの「Data: execute an action on a set of rows」について解説します。
【お知らせ】
2022年10月以降、AppSheetエディタの画面が新しく変更されています。
AppSheetのアップデートが速すぎて(汗)、このブログ記事はまだ新エディタの画面には対応していません。
エディタ画面右上にある「Switch to the legacy editor」というアイコンをクリックすると、新エディタと旧エディタの切り替えができます。
記事のアップデートができるまでは、とりあえず、旧エディタに切り替えて解説を読んでください。
目次
1.AppSheetの「execute an action on a set of rows」は設定が難解
Data Changesには使用頻度が高い「Data: execute an action on a set of rows」というActionが用意されています。
「Data: execute an action on a set of rows」には、
- テーブルをまたいだ処理
- 1件、または2件以上のレコードを一括処理
ができるという使い道があります。
複雑な処理でなければ、GAS(Google Apps Script)や外部サービスに頼らず、AppSheetだけで処理が実行できるようになります。
ところが、「Data: execute an action on a set of rows」は設定が難解で使いこなすのが難しいActionではないでしょうか?
公式ドキュメントの解説もそれほど詳しくなく、ユースケースも少ないので、分かりにくいと思います。
この記事では、在庫管理アプリのユースケースを使って「Data: execute an action on a set of rows」の設定について解説してみます。
使用する在庫管理アプリは、このブログで解説している在庫管理アプリ(7回シリーズ)です。
ブログを読んでアプリを自作していない場合は、メルマガ購読者特典のサンプルアプリをダウンロードしても大丈夫です。
2.在庫管理アプリでテーブルをまたいだ処理をやってみる
この記事では、在庫管理アプリのユースケースでテーブルをまたいだ処理をやってみましょう。
- 「入出庫履歴」テーブルに入庫、出庫、棚卸などの履歴を追加する
- 追加した履歴の品目と同じ品目を「品目」テーブルで探す
- 「品目」テーブルの在庫量を保存する列の値を更新する
データソースに列を追加したら、AppSheetでRegenerateする
まずは、データソースに在庫量を保存する列を追加します。
AppSheetエディタ左側メニューにある「Data」をクリック、タブメニュー「Tables」をクリックします。
「品目」テーブルをクリックして、設定パネルを開きます。
「View Source」をクリックしてデータソースを開きます。
データソースのGoogleスプレッドシートを開いたら、在庫量を保存する列をひとつ追加します。
「在庫量」という名前のvirtual columnがあるので、重複しないようにしましょう。
ここでは、actual columnに保存するという意味で「在庫量_actual」という名前の列を追加しました。
データソースを変更したので、AppSheet側の列設定を更新する必要があります。
AppSheetエディタ左側メニューにある「Data」をクリック、タブメニュー「Columns」をクリックします。
「品目」テーブルをクリックして、列設定パネルを開きます。
右上の「Regenerate Structure」をクリックします。
「Regenerate」をクリックします。
データソースを変更したときには、AppSheet側で必ず「Regenerate Structure」をしておきましょう。
「在庫量_actual」列が「品目」テーブルに追加されたと思います。
Typeを「Number」にしておきましょう。
スライスを確認する
スライスの設定を確認します。
AppSheetエディタ左側メニュー「Data」をクリック、タブメニュー「Slice」をクリックします。
「在庫」というスライスがあるので、クリックしてスライス設定パネルを開きます。
Slice Columnsに「在庫量_actual」が追加されているでしょうか。
ない場合は、「Add」で追加しておきます。
Viewを設定する
追加した「在庫量_actual」列をViewで表示するように設定します。
AppSheetエディタ左側メニュー「UX」をクリック、タブメニュー「Views」をクリックします。
Primary Viewsにある「品目」Viewをクリックして、設定パネルを開きます。
Column orderに「在庫量_actual」を追加します。
「品目_Detail」Viewを設定します。
AppSheetエディタ画面のプレビューで、タブメニュー「品目」をクリックして選択します。
追加済の品目をどれでもよいので、ひとつ選択します。
プレビューの下の方にある「View: 品目_Detail」のリンクをクリックします。
「品目_Detail」Viewの設定パネルが開きます。
Column orderに「在庫量_actual」を追加します。
「在庫_Detail」Viewを設定します。
AppSheetエディタ画面のプレビューで、タブメニュー「在庫」をクリックして選択します。
品目をどれでもよいので、ひとつ選択します。
プレビューの下の方にある「View: 在庫_Detail」のリンクをクリックします。
「在庫_Detail」Viewの設定パネルが開きます。
Column orderに「在庫量_actual」を追加します。
以上で、Viewの設定は終了です。
3.Actionを設定する
「set the values of some columns in this row」を用意する
では、本題のActionを設定していきます。
「execute an action on a set of rows」のActionを作成する前に、別のActionを一つ用意しておきます。
というのも「execute an action on a set of rows」は単独では動きません。
必ず、もうひとつ別のActionと組み合わせる必要があります。
AppSheetエディタの左側メニュー「Behavior」をクリック、タブメニュー「Actions」をクリックします。
「New Action」でActionを新規作成しましょう。
まずは、在庫量を計算して「在庫量_actual」列に値を保存するActionを作成します。
各項目は以下のように設定しました。
- Action name:「在庫量_actualに保存」
- For a record of this table:「品目」
- Do this:「Data: set the values of some columns in this row」
- Set these columns:「在庫量_actual」式は一旦空欄のまま
Set these columnsには式を設定します。
式は既にあるものを流用するので、ここでは一旦保留にしておきます。
右上の「Save」をクリックして保存するとエラーのアラートが表示されると思いますが、気にせず続けましょう。
Set these columnsで「在庫量_actual」に設定する式を持ってきます。
AppSheetエディタ左側メニュー「Data」をクリック、タブメニュー「Column」をクリックします。
「品目」テーブルの列設定パネルを開きます。
「在庫量」というVirtual Columnがあります。
Formulaをクリックして、設定されている式を表示します。
「在庫量」に設定している式の一部分を利用します。
以下の式をコピーしておいてください。
式の意味については、在庫管理アプリ(第5回)の解説を参照してください。
ANY( SELECT( 入出庫履歴[変更後の数量], [ID] = MAXROW("入出庫履歴", "_RowNumber", [_THISROW].[ID] = [品目]) ) )
Actionの設定に戻ります。
AppSheetエディタの左側メニュー「Behavior」をクリック、タブメニュー「Actions」をクリックします。
さきほど追加した「在庫量_actualに保存」の設定パネルを開きます。
Set these columns「在庫量_actual」の式を設定しましょう。
三角フラスコアイコンをクリックしてExpression Assistantを開きます。
Expression Assistantに先ほどコピーした式をペーストします。
以下のようになります。
「execute an action on a set of rows」を設定する
では、本題のActionを作成しましょう。
各項目は以下のように設定しました。
- Action name:「入出庫した品目を検索」
- For a record of this table:「入出庫履歴」
- Do this:「Data: execute an action on a set of rows」
- Reference Table:「品目」
- Referenced Rows:LIST( [ 品目] )
- Referenced Action:「在庫量_actualに保存」
各項目の下にはdescription(説明)が1〜2行書いてあるのですが、これが分かりにくい。。。
なので、私なりの解釈を要約しました。我流なので正しいかどうかは保証できませんが、こんな感じだと思います。
Action name | アクションの名前 |
---|---|
For a record of this table | アクションのトリガになるテーブル 「入出庫履歴」テーブルにレコード(行)を追加したときにActionを実行するので、「入出庫履歴」がトリガになる |
Do this | 実行するアクション |
Referenced Table | アクションを実行するテーブル 入出庫した品目と同じ品目を「品目」テーブル内で探すので、「品目」が実行するテーブルになる |
Referenced Rows | アクションを実行するレコード(行)を探す条件を設定する |
Referenced Action | Referenced Rowsに対して行うアクション |
Referenced Rowsには式を設定します。
「execute an action on a set of rows」は、Referenced Table内の1件または2件以上のレコード(行)に対してアクションを実行します。
なので、式の結果はレコード(行)を識別するKEY値をListで返す必要があります。
ここでは「品目」テーブルがReferenced Tableなので、「ID」列がKEYになっているはずです。
「入出庫履歴」テーブルの「品目」列の値と同じID列の値(KEY値)を持つ「品目」テーブル内のレコード(行)をListで返します。
AppSheet関数のFILTER関数を使用してもよいですが、LIST関数で以下のようにしても大丈夫です。
該当する品目はひとつだけなので、Listで返る値はひとつだけになります。
「入出庫履歴」テーブルに履歴を追加したときにActionを実行するように設定します。
入出庫した品目と同じ品目を「品目」テーブルから探して、「変更後の数量」列の値を「在庫量_actual」列に保存します。
AppSheetエディタ画面のプレビューで、タブメニュー「入出庫履歴」をクリックして選択します。
「+」ボタンをクリックします。
プレビューの下の方にある「View: 入出庫履歴_Form」のリンクをクリックします。
Behaviorを開きます。
Event Actionsで、Form Savedをさきほど追加したAction「入出庫した品目を検索」にします。
エディタ右上の「Save」をクリックして保存すれば、設定は完了です。
4.AppSheetアプリを操作して確認する
最後に正しく設定できているか確認してみましょう。
まずは入庫をやってみます。
タブメニュー「入出庫履歴」をクリックして選択し、「+」ボタンをクリックします。
操作内容で「入庫」を選択して、「入庫数量」を入力します。
画面では「変更後の数量」が15になっています。
「Save」で入出庫履歴を追加してみます。
タブメニュー「在庫」をクリックして確認してみます。
「在庫量」列の値と「在庫量_actual」列の値が同じなら成功です。
タブメニュー「品目」をクリックして確認してみます。
こちらも「在庫量」列の値と「在庫量_actual」列の値が同じなら成功です。
次に出庫をやってみます。
操作内容で「出庫」を選択して、「出庫数量」を入力します。
画面では「変更後の数量」が10になっています。「Save」で入出庫履歴を追加します。
タブメニュー「在庫」をクリックして確認してみます。
「在庫量」列の値と「在庫量_actual」列の値が同じになっているでしょうか。
タブメニュー「品目」をクリックして確認してみます。
最後に棚卸をやってみます。
操作内容で「棚卸」を選択して、「棚卸後の数量」を入力します。
画面では「変更後の数量」が9になっています。「Save」で入出庫履歴を追加します。
タブメニュー「在庫」をクリックして確認してみます。
「在庫量」列の値と「在庫量_actual」列の値が同じならOKです。
タブメニュー「品目」をクリックして確認してみます。
問題ありませんね。
以上、「execute an action on a set of rows」を使ってテーブルをまたいだ処理をやってみました。
今回は、1件のレコード(行)について処理をしましたが、「execute an action on a set of rows」は2件以上のレコード(行)について一括処理ができます。
次回は、一括処理についてやってみましょう。お楽しみに!