SharePoint リスト - フロー付きカスタム組織テンプレートの作成

# はじめに
SharePointリストでは、組織でリストテンプレートを発行することができます。
テンプレートからSharePointリストを作成することで、列の設定や書式だけでなく、リストに関連するPower Automate フローも一緒に作成することができます。

今日はその方法を、自分の備忘録がてらまとめていこうと思います！

:::note info 
この記事は管理者向けの記事となります。
**SharePoint管理者**、**グローバル管理者**の権限が必要な操作を含みます。
:::


# 関連リンク
公式を見ればすべてわかります。
この記事はそれを実際にやってみたというだけのものです！

https://learn.microsoft.com/ja-jp/sharepoint/lists-custom-template

https://learn.microsoft.com/ja-jp/sharepoint/package-biz-apps-org-list-template



# リストの作成
まずはテンプレートとなるリストを実際に作成しておきます。
リストはなんでも良いのですが、書式設定などしっかり設定しておくと、テンプレートとしての価値が増す気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ec4ece9c-4e60-1d87-8e9d-a107aa157c49.png)

https://mynote365.hatenadiary.com/entry/2021/04/03/204322

# ソリューションの作成
リストと一緒にテンプレートに含めたいフローをまとめるための入れ物として、ソリューションを作成します。

そのまま運用するソリューションではなく、テンプレートのために一時的にしようするものなので、既定の環境とは異なる環境で作成するようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cc62fc77-d809-a0f9-041f-e7ce098f9841.png)

https://learn.microsoft.com/ja-jp/power-automate/overview-solution-flows#create-a-solution


# フローの作成
用意したソリューションの中で、クラウドフローを作成します。
クラウドフローの内容にも特に制約はありませんが、保存場所には注意が必要です。
ソリューションからフローを作成する。もしくは、作成してしまったフローをソリューションに追加する必要があります。

- ソリューション内に作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/dbd2be3d-5696-506c-80b5-db7eab9a3b39.png)

- ソリューションに追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0162e4be-2d46-7539-794a-63ccdff57021.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/63d74fd2-d00f-158e-4ac2-bcfae2a7202f.png)


今回は例として **「リストに新しい項目が作成されたときにTeamsで通知する」** フローを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6673ea50-1c5c-ec6f-f5cf-c72e46614488.png)

こういったトリガーやアクションで、テンプレートとなるリストを参照します。
テンプレートから作成した新しいリストでも、自動的に新しいリストを参照するフローができる、というわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/85f7f989-f506-53e9-a22f-6bc71499e09b.png)


# 接続の確認
フローで使用する接続はすべて、ソリューション内に保存された接続参照である必要があります。
ソリューション内で作成したフローであれば、基本的には接続参照が使用されているはずですが、他のソリューションの接続参照が使用されていないかなど、しっかり確認しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f6614689-6813-a8c0-7f10-f0d715ffaec6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9cfdbdf1-f14e-1acc-12c8-3bc995199ec2.png)

# ソリューションのエクスポート
下準備が終わったら、テンプレートを発行するための準備に移ります。
作成したソリューションの変更を公開し、zipファイルにエクスポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c9c1c504-2172-baa0-4a57-c7639a4df337.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1600c903-d793-d4b1-a6c1-e04df7a3256d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/24b4ab56-1f51-8a53-55ed-eb0f29b23dde.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/export-solutions#export-from-power-apps

# エクスポートしたソリューションファイルの編集
ダウンロードしたzipファイルを一度展開し、中身を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b411eb63-08a9-2a41-9d00-4f02e5fdce75.png)

`Workflows`フォルダの中にあるJSONファイルを開いて編集します。
複数のフローをテンプレートに含めた場合は、複数のファイルがあるはずですので、それぞれ同じ手順で編集しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cf398c59-746f-9232-84e3-16f22f8ddb11.png)

JSONファイルを開くと、接続の情報など、フローの詳細が定義されたファイルであることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c2b20cb5-60f3-6a4c-fc4c-f1ae6f5adc7c.png)

フローのトリガーやアクションもJSONで定義されています。
今は特定のリストが参照されているので、テンプレートとして新しく作成するリストが動的に指定できるよう、この`parameters`の部分を変数に置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4d745c82-34ea-6609-35b2-23e29ff03fac.png)

トリガーやアクションで複数回リストを参照している場合は、参照するすべてのトリガー・アクションを書き換えます。
```text:dataset(サイトのURL)
{ContextSharePointSiteUrl}
```

```text:table(リストのID)
{ContextSharePointListId}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bfdec39b-61c0-cce9-28aa-1a3510c70582.png)

書き換えたら保存し、エクスポートした時と同じ構成になるよう、編集したファイルを再度zipに圧縮します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/464b582a-af78-0c80-1b6b-1964d067a33d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/dd5bd313-1382-69b9-5132-6fa6b6425997.png)

# SharePoint管理シェルへの接続
次に、リストの定義ファイルをダウンロードし、フローを含めた組織テンプレートに発行していくのですが、これらの作業には**PowerShell**を使用します。

PowerShell、SharePoint Online 管理シェルのダウンロードやモジュールのインストールは、何分見よう見まねで行ったため、詳しい手順は割愛させて下さい。

https://learn.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-online/connect-sharepoint-online

ふらりさんのまとめがとても分かりやすかったです。

https://flali.hatenablog.com/entry/2023/01/03/113545

SharePoint管理センターのアドレスを使用して、管理シェルに接続しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/86abccb7-6616-d075-d8b1-cdf9921c4dc2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f9d9fc0f-d5f4-c7d3-3553-2892a928496d.png)

```PowerShell:管理シェルへ接続
Connect-SPOService -Url <SharePoint管理センターのアドレス>
```

# リストの定義ファイルの取得
次に、リストの定義ファイルを取得します。
テンプレートにしたリストのアドレスを確認し、次のコマンドを実行して、ターゲット リストからサイト スクリプト ファイル（`manifest.json`）を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cb79dc91-d4b0-62c9-d792-8d259810e1ed.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/55f99fbb-a5da-6989-53ca-ea39d90ebddb.png)

```PowerShell:サイト スクリプト ファイルを取得
Get-SPOSiteScriptFromList -ListUrl <リストのアドレス> | Out-File manifest.json
```

# リストの定義ファイルの編集
取得した`manifest.json`を開き、テンプレートにフローを含めるよう編集します。
ここでは、`actions`に１つ項目を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9b227a74-2128-090c-f8bd-fd690c6adbc8.png)

```JSON:追加するaction
{
    "verb": "importBusinessApps",
    "listName": "[[L_0001_listName]]",
    "solutionFileRelativePath": "solution.zip"
}
```

追加するとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/90eb07d1-6aec-4cf7-651d-d46f6bb06af0.png)

ここでいう`listName`は、もとからあるactionの`createSPList`と同じ値にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f895a792-1033-2118-9216-37e616f30c82.png)

また、`solutionFileRelativePath`はソリューションをエクスポートし編集したファイルの相対的なパスを定義するものですが、ファイル名など、画面の通りにすすめてもらっていれば、例と同じ指定で大丈夫です。

編集が終わったら、ソリューションのエクスポートファイルと一緒にzipにまとめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0aeb2a32-12cb-2a56-203f-344ece7d5c60.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/02fe205c-c679-c5df-946b-912e611d10de.png)


# テンプレートの発行
できたファイルを、組織テンプレートとして発行します。
PowerShellで以下のコマンドを実行し、サイト デザインで使用するための新しいサイト スクリプト パッケージをアップロードします。
```powerShell:サイト スクリプト パッケージのアップロード
$pkg = Add-SPOSiteScriptPackage -Title "<サイト スクリプトのタイトル>" -Description "<サイト スクリプトの説明>" -ContentPath '<作成したmanifest.zipのパス>'
```

実行したら結果を確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1b98c737-090e-79a6-01cf-b79516d58faf.png)


最後にリストテンプレートとして発行します。
```powerShell:テンプレートの登録
Add-SPOListDesign -Title "<テンプレートのタイトル>" -Description "<テンプレートの説明>" -SiteScripts $pkg.Id
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1572cb4c-3618-7cf8-e23f-b787152d2ce9.png)

# テンプレートを実際に使う
これで登録が完了です。
リストの作成画面からテンプレートが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/4aa63bf2-2b95-6382-36bd-2d7dc2dfa2bc.png)

このテンプレートを使ってリストを作成すると、確認の上、フローが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/df868153-d572-3b27-c9dc-77242b430a3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f7e27ba7-3f4f-69e1-d7a8-ef23ef74db00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/961aaef7-db32-993e-3d21-6181e1547f0b.png)



自動的に作成されたフローを確認すると、新しく作ったリストが参照されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c7ca0dbe-4ba4-1418-63d2-5f02e8782ca6.png)

このフローは既定の環境に作成されたソリューション内に作成されます。
（ここはちょっと困りもの？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b32bb4d5-b072-74ac-f737-39b640e98c6b.png)

# おわりに
フローとリストを一緒に配布できるカスタム組織テンプレート、同じようなリストをいろんなチームで使いまわす場合などには便利だと思います。

ただし、管理者側でそこそこ大変な下準備が必要になるので、使いどころは悩ましいのかもしれません🤔