Power Automate （Azure Logic Apps）を SharePoint リストアイテムでトリガーする方法４つ

## 📅
この記事は、[Microsoft Power Automate Advent Calendar](https://qiita.com/advent-calendar/2024/powerautomate) 
12月17日担当分の記事です🎄✨

https://qiita.com/advent-calendar/2024/powerautomate

---
## 本記事で想定するシナリオ
Power Automate と親和性の高い SharePointリストを起点として、問い合わせ等のアイテムを管理するケースがあるかと思います。
リストを起点に…といっても実は様々な方法があります。

今回は以下のような問い合わせリストを使用して、担当者がステータスを更新した際に、ステータスに応じてフローを動かすという想定で、４つの方法を解説します。


**＜リスト＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/368a8079-58c8-78e1-8d9d-405031bc0ccc.png)


**＜想定フロー＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/951c6919-b493-6638-2683-4b50f1ebb055.png)


## その１: 「アイテムが選択されたとき」に実行する

### 概要  
Power Automate で「選択したアイテムの場合」をトリガーとして設定すると、SharePointリストのアイテムに対して個別に手動でフローを実行できます。たとえば、SharePointリストの任意のアイテムを選択し、Power Automateのフローを呼び出すといった操作が可能です。

**＜イメージ＞**
アイテムのメニュー→自動化→[フロー名]→フローの実行 からの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/8167ad90-1cfa-b073-c62a-dea1acf90212.png)

### 設定手順 
1. Power Automate で`選択したアイテムの場合`をトリガーとして選択します
2. 次に`項目の取得`を設定し、上記で取得したIDを設定します
3. 今回は、回答ステータスに応じてメール送信文章を3つに分岐します
4. 対応済かどうかを判別できるよう、`項目の更新`アクションで一次回答列にフラグを付けます
5. フローを実行する可能性のあるユーザーにフローの権限を付与します

**＜フローの図＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/6a2573bc-74ed-fa95-4de0-a801cfaac804.png)



:::note info
- 特定のアイテムに対して必要なタイミングでフローを実行することが可能です
:::

:::note warn
- 人の手でトリガーする必要がある為、完全に自動化したいというケースには不向きです
- Azure Logic Appsでは「選択したアイテムの場合」トリガーに対応していない為、こちらの方法は対応不可となります
:::

---

## その２: SharePointリストの列にボタンを設置して実行する

### 概要  
SharePointリストの列の書式設定で JSON をカスタマイズすることにより、リスト上に「起動ボタン」を設置し、ボタンをクリックすることでフローを開始することができます。
実装難易度が高そうに見えますが、親切に解説しているブログがあり、初心者でも比較的簡単に設定できます
例えば、[こちらの記事](https://note.com/airily_inc/n/n9bb88c0cb9d9)や[こちらの記事](https://mynote365.hatenadiary.com/entry/2019/05/22/190000)で詳細な手順や、ベースとなる JSON が紹介されています。
（大変分かりやすい記事でいつも参考にさせていただいています、ありがとうございます‥！）

https://note.com/airily_inc/n/n9bb88c0cb9d9

https://mynote365.hatenadiary.com/entry/2019/05/22/190000


**＜イメージ＞**
「メール送信」ボタンを押すことでフロー実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/f7af5c0a-f6c7-46c2-d21f-0cde76bcc3e4.png)


### 設定手順  
1. Power Automate のフローは　「その1: 「選択したアイテムの場合」トリガーを使用する」でご説明したものと同様のものを作成してください。実行者への権限付与も忘れずに！
2. 作成したフローIDを上記ブログにて説明されている JSON 内へ貼り付け、ボタンのテキストを編集等をして列書式を設定します

**＜フローの図＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/7da24119-4a00-ca85-9fda-83e4361c6924.png)

:::note info 
- 簡単な操作で、誰にでも分かりやすいボタンを設置することが可能です
:::

:::note warn
- UI 上ではない設定となるため、後任者への引継ぎなど、メンテナンスを考えての実装が必要となります
- スマートフォン版のSharePointアプリからはボタンが閲覧できません
:::

---

## その３: 「項目が更新されたとき」に実行する

### 概要  
SharePointリストの「項目が更新されたとき」トリガーを利用して、リストアイテムの特定の列（例：Status列）が変更された際にフローを自動実行させます。つまり、ユーザーはStatusの列を更新するのみで、実行ボタン等は押さないというオペレーションになります。

**＜イメージ＞**
ステータスを変更するとフロー実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/b174e1e6-29d2-c572-716e-c789730b835c.png)


### 設定手順  
1. Power Automate で`アイテムが作成または変更されたとき`をトリガーとして選択します
2. [メニュー] → [設定] → [トリガー条件] で以下の式を設定します。Statusが対応中もしくは対応予定もしくは却下であり、かつ、一次回答のチェックが入っていないという式になります
※ 内部列名等は実装に併せて変更してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/36835215-da13-98ab-c569-63bd066e7df1.png)

```:
@and(
    or(
        equals(triggerOutputs()?['body/Status/Value'], '対応中'),
        equals(triggerOutputs()?['body/Status/Value'], '対応予定'),
        equals(triggerOutputs()?['body/Status/Value'], '却下')
    ),
    or(
        equals(triggerOutputs()?['body/OData__x0031_stAnswer'], false),
        equals(triggerOutputs()?['body/OData__x0031_stAnswer'], null)
    )
)
```
3. 次に`アイテムやファイルの変更を取得する（プロパティのみ）`を設定し、上記で取得したIDと、`ウィンドウ開始のトークンのトリガー`を設定します。ここでは、「どの列が更新されたのか？」という情報を取得しています
4. 次の「条件」を設定し、左側に`列が更新されています。ステータス`（変更を検知したい列）を設定し、次の値に等しいで、右側にtrueを設定します
5. true 側にメール送信の switch 分岐を設定します　以降は「その１」で作成したフローと同様に、true内にメールや項目の更新を設定してください

**＜フローの図＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/ad1c03be-8597-105c-2dbd-7ef25ad3111c.png)


:::note info
- Azure Logic Appsでも利用可能です
- アイテム更新とともにトリガーされるため、別の作業が不要となり、オペレーションがよりスムーズになります
:::

:::note warn
- ぱっと見では探しにくい場所で設定をしているため、引継ぎや、後でフローを編集する際は注意が必要です
- 細かな条件式を作成する場合、実装難易度がやや高くなります
:::
---

## その４: 「定期的」に実行する
### 概要
こちらの方法では、「Recurrence(繰り返し)」トリガーを使用します。リストアイテムが、特定のステータスになっていることのみをフローがピックアップして自動実行するようなイメージです。
ユーザー側の動きとしてはその３でご紹介した方法と同様にユーザーがStatus列を変更するとフローが勝手に動く（＝別途の手動での起動は不要）という挙動になります。

**＜イメージ＞**
（あまり良い図が書けませんが…こんな感じ…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/86a779e8-82aa-b778-9600-e2ea6ac7182f.png)

### 設定手順
1. Power Automate で`Recurrence(繰り返し)`をトリガーとして選択します　時間はお好みで構いません（今回は3分とします、あまり短い間隔の場合Power Automate のパフォーマンスが低下する場合がありますのでご注意ください）
2. `複数の項目の選択`を追加し、フィルタークエリに以下を設定します
Status 列が空欄ではなく、一次回答列が1(true)ではないという式にしています
実際の実装にあわせて変更してください
```：
Status ne null and OData__x0031_stAnswer ne 1
```
3.`条件`を追加し、「length(outputs('複数の項目の取得')?['body/value']) 次の値に等しくない 0 」を条件とします
これは、複数の項目の取得アクションでアイテムを作成したかどうか？を分岐する処理となります
4. あとは、`For_each`　の中に入りますが、基本的に他の方法と同じ内容を実装します

**＜フローの図＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/e203738b-bd3d-5b10-af4a-d0657dc71b14.png)

:::note info
- Azure Logic Appsでも利用可能です
- こちらの方法もアイテム更新とともにトリガーされますが、その３の方法よりも実装難易度はやや優しめです
:::

:::note warn
- 他にも多くアクションを追加している場合、Power Automate においてパフォーマンスの低下が発生する場合があります
- 実行履歴に実行時間毎にずらりと結果が並ぶため、後から特定の実行を見返す際に追いにくくなります（Azure Logic Apps の場合は日付フィルタが出来るため問題ありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/3b9042eb-76f6-2953-b92e-6a69cced8df9.png)

:::

---
## で、どれがいいの？
ざっくりと、SharePointリストからトリガーする場合について4つの方法をご紹介しました。長くなりましたが、気になるところとしては「で、どれがいいの？」というところかと思います。
表に簡単にまとめました。

| 要望| 方法 |
|:-----------|------------:|
|実装簡単なのが良い！<br>確実に実行できるものが良い！| その１|
|実装簡単かつちょっと遊びたい！<br>ユーザーフレンドリーなのが良い！| その２|
|自動化したい！<br>実装はちょっと頑張る！<br>~~ボタン押すのも嫌っていうユーザーがいて困っている~~<br>|その３|
|Logic Apps 使ってます！| その４ |

技術的な壁以外は最終的に好みの問題なところもあるかと思いますが、ざっくりとこのように分けてみました。
こんな方法もあるかも、このケースはこの方法が良いかも、等ご意見ある方はぜひお寄せいただけると嬉しいです。

この記事を見てチャレンジしてみたい！という方はぜひ自分の組織や部署に合ったやり方で実装してみてください！