背景
社内で講義を開催したり参加した場合、研修ポイントってのが貰えます。
で Teams の参加者レポートの出番
とはいえこのままじゃ使えないので
上手く処理して、他のデータとマージできる状態にしてやれば、便利じゃないかってお話。
まぁ実際は C# でツール作ってはいるんですが、意外にいろんな用途で使いたいことがあったので、取り込みベースとして用意してみた
参加者レポート
見ると分かるけど・・以下ちょっと特殊
- CSV といいつつ、TSV ( Tab Separated Values )
- Header が7行ほど先頭に付いてる
検討
自動で「参加者のレポート」がダウンロード出来たら勝手に変換して通知
ってことまでやりたいと思ったけど。以下理由でダメそう
- SharePoint にあげられるファイルではなさそう
- スレッド検知は出来たけど、更新されることは検知出来無さそう
- スレッド検知された時点で、レポートはない
- F12 で確認してみたけど・・cortana.api ってなに?
Graph API で調べると以下辺りで追っていくと取れそうな感じもする
とはいえ、起動方法が Selected Message トリガーになって面倒そうなのもあって、今回はパス
ということで、今回は簡潔に以下とする
- Share/OneDrive にファイルをアップロード
- TSV → CSV 変換
この先としては、用途毎に変換処理と、関連データをどっかに持つ必要がある・・かな。
概要
- 起動トリガーと、CSV Contents 取得
- SharePoint 版
- OneDrive 版
- TSV → CSV 変換
起動トリガーと、CSV Contents 取得
SharePoint の場合
TriggerBody() の結果そのものが FileContent なので、そのまま解析処理へ
OneDrive の場合
FileContent を取得する為に、Get File Content アクションを利用して、解析へ
TSV → CSV 変換
フローはこんな感じ
簡単に説明すると・・
-
Select Text2CSV
-
Filter Array
-
Compose Headers
- 次の Select で Mapping する為に Header のみ保存
-
Select Mapping CSV
-
Create CSV table
フロー
SharePoint 側の Select Text2CSV 以下のサンプル
OneDrive で使うときは、以下修正
- Select Text2CSV での TriggerBody() のところを、FileContent アクションへ
変更前
@{split(triggerBody(), decodeUriComponent('%0A'))}
変更後
@{split(body('Get_file_content_CSV'), decodeUriComponent('%0A'))}
{"id":"2347bef4-bc10-4b78-8919-ebb5c21d15a7","brandColor":"#8C3900","connectionReferences":{"shared_sharepointonline":{"connection":{"id":"/providers/Microsoft.PowerApps/apis/shared_sharepointonline/connections/shared-sharepointonl-15e7a58d-6555-418d-a955-a6b286a76a7b"}}},"connectorDisplayName":"Control","icon":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KIDxwYXRoIGQ9Im0wIDBoMzJ2MzJoLTMyeiIgZmlsbD0iIzhDMzkwMCIvPg0KIDxwYXRoIGQ9Im04IDEwaDE2djEyaC0xNnptMTUgMTF2LTEwaC0xNHYxMHptLTItOHY2aC0xMHYtNnptLTEgNXYtNGgtOHY0eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo=","isTrigger":false,"operationName":"Scope","operationDefinition":{"type":"Scope","actions":{"Select_Text2CSV":{"type":"Select","inputs":{"from":"@split(triggerBody(), decodeUriComponent('%0A'))","select":{"Columns":"@split(item(), decodeUriComponent('%09'))","Length":"@length(split(item(), decodeUriComponent('%09')))"}},"runAfter":{},"metadata":{"operationMetadataId":"63fe7035-9056-40a7-bb01-fa32a4c330ec"}},"Filter_array_SkipMeetingHeader":{"type":"Query","inputs":{"from":"@body('Select_Text2CSV')","where":"@greater(item()['Length'], 2)"},"runAfter":{"Select_Text2CSV":["Succeeded"]},"metadata":{"operationMetadataId":"0f50ee20-44a4-4586-a1d3-406c14e72922"}},"Compose_Headers":{"type":"Compose","inputs":"@first(body('Filter_array_SkipMeetingHeader'))?['Columns']","runAfter":{"Filter_array_SkipMeetingHeader":["Succeeded"]},"metadata":{"operationMetadataId":"dbcfdb8c-4815-42e1-9fb5-146a995062ca"}},"Create_CSV_table":{"type":"Table","inputs":{"from":"@body('Select_Mapping_CSV')","format":"CSV"},"runAfter":{"Select_Mapping_CSV":["Succeeded"]},"metadata":{"operationMetadataId":"7dad3500-46ec-4292-b480-d6b384443c68"}},"Select_Mapping_CSV":{"type":"Select","inputs":{"from":"@skip(body('Filter_array_SkipMeetingHeader'), 1)","select":{"@{outputs('Compose_Headers')[0]}":"@item()?['Columns'][0]","@{outputs('Compose_Headers')[1]}":"@item()?['Columns'][1]","@{outputs('Compose_Headers')[2]}":"@item()?['Columns'][1]","@{outputs('Compose_Headers')[3]}":"@item()?['Columns'][3]","@{outputs('Compose_Headers')[4]}":"@item()?['Columns'][4]","@{outputs('Compose_Headers')[5]}":"@item()?['Columns'][5]","@{outputs('Compose_Headers')[6]}":"@item()?['Columns'][6]"}},"runAfter":{"Compose_Headers":["Succeeded"]},"metadata":{"operationMetadataId":"239d1bf5-05e7-4758-a7a6-8b1bc52b07a4"}}},"runAfter":{},"metadata":{"operationMetadataId":"96c01f67-ea26-406c-852f-82287c07a98b"}}}
あとがき
あとは、変換するだけ・・
なんだけど、意外に一意に簡単に紐づけて変換するのが面倒だなぁ、というのが実感
keyword
how to convert Meeting Attendance Reports TSV to CSV in Power Automate