Power Automate + Forms + Onedrive + Excel online で作る勤怠システム（Power Automate 編）

# 目次
- [はじめに](#はじめに)
- [フロー](#フロー)
- [フロー詳細](#フロー詳細)
    - [① 新しい応答が送信されるとき](#①新しい応答が送信されるとき)
    - [② 応答の詳細の取得](#②応答の詳細の取得)
    - [③ 作成](#③作成)
    - [④ フォルダ内のファイル検索](#④フォルダ内のファイル検索)
    - [⑤ タイムゾーンの変換](#⑤タイムゾーンの変換)
    - [⑥ IDの初期化（変数を初期化する）](#⑥IDの初期化（変数を初期化する）)
    - [⑦ IDの設定（変数の設定）](#⑦IDの設定（変数の設定）)
    - [⑧ テーブル名の初期化・⑨ テーブル名の設定](#⑧テーブル名の初期化・⑨テーブル名の設定)
    - [⑩ 表に行を追加](#⑩表に行を追加)
- [リンク](#リンク)
- [参考文献](#参考文献)

# はじめに
　本記事を見つけて頂き、ありがとうございますm(_ _)m
　本記事では、[Power Automate(web) + Forms + Onedrive + Excel online で作る勤怠入力システム](https://qiita.com/crispy_1741/items/58d9ffd9172cc48f8d59)のPower Automateの部分についてです。
　ナンバリングとしては本記事が最後です。
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/f3a24483-9d25-004e-79ad-ead6500fa3f2.png)

# フロー
　図の通りです。
　（もっとスッキリ、きれいな並びがあるかもです）
![qiita_PA_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/90edaf0f-4701-c9f2-4150-fc1622570abe.png)

# フロー詳細
フロー図より降順で解説します。

#### ①新しい応答が送信されるとき
- 勤怠入力フォームに回答が入るとフローが動きます。
![qiita_PA_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/77814a92-1571-5422-620f-b6af0a077ca7.png)

#### ②応答の詳細の取得
- ①トリガーとなったFormsの回答内容を取得します。
![qiita_PA_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/d5e4b496-bfe9-b1ae-4622-645c32bb69c0.png)

#### ③作成
- 関数を用いて、回答したユーザー名（Microsoftアカウント）から社員番号を抽出します。
![qiita_PA_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/1ebd6a5e-477f-b2b4-fd90-d5fdd1cd2d55.png)

- 関数は以下の通りです。
```
substring(outputs('応答の詳細を取得する')?['body/responder'], 2, 4)
```
- 上記のsubstring関数は、所定の位置よりカウントされる文字を抽出します。
    - 今回は「ユーザー名の3文字目から4文字を取得」しています。
    - 本記事ではMicrosoftアカウントを「ABxxxx@onmicrosoft.com」設定しています。そのためAB「**xxxx**」@...つまり社員番号を取得しています。
    - 「3文字なのに2」なのは「1文字目＝0」となっているためです。
- また、「outputs('応答の詳細を取得する')?['body/responder']」は「動的値の responsder's email」 のことです。

#### ④フォルダ内のファイル検索
- ③で作成した社員番号を用いてOndedrive内にある同社員番号をファイル名に持つタイムシート（Excel）を検索します。
![qiita_PA_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/6b9fd05a-5067-c4e8-62ba-492a6b925310.png)

#### ⑤タイムゾーンの変換
- 入力時刻を取得します。この時刻はタイムシートにおける更新時刻のことです。
- Automateはデフォルトでは日本時間ではないので変換する必要があります。
![qiita_PA_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/04b61db4-d3cb-e9ac-3031-998add16211a.png)

#### ⑥IDの初期化（変数を初期化する）
- ④で検索したファイルのID（文字が不規則に羅列されているパス）を格納する変数を作成します。
- 変数に格納しなくても大丈夫そうですが、各アクションで生成されるものが文字列か数字（整数or実数）なのかよく分からないので、関数を用いて確実かつ都合のいいように変換します。
- 図のように設定ください。
![qiita_PA_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/cfcf310d-514b-bddd-781b-a528eb5fca43.png)

#### ⑦IDの設定（変数の設定）
- ⑥で作成した変数に④で検索したファイルのIDを格納します。
- apply to eachは自動的に生成されるので、いきなり設定を行って大丈夫です。
![qiita_PA_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/8950c3f5-e1cd-5edb-7f15-414c6e4b018c.png)

#### ⑧テーブル名の初期化・⑨テーブル名の設定
- ⑩でテーブルを選択する項目があるので、テーブル名を格納する変数を初期化し、設定します。
- ⑩において入力するファイルが決まっていればテーブルの選択が可能なのですが、今回は「動的=決まっていない」ので**入力が可能である変数**をねじ込みます。変数だけど固定値、偽変数と呼んでます。
![qiita_PA_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/989b4a4a-3c68-fc09-ceea-962837728c47.png)
![qiita_PA_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/58f9b32c-e8d6-b3f1-c7dd-cfc2ad3eaad5.png)

#### ⑩表に行を追加
- ⑦をより編集するタイムシート及びテーブルを選択します。
- テーブル欄が「カスタム値」となっていますが、中身は関数です。選択し、鉛筆マークをクリックすると動的な値を入れることができます。
![qiita_PA_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167400/cf2f16e7-3878-3dbd-8db4-1f3c4eb00bd1.png)

- テーブルが定まっていない場合、挿入したい列（項目）をAutomateが参照してくれません。なので当て振りを行います。
    - 記入方法は以下の通りです。
```
{ 
 "列名1":動的な値 or 固定値,
・
・
・
"列名n":動的な値 or 固定値,
}
```


以上で、automateは完成です。

# まとめ
　今回はAutomateについての内容となりました。今回で記事は終了となります。少しでも参考になれば嬉しいです。
　また、本内容に限らず一度に全体を作成し動かそうとすると上手くいかないことがあるので、トリガーを手動にし一部のみを動かすフローを作りテストすることをオススメします。

# 余談
#### OnederiveとSharepointの違い
　OnedriveとSharepointのファイル・フォルダ検索は仕様が異なります。Onedriveは階層を深堀りした検索が行えるのですが、Shrepointはできませんでした。
　ID（パス）の仕様が異なるそうで、そのせいでSharepointでは位置フォルダ内でしか検索が行なえませんでした。使い方によっては問題はないと思いますが、個人フォルダをつくりその中のファイルを検索した場合をSharepointでは行えないのでご注意ください。
※もし、実は可能であれば詳しい方がいましたらご教授頂けると助かります。

#### automateの処理時間
　Excelに使用されている関数に左右されます。一度に多くの方が利用するとなれば様々な関数を変えて実験することをオススメします。（本フローは30秒ほどかかります。）
　特にFilter関数を用いた場合ですと、なんとタイムアウトしました...。（式の作り方にもよりますが）

# リンク
- [準備・仕組み 編](https://qiita.com/crispy_1741/items/58d9ffd9172cc48f8d59)
- [Excel 編（タイムシート）](https://qiita.com/crispy_1741/items/6db3cdfe09d43c9559d3)
- [Forms 編](https://qiita.com/crispy_1741/items/745f711bb3fa80a08df8)

# 参考文献
- [【PowerAutomate】SharePoint フィルタークエリの書き方講座](https://kurattyodiary.hatenablog.com/entry/StudyspoFilterQuery)
- [[PowerAutomate]スケジュール実行が指定時間通りに起動しない場合（タイムゾーンが機能しない場合）](https://qiita.com/RYO-4947123/items/da2f30617e585ab312b0)
- [Power Automate 「表に行を追加(Excel Online (Business))」アクション](https://blog-tips.sekenkodqx.jp/2020/07/17/power-automate-action-add-a-row-into-a-table-excel-online-business/)