AppSheetでLOOKUP関数やSELECT関数を使って値を呼び出す処理をしているときに、フォーム上では計算が正しく行われているのに、一覧表示では値が違うといった症状が発生したので、その原因と対処法についてまとめています。
発生状況
エラーや警告が発生しているわけではないのですが、挙動がおかしいという状態です。
「貸出管理マスター」というテーブルの中に「在庫」というカラムがあり、そこにFORMULAを設定しています。
LOOKUP([_THISROW].[書籍名], "本一覧", "書籍名", "残数")
これは、現在の行の書籍名を、「本一覧」テーブルの「書籍名」カラムで検索し、一致した行の「残数」カラムの値を取得するという処理です。
ちなみに、これをSELECT関数を使って書き換えても同じ結果になります。
ANY(SELECT( 本一覧[残数], [書籍名] = [_THISROW].[書籍名] ))
実際に、「本一覧」テーブルの「書籍名」カラムを見ると次のようになっています。「窓ぎわのトットちゃん」の残数は「2」となっています。
しかし、FORMULAにLOOKUP関数(またはSELECT関数)を指定した箇所の数値は「4」になっています。
これを入力フォーム上で確認すると、FORMULAに記載した結果がきちんと反映されています。
元データとなっているスプレッドシートを確認してみると、表示されている値と同じく「4」が記載されています。
発生原因
View typeのテーブルは、元のスプレッドシートのデータをそのまま反映するものです。
FORMULAは何らかの値に変更が加えられたときに自動計算を実行するための数式です。
スプレッドシートなどで読み込んだ通常のカラムに対して、他の行と依存するSELECT関数やLOOKUP関数などを使ってFORMILAを設定した場合に、変更が自動的に反映されないことがあります。
まさに今回の原因はこれです。
対処法
FORMULAに記述した数式で自動計算を行うためには、バーチャルカラム(Virtual Column)を追加して、そこにFORMLAを設定します。
実例
バーチャルカラムの追加
バーチャルカラムを追加するには、対象のテーブルで右上の「+」マークをクリックします。
バーチャルカラム名と数式を入力します。
必要に応じてShow?やData Validityなどの設定を行います。
設定が完了したら右上の「Done」をクリックします。すると、テーブルの一番下にバーチャルカラムが追加されます。
今回の不具合の原因となっていた「在庫」カラムのFORMULAはフォームで仕様しているのでそのままにしておきます。
ビューの設定
続いてビューの設定を行います。これまでの「在庫」カラムは使わずに「VC在庫」を表示するようにします。
対象のテーブルを選択して「Column order」の「Add」をクリックします。
全てのカラムを表示したら削除と並べ替えを行います。
↓ 削除と並べ替え
完了したら「SAVE」をクリックして保存します。
ビューを確認すると、狙い通りの数値が表示されていることがわかります。
以上で対応は完了です。