AppSheetで別のビューをフィルタして表示する方法
現在、自分が必要なので作ってるとあるAppSheetアプリでちょっと困った事例が。メインのプロジェクト管理テーブルと、そのプロジェクトの工数管理、費用管理、労働時間管理を別のソリューションからデータを引っ張って連結したいけど、それぞれは労働時間管理のPJIDを元に構築されてる・・・
このままでは3つのデータからプロジェクトに関係あるデータを抽出出来ない。そんな時に利用したテクニックが今回のテクニックです。
目次
今回利用するサンプル等
- ビューをフィルタするサンプル - AppSheet
- ビューをフィルタするサンプル - Google Spreadsheet
- LINKTOFILTEREDVIEW()
詳細は次項の現在の問題点にまとめていますが、スライスが使えないであったり、Refで連結できないであったりは色々なソリューションを使ってる場合に結構遭遇する事例です。かといって、各ソリューションの現在のデータに、紐づける為に過去データ全部に値を入れるなんて作業はちょっと大変過ぎる。
そんな時は、ビューで表示する内容をフィルタする手段があります。それがLINKTOFILTERVIEW関数。アクションボタンを使って、データソースに対してフィルタした結果をビューに表示してくれます。
現在の問題点
テーブル構造
AppSheetの為に作ったテーブルはPJテーブルのみで、これがすべての親になります。それ以外の工数管理、費用管理、労働時間のテーブルのデータはそれぞれのソリューションからCSV等で出力したものを取り込んでる内容になります。
本来それぞれのソリューション側で全体で共通して使うIDを設定などという列は存在しないのですが、便宜的に未利用の列(備考欄等)を使って、工数管理の工数IDを連結用の値としてあとから入力して補完しています。こういった運用が現場では結構見かけます。
また各テーブルは単一レコードのこともあれば、1つの工数IDが複数出現する構造のものであったりと様々です。
図:工数IDを任意入力して連結用に使ってる
親のPJテーブルと連結出来ない
親となるPJテーブルと、子となるそれぞれのテーブル。Refによるリレーションが出来ません。理由は親側では工数IDを持ってはいるものの、これをKeyの列とはしていない為。親はどうしてもランダム生成のID列を主キーとする必要があるため、工数ID列を持っていても子側からこの列に対してのリレーションは出来ません(Refは親のKey列と連結する為)
また今回はサンプルなので子テーブル側も綺麗に工数ID列を持たせて表示させていますが、実際の現場のデータは列名も違えば、入ってる場所も備考欄的な予備列を用いてたりと、他のソリューションのデータを繋げるのはそう上手くいくものではありません。
故に、全データに共通で持たせた工数ID列の値をもってして、フィルタを施すことで抽出して表示するという手法を取り、その為のロジックが必要です。通常のRDBMSだとKey列以外ともリレーションシップを貼って連結が出来るのですが・・・
※また、AppSheet側でPJ登録しないとID列の値はわからないので、各ソリューション側で連結用の値を入れられないこともあって、先に判明する工数IDを使ってるという運用上の理由があってこのような構造になっています。
構築方法
テーブル追加とビューの作成
スプレッドシートに存在するPJ等の全テーブル4つをAppSheetのプロジェクトに追加しておきます。これらは特にRefで設定するといったことはしていません。Key列は各テーブルのID列として、工数ID列はText型の値としています。
PJテーブルはプロジェクト作成時に既にビューが自動で作成されています。
今回のアプリではこのPJビュー上に3つのアクションボタンを配置して、クリックすると工数IDでフィルタした内容を、遷移先のビューで表示する仕掛けになっています。
手動作成する3つのビューは
- Primary Navigationには表示せずに、Menu Navigationにビューを手動で作成します。
- ソーステーブルは取り込み済みの各テーブルに直結(スライス等は作りません)
- 各ビューのView Typeは、Tableを指定しています。
よって、アプリの下の方に出てくるタブには各ビューは出てきません。
図:Primaryには表示せずビューを作成
アクションボタンの作成
今回のアプリでの一番の肝となるのは、アクションボタンの作成です。ボタンを押したらフィルタした結果をビューに表示するという仕組みでRefで連結できないテーブルのデータを抽出表示させます。
- 開発画面左サイドバーのActionsをクリックする
- PJテーブルの横にある+ボタン(Add Action)をクリックする
- Action Nameを適宜つけ、For a record of this tableはPJとなってることを確認
- Do thisは、「App: go to another view within this app」を選択する
- Targetには以下のような数式を入力する
1LINKTOFILTEREDVIEW("工数管理", ([工数ID] = [_THISROW].[工数ID]))
工数管理ビューに移動させて、工数管理ビューの工数IDと現在見てるPJビューの工数IDが一致するものとして、LINKTOFILTERVIEW関数を構築します。 - PositionはProminentでOK
- 同じボタンを残り2つのテーブル用に作成して配置する
これで移動先のビューを開くと、Table形式で工数IDを元にフィルタしたデータのみが表示される仕組みができます。
図:数式でビュー移動させフィルタを実行