Power Apps + Power Automate + Sharepoint で管理者のみ更新可能なリストとアプリを作成する

# 要件

 - Sharepointリストでデータを管理したい
 - 一般ユーザーはAppsで提供したアプリ経由でのみ登録や更新をさせたい（リスト直操作を認めない）
 - 管理者はフルコントロールを有し、アイテムの操作を行う

# 解決案概要

 - Sharepoint リストのアイテムごとの権限で「作成/編集のアクセス権」を「なし」にする
 - Appsから実行者が呼び出せるAutomate（親フロー）と、管理者権限で更新操作を行うAutomate（子フロー）を用意し、二段階でフローを実行する

# Sharepointリスト定義

## ポイント

Sharepointリスト設定　＞　詳細設定　＞　アイテムごとの権限　項目で、「作成/編集のアクセス権」を「なし」にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/81156f73-5145-dba1-27bb-86f8fbab4f2a.png)

## 手順

管理者ユーザー「Sharepointリスト設定 ＞　このリストに対する権限　＞　フルコントロール」に登録する
一般ユーザーは「Sharepointリスト設定 ＞　このリストに対する権限　＞　閲覧者」に登録する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/f498e195-1762-18f9-ba33-761578568d65.png)

管理者から見ると、「新規」ボタンが表示されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/540dd60f-4953-3b2f-6cef-543c78227ba1.png)

一般ユーザーから見ると「新規」ボタンが表示されていない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/95900475-dca7-8bd7-ea65-3e5d01ac5d14.png)

# Automate

## ポイント

 - 子の実行ユーザーを管理者（フルコントロールユーザー）に限定する
 - データの受け渡しはJSONで行う

## 手順

### ソリューションの作成

Automateから別のAutomateを呼び出すには、ソリューションに含まれている必要がある
（普通のAutomateではアクションの選択肢に出てこない）

Automateの左メニューから、「ソリューション」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/e357f7bb-4b54-4891-a880-60362252800d.png)

新しいソリューションを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/4520964c-465f-4a84-7e5e-167cddf8a45c.png)

### 親フローの作成（途中まで）

ソリューションの中に入り、Appsから呼び出される用のAutomate（以下、親フロー）を作成する
※既存Automateをソリューションの中に含めることも可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/299f9da5-7d6a-be03-cc95-daeb1d4f601a.png)

ソリューション内のAutomateは子フローを呼び出すことが可能になっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/ecdd824c-e3b2-6bd3-4a6e-d693942f3177.png)

親フローは子フローが出来てないと呼出も保存も出来ないので、一旦放置

### 子フローの作成

先に、ソリューション内に管理者権限で更新操作を行う用のAutomate（以下、子フロー）を作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/a76b85c3-d318-f91a-4c7d-5c80ed844b1a.png)

データのやり取りは、Apps⇔Automate間も、Automate同士間も、JSON形式にしておくと楽。（いわゆる密結合）
例えば引数がひとつ増えた場合に、引数をバラバラに定義しておく（疎結合）と、呼び出し箇所の再定義が必要になるので何かと面倒。

Sharepointリストのユーザー欄はカスタム値でメールアドレスをそのまま指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/66bb1562-1196-ffbb-e7e3-f57410b94b43.png)

子フローの詳細画面から、実行ユーザーを定義する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/7f4515c1-ed42-5a07-e4ef-a881d063da7a.png)

プルダウンで、実行ユーザーを選択する
（ここに出てくるユーザーは作成者か共同作成者の模様）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/d1a2205e-93a7-19e6-92cf-0282f3ce7bf1.png)

ダイアログは「OK」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/010029c3-f9f5-6667-9c63-0aa629319fdb.png)

実行ユーザーを変更すると「保存」ボタンが有効になるので、保存する。

### 親フローの作成（再開）

親フローは子フローを呼び出すのみ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/8059b53b-2592-83ae-a002-85d476ebd677.png)

### 子フローのテスト

まずは、子フローが正常に動くことを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/f9e5c23a-4269-e232-7326-ff482049a290.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/63786b35-8179-f020-b50e-af06ba3c2500.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/7f29b6db-725a-908f-b271-178ca1dc2571.png)


### 親フローのテスト

同じデータを親から流して正常に動くことを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/c7e52baf-13f2-059d-786d-d6784586f361.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/a9f06518-02b6-a7ba-1ffe-5de9f3cc0ddb.png)

# Apps

## ポイント

 - Formは使わない（Appsを開いている実行ユーザーは更新権限がないため、Appsから直接リストは更新できない）
 - AutomateへのデータはJSON形式で渡す

## 手順

ソリューションからアプリを作成する（レイアウトはお好みで）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/4f7ba3ba-924c-137d-99b9-e5beaa93852a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/f56cef43-a2a7-4544-22c0-675b1fa2f1c9.png)

登録ボタンの「OnSelect」時Action

```
UpdateContext({data: JSON({Title: TextInput1.Text, Comment: TextInput2.Text, Worker: User().Email}, JSONFormat.IndentFour)});
SampleParentFlow01.Run(data);
Refresh(SampleList);
```

これで、Appsからは一般ユーザーでも更新が出来、Sharepointリスト直操作は管理者しか行えないソリューションが作成できました。


以上