SharePoint の参照列でフィルターっぽい実装をする

2020/04/18

経緯

SharePoint でマスタを考える時って、まずは参照列を検討すると思うんですが、
この参照列が使いにくいなーっとずっと思ってました。

例えば、参照先のアイテムを

  • リスト毎に変えたい
  • フラグで表示・非表示を切り替えたい
  • ある時期以降に表示したい
  • ある時期以降に非表示にしたい

とかしたいじゃないですか。

次に検討するのが選択肢列だと思うのですが、マスタではないですよね…

先々月頃、ぜんぜん違う事を調べてる時にふと集計値列を使う方法を思いつきました。
SharePoint 大好き芸人の方々は、きっとこうやってるんだな… やっと気づいたYO!!

忘れそうなのでブログにアウトプットしておこう

環境

  • プラットフォーム: SharePoint Online
  • 利用リスト
    • 部署マスタ: 参照列で参照するリスト
    • 社員名簿: 部署マスタを参照する列を保有するリスト

いままで

  • 参照列を使う

  • 選択肢列を使う

参照列を使うと、参照列として表示したくない部署は部署マスタから削除するしかない(と思っていた)。

選択肢列を使うと、社員名簿リストに設定を持ち、社員名簿の各アイテムにデータを持ってしまうため、例えば部署の名前が変わった時等に、全てのデータを洗い替えする必要が出てくるので、メンテナンス性が超絶悪い。

集計値列を使う

参照列の参照先を集計値列にすることで、表示を変えられることに気づいた。
下図は、部署マスタの活性化列が「はい」のアイテムだけを社員名簿の所属部署として表示させる例。

  • 集計値列を使う

これにより、参照列として表示する部署は、活性化列が「はい」のアイテムだけとなる。
なんだよ… フィルターできるじゃないか!

さらに応用

現実的には、部署マスタや商品マスタなどには「xxxx年xx月xx日~xxxx年xx月xx日まで使用する」という期限がある。
先ほどのように、集計値列の数式に期間を入れようと思うところだが、数式に TODAY や ME などの動的な値は使えない。
こういう時こそ Microsoft Flow の出番。

  • 集計値列と Microsoft Flow を使ったフロー

    1. 毎日 0 時に動作する
    2. 部署マスタを取得
    3. 今日が開始日と終了日の間なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする
    4. 3 をアイテム分繰り返す

実際に設定したのは次の通り

Flow は経験が少ないので恥ずかしいところだけど、取り敢えず内容を解説(自分で後から見直せるように)

1. 毎日0時に実行する

毎日0時に本当に動くか確認してないけど、多分こんな感じでしょう?

2. 変数を初期化する

このフローで使う変数を定義する

3. 部署マスタの取得

Site Address は察してください(サイトのアドレス入れるだけ)

↑ この画像を取る時に気づいたんだけど、詳細オプションから絞り込みとかできるんだねー

4. 部署マスタのアイテムを繰り返し処理

繰り返し処理では、変数をセットして判定を行い、今日が開始日と終了日の間なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする

1つづつ説明、変数 StartDate をセット
開始日(内部列名:StartDate)が空値の時は最小値をセットすることで、開始日に値がない時には開始日に制限がないということなる
※ここで気づいたけど、変数名と内部列名を一緒にして説明書きづらい…

同様に変数 EndDate をセット

最後に期間内なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする

最初の判定が見切れてるので下記に転載
セットした変数 StartDate と EndDate を現在時刻 utcNow() と比較しています

@and(
    less(variables('StartDate'), utcNow())
    ,
    greater(variables('EndDate'), utcNow())
)

考察

やりたい事はだいたい行けそうな気がする

しかし、恐らく次に要望で出るのは、過去データを残しつつ(表示しつつ)、登録・修正時には新しいデータで行いたいということだけど、これは今のところ、マスタの Title も表示して JSLink で表示を書き換えるぐらいしか思いついていない

参考 URL