Power Automateで業務効率化した話②

# 概要
Power Automate（Microsoft提供の自動化ツール）を使って、SharePoint  & slackを連動させて業務効率化をしたので、どういう自動化プロセスを組み込んだのか説明します。

<br>

**【この記事を読むと分かること】**
- SharePointに新しいファイルがアップロードされたときにslackで通知を出す方法
- 現在時刻から翌月の日付を計算する方法
※Outlookとslackの連携方法はこちら→[Power Automateで業務効率化した話①](https://qiita.com/douhua/items/e4328cb4573ea8c66b1d)

<br>

# 問題意識
お仕事でお客さんからデータをもらって、自社でこねこねして、こねた結果をお客さんにまた返すという仕事（以下こねこね連携と呼ぶ）の担当になりました。

全体のフローはこんな感じです↓
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/4131817b-cac1-8600-e19f-2a4ba8724a7d.png">
> 黄緑色の矢印が自分の担当作業

このフローのうち、月7回繰り返し作業が発生する下半分部分については[こちらの記事](https://qiita.com/douhua/items/e4328cb4573ea8c66b1d)の通りうまく半自動化したので、調子に乗って、月1回しか発生しない2番の作業もPower Automateを使って自動化します。

※Power Automateのフローの全体像を見たい方は記事末の **まとめ** 参照

# 対応策
## 特定の名前のファイルがSharePointに新規にアップロードされたらslackで通知を出す
お客さんから来月のスケジュール表をもらったあと、内部で整形してSharePointにアップロード→作業担当者に確認依頼を出すという作業が発生します。
今回はSharePointの特定のフォルダに対象のファイルがアップロードされたら、こんな感じ↓のメッセージがslackで出るようにしたいと思います。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/bd9e49d5-447c-98d6-760d-a9ba97ba2bd7.png">

>「■」がファイル格納先フォルダへのハイパーリンクになっている
<br>

### 1\. 「フォルダーにファイルが作成されたとき」というトリガーの作成
Power Automateで「フォルダー内にファイルが作成されたとき（非推奨）」というトリガーを設定します。


:::note
**特定のsharepointフォルダへのファイルのアップロードを検知する**
「フォルダー内にファイルが作成されたとき（非推奨）」を選択し、任意の「サイトのアドレス」と「フォルダー名」を指定します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/90992d90-a6b5-f0fd-0b96-d2bcd1a4d42c.png">!
>今回は「00_運用スケジュール」という名前のフォルダを指定
:::

<br>

### 2\. ファイル名を作成する
先ほど指定した「00_運用スケジュール」フォルダには、基本的には毎月一回、翌月のスケジュール表のみがアップロードされるのですが、万一ほかのファイルがアップロードされたときにいちいちslackの通知が出てしまうのは混乱を招きます。そこで、特定の名前のファイルがアップロードされたときのみ通知が出るという仕様にしたいと思います。

ということで、アップロードを検知したいファイル名をフロー上で保持できるようにしましょう。

:::note
**翌月の月数の作成**
スケジュール表ファイルは```12月分【こねこね連携】受け渡しデータ```というような名前をしており、「12」月部分には翌月の月数が入ります。
そこでまず、翌月の月数を取得したいと思います。


**①現在時刻（日本標準時）の取得**
まずフローがトリガーされた時の日時を取得します。
日本時間を取得したいので```タイムゾーンの変換```というアクションを追加します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/28dbcd09-5951-4791-a7b1-e24862ea3522.png">!

「基準時間」の欄は
```
utcnow()
```
という関数を指定することで、フローがトリガーされたときの協定世界時を取得します。
「変換元のタイムゾーン」に「（UTC）協定世界時」を、「変換先のタイムゾーン」に「（UTC+9:00）大阪、札幌、東京」を指定することで、トリガー時点での日本標準時を取得できます。
「書式設定文字列」にはいったん「短い形式の日付パターン」を指定して、後の作業で月数のみを取り出します。


<br>

**②時間への追加**
今回は翌月の月数を取得したいので、先ほど取得したトリガー時点の日時に一か月を追加します。
```時間への追加```というアクションを追加して、「基準時間」に先ほど①で取得した日時を、「間隔」に「1」を、「時間単位」に「ヶ月」を指定します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/3647d557-cff7-be13-a958-c009300cb132.png">!

>例えば2023/11/27にトリガーされたとすると```2023/12/27```という値が出力される

<br>

**③翌月の月数の抽出**
続いて、日時から月数のみを抽出しましょう。
```データ操作の「作成」```アクションを追加し、入力欄に以下を記載します。
```
formatDateTime(body('時間への追加'),'%M')
```
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/ca769e7f-ee29-617f-3977-d9e35a69a343.png">

これで②の出力から月数のみをうまく抽出できます。

:::

以上で、例えば今月が11月であれば翌月の月数である「12」という数値を取得できました。
続いて、この数値を使用してファイル名を作成しましょう。

:::note
**翌月の数字を入れたファイル名の作成**
```変数の「変数を初期化する」```アクションを追加し、「名前」に適当な変数名を、「種類」に「文字列」を、そして「値」に以下を指定します。
```
concat(outputs('翌月'),'月分【こねこね連携】受け渡しデータ')
```
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/069d1c34-c501-d664-609c-8cac976f2c08.png">
:::

これで、アップロードを検知したいファイル名 **「MM月分【こねこね連携】受け渡しデータ」** を作成できました。

<br>

### 3\. slackメッセージの投稿
続いて、先ほど作成した翌月分のスケジュール表ファイルがアップロードされたときに、slackに通知を出すフローを作成しましょう。

:::note
**条件の設定**
**①ファイルのメタデータの取得**
まず、```パスによるファイル メタデータの取得```アクションを追加し、フローをトリガーしたファイルのメタデータを取得します。
これを設定することで、ファイルの名前やリンクを取得できるようになります。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/39c77673-0e92-25b2-8c13-0b71ae448275.png">!
>「ファイルのパス」欄にフローをトリガーしたファイルの「ファイルパス」を指定する

<br>

**②ファイル名の一致条件の設定**
①で取得したファイル名と、先ほど **2** で作成したファイル名が一致するかを判定する条件を作成します。

```条件```アクションを追加し、それぞれの値に先ほど①で取得したメタデータの「ファイル名」と **2** で作成したファイル名を指定します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/1377e6f0-d231-e4d3-6243-8e7c4e851640.png">

>今回はファイル名の完全一致ではなく「次の値を含む」条件を指定し、アップロードされたファイル名の多少の違いは厳密に判定しないことにしている
:::

条件を設定することで、以下のフローはいま設定した条件が満たされた場合（Trueの場合）のみに起動するようになりました。

:::note
**slackにメッセージを投稿**
最後にslackに送るメッセージを整形します。
```メッセージの投稿(V2)```のアクションを追加し、任意のチャンネル名・メッセージテキストを入力します。

今回は、途中で作成した翌月の月数と、スケジュール表を毎月格納しているフォルダへのリンクをハイパーリンクにして挿入しています。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/897ceafa-85ac-ae12-d7ea-c055ed210d3d.png">

>```<リンク|ハイパーリンクにしたい文字列>```という形式でハイパーリンクを設定可能
:::

これで、ファイルをSharePointフォルダにアップロードするだけで作業担当者にスケジュール確認を依頼することができるようになりました！

<br>

# まとめ
全部つなげるとこのようなフローになります↓

![全体フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615890/c863140f-c7dc-58ea-74be-c17928126000.png)

これで、こねこね連携作業の一部をうまく自動化することができました！

余談ですが、今回は思ったよりもうまく自動化できなかったというのが正直な感想です。
本当は「スケジュール表が添付されているメールの受信」をトリガーにして、「添付ファイルの保存＞zip解凍＞sharepointへのアップロード＞slackへのメッセージ投稿＞返信メールの下書き作成」まで一気通貫でできると良かったのですが、添付ファイルにパスワードロックがかかっているので断念しました。

しかし、このほかに作成したPower Automateのフローやpyファイルなどを組み合わせることで、こねこね連携にかける時間を最小限にしたいという自分の怠惰な欲求はある程度満たされることとなりました。

めでたしめでたし。

<br>

# 作成にあたってお世話になったWEBページ
1\. [Power Automateで時間を扱うときに知っておくべきこと。時間のズレと変換について。](https://www.teijitaisya.com/powerautomate-datetime/#google_vignette)
2\. [[Power Automate]日付・日時の取得、変換、比較方法を徹底解説](https://techuplife.tech/powerautomate-datetime/)
3\. [Power Automate 「フォルダー内にファイルが作成されたとき(SharePoint)」トリガー](https://blog-tips.sekenkodqx.jp/2021/01/08/power-automate-trigger-when-a-file-is-created-in-a-folder-sharepoint/)
4\. [Power Automate で 凝った Slack メッセージを投稿する](https://qiita.com/numa5h0/items/c9baa2632485a3d1b4d5)