chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

AppSheetのRefについて

AppSheetのRefがよくわからなかったが、「Google Workspaceで始めるノーコード活用入門」でRefについて少し述べられていて、いろいろ試した結果の理解をまとめます。現在の理解は以下

  • テーブルを参照する際、紐づけるためのカラム名は同一でなくても良い
    • サンプルでは、親子両方のテーブルに同じカラム名(ID等)が使われいてる場合が多いけど、カラム名が同一でなくても紐づけは可能
  • Refで設定して参照先のテーブル(親)と親子関係が結ばれる時、Keyの属性の付いたカラムが使われる。(名前が異なっていても、Key属性が付いたカラムを使って親子の対応関係が作られる)*1
  • Virtualカラム等で、 [ID].[ADDR]で、親のADDRが得られます等と説明があるが、、この[ID]は子のテーブルのカラムであり、ドットから後ろの.[ADDR]は紐づけされた親のテーブルのカラム*2

上記のように、REQ_ERカラムにRef(名簿テーブル)と設定すると、名簿テーブルのKEY属性であるP_IDと [REQ_ER]の値で親子の対応関係が作られる(と理解)
また、このような親子の対応関係が作られると、Virtualカラムで=[ACK].[P_ADDR]とすると、子のテーブルのカラム[ACK]と一致する名簿テーブルのレコードが引かれ、該当レコードの[P_ADDR]が取得されると理解しました(8/7の時点の理解度)

AppSheetでの以下の表記は

= [ACK].[P_ADDR]

SQL文風に書くと以下と理解しました(クオートとか変数とか適当です)

SELECT P_ADDR  from  名簿テーブル   where  P_ID = $ACK;

AppSheetの関数で表現すると以下と思っています(テスト不十分)

select( 名簿テーブル[P_ADDR],  ( [P_ID] = [_THISROW].[ACK] ))

※自分の理解が間違って、嘘まき散らかしていたら申し訳ないです

■追記
親子関係のテーブルに対してselect文を使う時、一致条件のカラム指定では、テーブル名の指定が不要なようであった。両方のテーブルにおいてカラム名が重複する場合もあるので、テーブル名を修飾する方法もあるのでは?と思えるのだが*3

Documentによると、 条件文はデータセットに対して行われると書かれている。逆参照したければ、_THISROWを指定しろと((逆参照というのがちょっとよくわかりませんが、ごちゃまぜになってしまったデータセットに対して、値を逆にたどって、作られた元のレコードにたどり着き、そのレコードのカラムを参照するという感じでしょうか。。(親のテーブルに追加されている、REF_ROWSを使って子どものテーブル(レコード)に到達するのだろうか。。)))。

2 番目の引数であるselect-row?式内では、すべての列参照は、式が実行されるデータ セットの観点からではなく、
検索されるデータ セットの観点から解釈されます。現在の行から列を参照するには、
逆参照 _THISROWする必要があります。

だから、、VirtualColumに書く場合は、以下の形式になると思われる。(仮に、親と子で同じカラム名(UID)を使っている場合)

select(名簿[PNAME], ([UID] = [_THISROW].[UID]))

■参考URL
support.google.com

*1:複数のカラムにKEY属性が付けられるようだが、、複数付けたらどうなるのか!?

*2:親子だけでなく、親>子>孫の関係もありそうで、この場合、3世代以上の参照はどうなる!?

*3:Documentより。。。selectで指定する一致条件のカラム指定は、すでに作成されたデータ集合に対するカラム指定であり、テーブルという概念は無くなっている。だから、テーブル指定はできない(と理解)