0
Help us understand the problem. What are the problem?

posted at

updated at

PowerAutomate: Teams 参加者レポートをCSV化して利用する

背景

社内で講義を開催したり参加した場合、研修ポイントってのが貰えます。
で Teams の参加者レポートの出番
image.png

とはいえこのままじゃ使えないので
上手く処理して、他のデータとマージできる状態にしてやれば、便利じゃないかってお話。

まぁ実際は C# でツール作ってはいるんですが、意外にいろんな用途で使いたいことがあったので、取り込みベースとして用意してみた

参加者レポート

見ると分かるけど・・以下ちょっと特殊

  • CSV といいつつ、TSV ( Tab Separated Values )
  • Header が7行ほど先頭に付いてる

image.png

検討

自動で「参加者のレポート」がダウンロード出来たら勝手に変換して通知

ってことまでやりたいと思ったけど。以下理由でダメそう

  • SharePoint にあげられるファイルではなさそう
  • スレッド検知は出来たけど、更新されることは検知出来無さそう
  • スレッド検知された時点で、レポートはない
  • F12 で確認してみたけど・・cortana.api ってなに?
    image.png

Graph API で調べると以下辺りで追っていくと取れそうな感じもする
とはいえ、起動方法が Selected Message トリガーになって面倒そうなのもあって、今回はパス

ということで、今回は簡潔に以下とする

  1. Share/OneDrive にファイルをアップロード
  2. TSV → CSV 変換

この先としては、用途毎に変換処理と、関連データをどっかに持つ必要がある・・かな。

概要

  1. 起動トリガーと、CSV Contents 取得
    1. SharePoint 版
    2. OneDrive 版
  2. TSV → CSV 変換

起動トリガーと、CSV Contents 取得

SharePoint の場合

TriggerBody() の結果そのものが FileContent なので、そのまま解析処理へ
image.png

OneDrive の場合

FileContent を取得する為に、Get File Content アクションを利用して、解析へ
image.png

TSV → CSV 変換

フローはこんな感じ

image.png

簡単に説明すると・・

  • Select Text2CSV

    • 改行コードで Split() して行分割
    • タブコードで Split() して列(Columns) 分割
    • Length はフィルター用
      image.png
  • Filter Array

    • 「会議の概要」などがファイルの先頭7行にあるので、この部分を除外。Skip(7) で飛ばしてもOK
      image.png
  • Compose Headers

    • 次の Select で Mapping する為に Header のみ保存
  • Select Mapping CSV

    • Header と、各行の列データを組み合わせて データ整形
      image.png
  • Create CSV table

    • CSV 構造を元に Table 生成
      image.png

フロー

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?