execute an action on a set of rows(第1回)テーブルをまたいだ処理

folder_openAppSheet

AppSheetには、ボタンクリックで処理を実行したり、作業を自動化するActionという機能があります。Actionには大きく分けて、

  1. UI Navigations:Viewを切り替える
  2. Data Changes:データの一部を変更(追加、更新、削除)する
  3. 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」というアイコンをクリックすると、新エディタと旧エディタの切り替えができます。
記事のアップデートができるまでは、とりあえず、旧エディタに切り替えて解説を読んでください。

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が用意されています。

「execute an action on a set of rows」を選択する

「Data: execute an action on a set of rows」には、

  1. テーブルをまたいだ処理
  2. 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.在庫管理アプリでテーブルをまたいだ処理をやってみる

この記事では、在庫管理アプリのユースケースでテーブルをまたいだ処理をやってみましょう。

  1. 「入出庫履歴」テーブルに入庫、出庫、棚卸などの履歴を追加する
  2. 追加した履歴の品目と同じ品目を「品目」テーブルで探す
  3. 「品目」テーブルの在庫量を保存する列の値を更新する

execute an action on a set of rows」のユースケース

データソースに列を追加したら、AppSheetでRegenerateする

まずは、データソースに在庫量を保存する列を追加します。
AppSheetエディタ左側メニューにある「Data」をクリック、タブメニュー「Tables」をクリックします。
「品目」テーブルをクリックして、設定パネルを開きます。

AppSheetエディタでテーブルを設定する

「View Source」をクリックしてデータソースを開きます。

データソースを表示する

データソースのGoogleスプレッドシートを開いたら、在庫量を保存する列をひとつ追加します。
「在庫量」という名前のvirtual columnがあるので、重複しないようにしましょう。

ここでは、actual columnに保存するという意味で「在庫量_actual」という名前の列を追加しました。

データソースに列を追加する

データソースを変更したので、AppSheet側の列設定を更新する必要があります。

AppSheetエディタ左側メニューにある「Data」をクリック、タブメニュー「Columns」をクリックします。
「品目」テーブルをクリックして、列設定パネルを開きます。

AppSheetエディタで列を設定する

右上の「Regenerate Structure」をクリックします。

「Regenerate Structure」をクリックする

「Regenerate」をクリックします。

データソースを変更したときには、AppSheet側で必ず「Regenerate Structure」をしておきましょう。

「Regenerate」をクリックする

「在庫量_actual」列が「品目」テーブルに追加されたと思います。
Typeを「Number」にしておきましょう。
Typeを「Number」にする

スライスを確認する

スライスの設定を確認します。

AppSheetエディタ左側メニュー「Data」をクリック、タブメニュー「Slice」をクリックします。
「在庫」というスライスがあるので、クリックしてスライス設定パネルを開きます。

AppSheetエディタでスライスを設定する

Slice Columnsに「在庫量_actual」が追加されているでしょうか。
ない場合は、「Add」で追加しておきます。
スライスに列を追加する

Viewを設定する

追加した「在庫量_actual」列をViewで表示するように設定します。

AppSheetエディタ左側メニュー「UX」をクリック、タブメニュー「Views」をクリックします。
Primary Viewsにある「品目」Viewをクリックして、設定パネルを開きます。

AppSheetエディタでViewを設定する

Column orderに「在庫量_actual」を追加します。

Viewに列を追加する

「品目_Detail」Viewを設定します。

AppSheetエディタ画面のプレビューで、タブメニュー「品目」をクリックして選択します。
追加済の品目をどれでもよいので、ひとつ選択します。

Viewを表示してレコード(行)を選択する

プレビューの下の方にある「View: 品目_Detail」のリンクをクリックします。

Detail Viewを選択する

「品目_Detail」Viewの設定パネルが開きます。

Column orderに「在庫量_actual」を追加します。

Detail Viewに列を追加する

「在庫_Detail」Viewを設定します。

AppSheetエディタ画面のプレビューで、タブメニュー「在庫」をクリックして選択します。
品目をどれでもよいので、ひとつ選択します。

Viewでレコード(行)を選択する

プレビューの下の方にある「View: 在庫_Detail」のリンクをクリックします。

Detail Viewをクリックする「在庫_Detail」Viewの設定パネルが開きます。

Column orderに「在庫量_actual」を追加します。
以上で、Viewの設定は終了です。

Detail 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を新規作成しましょう。

AppSheetエディタで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 the values of some columns in this row」Actionを設定する

Set these columnsで「在庫量_actual」に設定する式を持ってきます。

AppSheetエディタ左側メニュー「Data」をクリック、タブメニュー「Column」をクリックします。
「品目」テーブルの列設定パネルを開きます。

AppSheetエディタで列設定パネルを開く

「在庫量」というVirtual Columnがあります。
Formulaをクリックして、設定されている式を表示します。

Formulaをクリックする

「在庫量」に設定している式の一部分を利用します。
以下の式をコピーしておいてください。

式の意味については、在庫管理アプリ(第5回)の解説を参照してください。

ANY(
  SELECT(
   入出庫履歴[変更後の数量],
   [ID] = MAXROW("入出庫履歴", "_RowNumber", [_THISROW].[ID] = [品目])
 )
)

Formulaに設定している式をコピーする

Actionの設定に戻ります。

AppSheetエディタの左側メニュー「Behavior」をクリック、タブメニュー「Actions」をクリックします。
さきほど追加した「在庫量_actualに保存」の設定パネルを開きます。

Set these columns「在庫量_actual」の式を設定しましょう。
三角フラスコアイコンをクリックしてExpression Assistantを開きます。

式を設定する

Expression Assistantに先ほどコピーした式をペーストします。

Expression Assistantに式をペーストする

以下のようになります。
Actionを設定する

「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に保存」

「execute an action on a set of rows」Actionを設定する

各項目の下には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で返る値はひとつだけになります。

Expression Assistantに式を設定する

「入出庫履歴」テーブルに履歴を追加したときにActionを実行するように設定します。

入出庫した品目と同じ品目を「品目」テーブルから探して、「変更後の数量」列の値を「在庫量_actual」列に保存します。

AppSheetエディタ画面のプレビューで、タブメニュー「入出庫履歴」をクリックして選択します。
「+」ボタンをクリックします。

Viewでレコード(行)を選択する

プレビューの下の方にある「View: 入出庫履歴_Form」のリンクをクリックします。

Form Viewをクリックする

Behaviorを開きます。
Event Actionsで、Form Savedをさきほど追加したAction「入出庫した品目を検索」にします。

エディタ右上の「Save」をクリックして保存すれば、設定は完了です。

Event Actions を設定する

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件以上のレコード(行)について一括処理ができます。
次回は、一括処理についてやってみましょう。お楽しみに!

Share Me!

前の投稿
AppSheetで在庫管理アプリ(第1回)QRコード、バーコードで業務効率化
次の投稿
execute an action on a set of rows(第2回)一括処理をする

関連記事

メニュー