SharePointリストに複数項目へのリンクを登録する

# はじめに
このフローはSharePointリストの列の書式設定を利用して、複数項目へのリンクを1列に登録するためのフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/582382b5-68db-fc19-f1de-b060d61d6666.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/18b09e46-3390-733f-9355-685c90226750.png)

解説は①SharePointリストの書式設定と②フローについての、2項目について行います。

# やりたいこと
よくあるFormsの投稿をSharePointリストに登録するフローです。
このFormsには添付ファイルが付けられるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ac3bfd3d-f482-90ea-f26c-af8fcb3d99ba.png)

この添付ファイルをリストにも登録したいのですが、リスト項目の添付ファイルとして登録しようとすると、Formsから受け取ったファイルのコピーを作成することとなり、ストレージ容量を無駄に消費してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/def5cf35-74d3-42aa-a7de-63d623cb8c2e.png)

容量削減のためFormsから受け取った側のファイルを削除しても良いのですが、そうするとFormsから回答を確認した時にファイルが分からなくなってしまいます…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f21a9bf8-c89e-daed-1302-584ec9a2459b.png)


ということで、SharePointリストにはファイルへのリンクのみを保存することで、ファイルの複製を行わず容量の節約を測ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/94439ff1-94ff-401d-2890-e388c32fa207.png)

ただし、SharePointリストのハイパーリンク列には複数のリンクを登録することができません。そのため、列の書式設定を利用して、複数のリンクが登録できるようビューをカスタマイズします。

# リストの書式設定の解説
## 列の書式設定とは？
SharePointリストは、JSON形式で書式設定を行うことが出来ます。
条件付き書式を設定したり、データバーを設定したりすることもできます。

https://support.microsoft.com/ja-jp/office/%E5%88%97%E3%81%AE%E6%9B%B8%E5%BC%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E5%A4%96%E8%A6%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-6ed2f787-0e9e-4908-b861-0d06571c256d

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ba2896cf-8a39-0d71-51d8-6d0505406351.png)

今回はこの機能の中で、aタグを使ったリンクの設定や、forEachを使った繰り返し処理、関数を用いたテキスト分割など、さまざまなテクニックを利用してリンクを設定します。

## データの準備
文字数が長いURLを複数登録したいので、列は複数行テキストを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e2e3bc4c-76e4-4243-ffd2-69b80ce27234.png)

後ほどフローから自動登録できるようにしますが、リンクは以下の形式で登録することとします。
`>ファイル名<アイコン|URL`

表示テキスト(ファイル名)・アイコンの指定・リンク先のURLを繋げて、1つの長いテキストを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/16509eaf-1698-4109-69ef-5e59e9b5f516.png)


### アイコンの指定
アイコンには、Fluent UI の定義済みアイコンを使用できます。
私は[こちらのサイト](https://www.flicon.io/)からアイコンとその名前を確認しています。
書式設定では、このアイコンの名前を指定することで、アイコンの表示が可能です。

https://learn.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/column-formatting#predefined-icons

## 書式設定(JSON)
用意した複数行テキストの列で、以下の通り書式設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1deb8e43-9e66-2311-4f3e-da85e0b95d8a.png)

詳しい解説は割愛しますが、*split*関数で分割したリンク項目を、*forEach*でそれぞれに適用し、各項目から区切り文字(「>」,「<」,「|」)を使ってアイコン・表示名・URLを取り出しています。
```JSON:Link列の書式設定
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "div",
  "style": {
    "display": "=if(@currentField=='','none','flex')",
    "align-items": "flex-start",
    "flex-direction": "column"
  },
  "children": [
    {
      "elmType": "div",
      "style": {
        "display": "flex",
        "margin": "5px 0px 5px 0px",
        "flex-direction": "row"
      },
      "attributes": {
        "class": "ms-fontSize-s"
      },
      "forEach": "listItem in split(@currentField,'>')",
      "children": [
        {
          "elmType": "a",
          "txtContent": "=substring([$listItem],0,indexOf([$listItem],'<'))",
          "attributes": {
            "href": "=replaceAll(substring([$listItem],indexOf([$listItem],'|')+1,indexOf([$listItem]+'^','^')),'\n','')",
            "target": "_blank",
            "iconName": "=substring([$listItem],indexOf([$listItem],'<')+1,indexOf([$listItem],'|'))"
          }
        }
      ]
    }
  ]
}
```


同様に設定されたい場合は、そのまま全体をコピペしてもらえればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/56f2b4b8-4021-969f-3b44-d664743a9418.png)


# フローの解説
フローの全体はこのようになっています。
![make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_d42bc9f0-39ad-4c79-b141-7b81be262082(PowerAutomate).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6de7d0a9-29a6-9fd6-60e0-51e6cc0740a0.png)

概ねよくあるFormsを起点としたフローですが、そのうち添付ファイルの扱いのみが異なりますので、その点について解説します。

## 添付ファイルの種類
下記公式ドキュメントを確認すると、Formsに添付できるファイルの拡張子には、制限があることがわかります。

https://support.microsoft.com/ja-jp/office/ファイルのアップロードを許可するための質問を追加する-6a75a658-c02b-450e-b119-d068f3cba4cf#:~:text=%5Bファイルの種類%20%5D%20-%20アップロード,オーディオ)%20を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6445c25c-4a3d-2370-9e83-cc43b676cf87.png)

この拡張子ごとにアイコンを設定したいので、かなりゴリ押しですが、フローの中に以下の**JSON dictionary**を作成します。(こちらは手打ちで用意しました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0213e40a-1f22-f5ea-e2b5-f1821b2e6b9d.png)

```JSON:変数を初期化する-icon-
{
  "doc": "WordDocument",
  "dot": "WordDocument",
  "wbk": "WordDocument",
  "docx": "WordDocument",
  "docm": "WordDocument",
  "dotx": "WordDocument",
  "dotm": "WordDocument",
  "docb": "WordDocument",
  "xls": "ExcelDocument",
  "xlt": "ExcelDocument",
  "xlm": "ExcelDocument",
  "xlsx": "ExcelDocument",
  "xlsm": "ExcelDocument",
  "xltx": "ExcelDocument",
  "xltm": "ExcelDocument",
  "ppt": "PowerPointDocument",
  "pot": "PowerPointDocument",
  "pps": "PowerPointDocument",
  "pptx": "PowerPointDocument",
  "pptm": "PowerPointDocument",
  "potx": "PowerPointDocument",
  "potm": "PowerPointDocument",
  "ppam": "PowerPointDocument",
  "ppsx": "PowerPointDocument",
  "ppsm": "PowerPointDocument",
  "sldx": "PowerPointDocument",
  "sldm": "PowerPointDocument",
  "pdf": "PDF",
  "jpg": "FileImage",
  "jpeg": "FileImage",
  "png": "FileImage",
  "gif": "FileImage",
  "bmp": "FileImage",
  "tiff": "FileImage",
  "psd": "FileImage",
  "thm": "FileImage",
  "yuv": "FileImage",
  "ai": "FileImage",
  "drw": "FileImage",
  "eps": "FileImage",
  "ps": "FileImage",
  "svg": "FileImage",
  "3dm": "FileImage",
  "max": "FileImage",
  "avi": "Video",
  "mp4": "Video",
  "mov": "Video",
  "wmv": "Video",
  "asf": "Video",
  "3g2": "Video",
  "3gp": "Video",
  "asx": "Video",
  "fl": "Video",
  "mpg": "Video",
  "rm": "Video",
  "wf": "Video",
  "vob": "Video",
  "mp3": "MusicInCollectionFill",
  "aif": "MusicInCollectionFill",
  "iff": "MusicInCollectionFill",
  "m3u": "MusicInCollectionFill",
  "m4a": "MusicInCollectionFill",
  "mid": "MusicInCollectionFill",
  "mpa": "MusicInCollectionFill",
  "ra": "MusicInCollectionFill",
  "wav": "MusicInCollectionFill",
  "wma": "MusicInCollectionFill"
}
```
## ファイルの拡張子から設定するアイコンを設定する
添付ファイルごとのApply to eachで、ファイルの拡張子をKeyに、先程作成したJSON dictionaryからアイコンをLookUpします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8a7d5afe-5cfe-ab6e-e03c-eaa8b16ba5c8.png)

JSONオブジェクトからKeyで値を引っ張ってくるには、以下のように関数を作成します。
```PowerFx:fx
Object?['Key']
```

つまり、拡張子からアイコンを指定するアクションはこのようになります。
```PowerFx:作成 icon
variables('icon')?[last(split(item()?['name'],'.'))]
```
ファイル名を「.」で分割(*split*)した最後(*last*)の要素、つまり拡張子を取得してKeyとして利用しています。

## 決められた書式の文字列を作成する
先にSharePointリストで設定しておいた書式に対応するよう、フローで添付ファイルごとに指定の文字列を作成します。
作成した文字列は文字列変数に順次追加し、1つの文字列とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6efb82fa-ad3d-2fbe-f37a-b160ec38abe4.png)

## リストに登録する
指定の文字列が作成できれば、あとはリスト側にこの文字列を登録してあげるだけです。
複数行テキストの列に、先ほどの指定文字列を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c6822e19-9b92-56c8-4fb2-6599d1254347.png)


# おわりに
SharePointリストの書式設定は、他にもさまざまな使い道があります。
ここではほとんど解説ができていませんが、公式ドキュメントやコミュニティ、有志のブログ等眺めてもらうと、**「こんなこともできるんだ！」** ということがわかってもらえるかと思います。

https://pnp.github.io/List-Formatting/

https://mynote365.hatenadiary.com/

はじめから自分で設定するのは難しいですが、これらをコピペするだけでもけっこうイケてるリストが作成できるので、試してみてはいかがでしょうか？

# サンプルダウンロード
今回作成したフローをgithubに公開しています。

https://github.com/ksgiksg/Power-Automate/blob/main/%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0_%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%AA%E3%83%B3%E3%82%AF%E7%99%BB%E9%8C%B2_20230305092815.zip