以前書いた『2つのドロップダウンを連動させる』という記事に、「3つの連動させる場合はどうするのか?」というコメントを頂いたので、3つの選択肢の連動をやってみた!
質問をくださったユーザーさん、ありがとうございます!!
準備
選択肢1を選ぶと選択肢2が決まり、選択肢2を選ぶと選択肢3が決まるイメージ。
例えば、選択肢1で「a」を選ぶと選択肢2で「aa,ab,ac」が出て、選択肢2で「ab」を選ぶと選択肢3で「aba,abb,abc」が選べるイメージ。
カスタムフォーム作成
テキストボックスからドロップダウンへの変更
続いて、前回と同様に選択肢1~3をテキストボックスからドロップダウンへ変更。
データの入ったリストとつなぐ
こちらも前回と同様データの入ったSharePointリストと、このフォームをつなげる。
選択肢1の内容を表示する
※ここで全部のDataCardのロックを解除しちゃうと後ほど楽!
Distinct([データリストの名前], [表示したい列の名前])
と入力する。
選択肢2の内容を表示する
- 親コントロール:選択肢1のDataCard内のドロップダウンを指定
- 一致するフィールド:Distinctに入れた「リスト名」と「列名」を指定
ここまでは前回と全く同様の手順。
選択肢2の重複もなくしてあげる
そこで、この選択肢2のItemsにもDistinct関数を適用する。
Filter([リスト名], Title = [選択肢1のドロップダウン名].Selected.Result)
になっていると思うので、
Distinct(Filter([リスト名], Title = [選択肢1のドロップダウン名].Selected.Result),[選択肢2に表示したい列名])
こんな感じで変更する。
選択肢2のDataCardのUpdate関数でもエラーが出ると思うので、選択肢1と同様Resultプロパティを指定してエラーを消す。
選択肢3の内容を表示する
選択肢3は選択肢2と同じ手順でいける。
- 親コントロール:選択肢2のDataCard内のドロップダウンを指定
- 一致するフィールド:「データリスト名」と「選択肢2の列名」を指定
※選択肢3にはDistinct関数を使っていないので、Resultではなく選択肢3に表示するリストの列名を指定するのに注意!
2021/2/22追記:選択肢に重複がある場合の対応
※佐藤徹さんからコメントを頂き、この考慮漏れに気が付くことができました。佐藤徹さんコメントありがとうございました!!
ここまでの内容だと、例えばこんな感じでマスタに重複があった場合、
こんな感じで、選択肢1が「a」の「aaa」と選択肢1が「b」のaaaが表示されてしまう。。。選択肢1が「a」のアイテムだけ表示させたいのにこれでは失敗。。。
これは3つ目のドロップダウンが、2つ目のドロップダウン(Value1選択肢)の値でしかフィルターしていないため。
そこでこのエラーを修正するには、3つ目のドロップダウンのフィルターの数式をこんな感じで、1つ目と2つ目のドロップダウンを参照するように修正する。
Filter([SPOリスト名], Title = [選択肢1のドロップダウン名].Selected.Result && Value1 = [選択肢2のドロップダウン名].Selected.Result)
実際に直すとこんな感じ。
そうすると、今度こそこんな感じで連動させて表示することができる!
コメント
タイトル=b、Value1=aaの要素があっても正しく表示されるのでしょうか?
佐藤 徹さん
初めまして、コメントありがとうございます!
ご指摘いただいた通り、選択肢に重複がある場合の考慮が漏れておりました。。。
そこで今回、ご指摘いただいた内容を踏まえて記事を更新しました。
コメント本当にありがとうございました!!
初めまして。突然のコメント失礼します。
ドロップダウンを5つ程度連動させたいと考えています。
記事の通りに3つ目まで設定し、4つ目のドロップダウンにも同じように設定をしようとしたところ、
4つ目のドロップダウンの依存先の親コントロールの2つ目の項目が「Result」ではなく、「ID」が選択されました。
ドロップダウン3つ目までは「Result」以外選ぶことが出来なかったのですが、私の設定がおかしいのでしょうか。
Nasachi様
コメントありがとうございます!
私の方でも試してみたのですが「Result」を選ぶことができました。。。
実装を見てみないと何とも言えないのですが、記事の内容では3つ目のドロップダウンのItemsにDistinct関数を使用していないため、「Result」ではなく「Value2(SPOの列名)」を使っています。
この辺りが関係してそうかなと思います。
ご参考になれば幸いです。