OneDriveやSharePointで利用できない文字を置き換えてフォルダ名にする方法（Power Automate / Logic Apps）

こんにちわ、 [のりじ](https://twitter.com/nori790822) です。  

「添付ファイル付きのメールを受信したら添付ファイルを自動でOneDriveやSharePointに保存する」仕組みを作る場合、「件名をフォルダ名に利用する」こともあると思います。  

が、OneDriveやSharePointには「利用できない無効な文字」が存在します。

- [OneDrive と SharePoint の制限事項](https://support.microsoft.com/ja-jp/office/onedrive-%E3%81%A8-sharepoint-%E3%81%AE%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85-64883a5d-228e-48f5-b3d2-eb39e07630fa)

Power Automate / Azure Logic AppsでSharePoint / OneDriveに件名でフォルダを作りたい場合、OneDriveやSharePointで利用できない無効な文字「" * : < > ? / \ |」が含まれているとアクションがエラーになる問題。  
返信した場合に入る「RE:」や「<至急>ご確認ください」のような件名って結構多いので、この問題をスルーするとなかなか厄介です。

ということで、今回は「OneDriveやSharePointで利用無効な文字（" * : < > ? / \ |）が含まれている場合、該当の文字を「-」に置き換える処理」のワークフローを作成しました。  

とはいえ、既に出来上がっているワークフローに新しい処理を入れ込むのは大変な場合があります。このようなときには「ソリューション」を利用して処理を子フローとして部品可すると便利なので、今回は「OneDriveやSharePointで利用無効な文字が含まれている場合、該当の文字を「-」に置き換える処理」を子フローとして作成してみます。

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

![0828-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/b7dbe86e-060d-071d-db04-91f7e52489ee.jpeg)

Power Automateポータル画面の「ソリューション」をクリックし、「＋新しいソリューション」で作成します。

# 2. 小フローの作成

新規で作成したソリューション内に小フローを作成します。

![0828-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/61634731-b43a-ec89-3c47-9dc91857a06c.jpeg)

「＋新規」＞「自動化」＞「クラウドフロー」＞「すぐに」を選択し、「OneDriveやSharePointで利用無効な文字が含まれている場合、該当の文字を「-」に置き換える処理」のフローを作成します。

## 2-1. 作成する子フローの全体図

![0828-003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/e6f586bc-8988-76e6-cc6f-1058a19b3d83.jpeg)

子フローの全体図はこのような形。  
親フローから「メールの件名」の値を持ってきて、この小フローで処理を行います。  
今回の「OneDriveやSharePointで利用無効な文字が含まれている場合、該当の文字を「-」に置き換える処理」ですが、[Hiro](https://twitter.com/mofumofu_dance)さんが作成してくださったワークフローを利用させていただいてます。  
Hiroさんいつもありがとうございます！（五体投地）

## 2-2. トリガーの設定

![0828-004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/e30b8bb3-28dd-cbc5-042e-4484cf95c975.jpeg)

タブの「組み込み」をクリックし、「モバイルのフローボタン」をクリック。

![0828-005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/336c63e1-0cb8-c1a9-8c58-0e700ce4fa2b.jpeg)

「手動でフローをトリガーします」をクリックします。

![0828-006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/12d1d5bc-a313-1cc8-f1e7-f7aa24bd1c03.jpeg)

「＋入力の追加」をクリックし「テキスト」を選択。  
今回はメールの件名の値を親フローから取得するフローにするので「件名」と項目名を入れました。

## 2-3. アクションの設定

トリガーの設定が終わったのでアクションの選択・設定を行います。

![0828-007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/b7f82a0d-06f2-e0de-bbcc-cf0b20e765cf.jpeg)

検索窓に「データ操作」と入力し、一覧の中から「作成」をクリック。動的なコンテンツの「手動でフローをトリガーします」の中にある「件名」を選択。  
後続のアクションでわかりやすくするため、コネクタ名を「作成」から「件名」に名前を変更します。

![0828-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/d6ded122-dc52-081d-49e7-0a7b83d19286.jpeg)

検索窓に「変数」と入力し、一覧の中から「変数を初期化する」を選択。  
以下の内容を入力していきます。

- 名前：「置き換え後」と入力
- 種類：「文字列」を選択
- 値：「件名」コネクタの動的なコンテンツの「出力」を選択

このコネクタ名も「変数を初期化する」から「置き換え後」に名前を変更しておきます。

![0828-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/31b4425f-9fcb-16fc-656b-ecbe02321cb2.jpeg)

検索窓に「変数」と入力し、一覧の中から「変数を初期化する」を選択。  
以下の内容を入力していきます。

- 名前：「禁止文字」と入力
- 種類：「アレイ」を選択
- 値：「式」を選択し、以下の内容を入力。

```
createArray('"','*',':','<','>','?','/','\','|')
```

このcreateArray関数をうまく利用すると、処理が簡潔になるのだなと今回学びました。  
このコネクタ名も「変数を初期化する」から「禁止文字」に名前を変更しておきます。

![0828-010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/ec3bbbe5-6f5e-db89-7d02-e66d0db9fe4d.jpeg)

「コントロール」から「Apply to each」を選択します。  
「以前の手順から出力を選択」には動的なコンテンツの変数から「禁止文字」を選択。  
アクションの追加で「データ操作」を検索し「作成」をクリック、動的なコンテンツの変数から「置き換え後」を選択します。  

![0828-011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/d5b43b5b-a424-e225-19cc-46bb3f271407.jpeg)

次にアクションの追加で「変数」を検索し、一覧から「変数の設定」を選択。
以下の内容を入力します。

- 名前：「置き換え後」を選択
- 値：「式」を選択し、以下の内容を入力。

```
replace(outputs('作成'),item(),'-')
```

replace関数を利用して、無効文字を「-」に置き換えます。  

![0828-012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/cbe64c4a-ad2d-59c1-365a-29139b5942b8.jpeg)

最後に、親フローに小フローの処理結果を返す部分を作成します。  
検索窓に「PowerApp」と入力し、表示される「Power Apps」をクリック。

![0828-013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/4c7e7883-dad8-25d3-ac7d-8b08d9a2abd6.jpeg)

「PowerApp または Flow に応答する」をクリック。

![0828-014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/0b6542b1-7c13-566f-db2d-38c4af7f66fc.jpeg)

「＋出力追加」をクリックして「テキスト」を選択し、図のように動的なコンテンツの変数から「置き換え後」を選択。（項目は「置き換え後文字）とわかりやすいものに）

以上で子フローが出来上がったので、名前を付けて保存します。
今回、小フローの名前は「SharePoint_Replace_ChildFlow」としました。

# 3. 既存のフローをソリューションに追加する

今回は既存のワークフローに作成した小フローを追加したいので、該当のフローをソリューションに追加します。

![0828-015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/84918fe1-7407-1f38-be42-5497771111be.jpeg)

小フローを作成したソリューションを開き「既存を追加」をクリック。  
「自動化」＞「クラウドフロー」をクリックします。

![0828-016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/89cdf747-622a-edb5-0ff7-3eef9e0a1a1b.jpeg)

一覧に表示されているフロー名をクリックし「追加」ボタンをクリック。

![0828-017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/9546079a-dddb-a7ce-8782-c6b82fdfd4cb.jpeg)

このように既存のフローがソリューションに追加されました。  
既存のワークフローを修正するのでクリックします。

# 4. 既存のクラウドフローから小フローを利用する

![0828-018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/b3c648a0-6822-47fb-6ce0-0f3f356e1630.jpeg)

ワークフローの「編集」を行います。編集前のワークフローはこのような形。  
元フローの作り方は以下の記事を参考にしてください。

- [Power AutomateでOneDrive内に自動でフォルダーを作る](https://qiita.com/nori790822/items/06ece8d16c53110b9a77)

トリガー直下の「＋」をクリックして、アクションを追加します。　　

![0828-019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/efac5f74-42e1-b262-9914-db61b07b1092.jpeg)

「組み込み」タブをクリックし「フロー」をクリック。

![0828-020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/98f02c83-42db-4e69-1f83-1f9e5e6fe24f.jpeg)

「小フローの実行」をクリック。

![0828-021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/872e7d8d-7303-88e7-e6e7-ab700907f495.jpeg)

「小フロー」は作成したフローを選択。  
件名は、動的なコンテンツの「新しいメールが届いたとき (V3)」内から「件名」をクリック。

![0828-022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/026dadec-5a60-0ba7-7fae-549133986d2a.jpeg)

検索窓に「データ操作」と入力し一覧から「作成」をクリック。  
動的なコンテンツの「小フローの実行」から「置き換え後文字」を選択します。

![0828-023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/67ae7a14-35ef-df5e-9f06-972416ba5c28.jpeg)

最後に、保存するフォルダ部分を変更します。  
フォルダーパスの部分を以下の内容で置き換えます。
```
concat(formatDateTime(addhours(utcnow(),9),'yyyy-MM-dd'),'/',outputs('作成'))
```

日付フォルダの中に件名のフォルダを作り、その中に添付ファイルを格納していきます。件名に無効文字が入っていても子フローで「-」に置き換えられているのでエラーは出なくなる、という形。

![0828-024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/8e641ee2-f8d4-1b92-aa05-be8be8a920f2.jpeg)

最終的に、親フローはこのようなワークフローになります。

# 5. 実行結果

では実行結果を見てみます。

![0828-025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/f2e19ac7-2fe3-4b1f-f377-92347744887a.jpeg)

このように、件名には「< > ? |」という無効文字が入っています。

![0828-026.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/f4987554-3ca1-ef65-dd20-34d0cda878bd.jpeg)

結果は無効文字がすべて「-」に置き換わった形でフォルダができました。

# 6. さいごに

ざっくりですが、ソリューションを利用して小フローを作成する方法も含めての説明でした。  
このようにソリューションをうまく使うと処理を部品可できて便利なので、適宜活用してみてください。