突然ですが、Forms を使って簡易的な入力フォームを作成する という使い方は最近ではよく耳にするようになりました。 一からUIを作る必要がないですし、プラットフォームによらず最適な表示に勝手にしてくれるので、便利ですよね。
Forms で不満がでるとすれば、外部リスト/データソースを参照したような入力をつくったり、入力規制をしたり、あるいは入力フォームをがらっとカスタマイズしたい場合です。
こういう場合には Power Apps でフォームを作るのがPower界隈ではよく考えられる手段です。
今回はPower AppsのフォームをFormsのように使う場合のデータの保存の仕方を考えてみました。
つまり、Power Apps は入力をしてデータ登録を行うだけで、実際のデータは他の場所 (場合によっては登録者が権限を持たない場所) に蓄積されるようなケースです。
ちょっと図にしてみると以下のような格好です。
ユーザーがレコードの修正を行いたい場合も、SharePointには「新規登録」でアイテムを追加させることにします。
Dataverse for Teams のテーブル準備
SharePoint のリストに対応するテーブルを Dataverse for Teams で作成します。
もし素直に列が追加できない (列の種類に出てこない) 場合には yamad365 さんの以下のブログを参考にして列追加をしてください。 (例えば複数行の列とか、日時型とか)
今回は健康状態を申告するためのフォームを考えます。
列表示名 | 種別 | 用途 |
---|---|---|
Name | Text | 申告者の名前 |
申告者のメールアドレス | ||
SubmitDate | Date Only | SharePointに登録された日付 |
Detail | Text Area | 健康状態の詳細 |
蓄積する Dataverse for Teams 側では、同一日付・同一ユーザーのレコードは上書きすることにします。
このあと Power Automate でのデータ操作を書いていきますが、上書きの判断をするための列 (ここでは "Email" と ”SubmitDate" ) の内部名をメモしておきましょう。
なお、SharePoint リスト側も、簡単のために同じような構成にしておきます。
Power Automate でのコピー/更新
SharePoint リスト から Dataverse for Teams のテーブルにデータを引っ張ってくるフローは、テーブルがあるのと同じ環境に作成します。
トリガーはSharePoint の 「アイテムが作成されたとき」です。リスト側は新規登録しかないので、コピーに関してもトリガーはシンプルです。
トリガーのあとすぐに Dataverse for Teams のテーブルからアイテム取得を行います。これは上でも書いた『同一日付・同一ユーザーのレコードは上書き』を実現するためです。
"Filter Query" 部分には比較する列の内部名と、動的コンテンツを使って以下のように設定します。
cr648_email eq '@{triggerOutputs()?['body/Email']}' and cr648_submitdate eq '@{triggerOutputs()?['body/SubmitDate']}'
動的コンテンツの前後にシングルクォーテーションをいれることを忘れずに。
この条件で一覧を取得して、もし結果のレコードが1件でもあれば上書き、0件なら新規作成という分岐を作ります。
特に上書きの場合ですが、上書き対象を特定するために一覧取得結果の中からアイテムを特定するための"ID"を指定する必要があります。 (ここでちょっと悩んだ)
名前が分かりにくいですが、下図のように説明に「Unique identifier for entity instances」と書かれているものを動的コンテンツから選んでください。
Apply to each が入っていますが、どうせ1件なのでこのままにしておきます。
以上でコピー(新規登録/上書き登録) のフローができました。
おわり
SharePoint 側を新規登録のみに限定したので、コピーするフローも簡単ですね。
蓄積場所の権限を限定したい場合などに応用できるかと思います。