Teamsのリアクションをカウントしてみよう ~PowerShell 編~

オフィスワーク モダナイズ への道

 前回紹介しましたPower AutomateによるTeamsのリアクションのカウント方法ですが、アクセス権のあるTeamsのチームとチャネルを指定した上でメッセージに対してのリアクション情報の取得に限定されています。また、対象となるメッセージやリアクション数多くなると、Apply to Eachでの処理速度が難点となります。今回はこれらの欠点を補うべくPowerShellで同様にTeamsのリアクションをカウントする方法を紹介します。

Teamsへの投稿

前回同様に一般的なチームの投稿の他にプライベートチーム、プライベートチャネルを用意してそこでメッセージを投稿してリアクションを付けています。

さらに、管理者がメンバーになっていないチームも用意して、メッセージを投稿してリアクションを付けています。

コード全体

全体としてはこのようなコードになります。

1: $Account = "<アカウント>"
2: $Password = ConvertTo-SecureString 'パスワード' -AsPlainText -Force
3: $Credential = New-Object System.Management.Automation.PSCredential $Account, $Password
4:
5: Install-Module MSOnline -Force
6: Install-Module -Name MicrosoftTeams -Force
7: Install-Module Microsoft.Graph -Force
8:
9: Connect-MsolService -Credential $Credential
10: Connect-MicrosoftTeams -Credential $Credential
11:
12: Select-MgProfile -Name "beta"
13: $Scopes = @(
14: Group.ReadWrite.All,
15: GroupMember.ReadWrite.All,
16: TeamsApp.ReadWrite.All,
17: TeamsAppInstallation.ReadWriteForTeam,
18: TeamsAppInstallation.ReadWriteSelfForTeam,
19: TeamSettings.ReadWrite.All,
20: TeamsTab.ReadWrite.All,
21: TeamMember.ReadWrite.All,
22: ChannelSettings.Read.All, 
23: Channel.ReadBasic.All, 
24: ChannelSettings.ReadWrite.All
25: )
26: Connect-MgGraph -Scopes $Scopes
27:
28: $Datas = @()
29: $Users = Get-MsolUser
30: $TargetTeams = Get-Team | ? {($_.DisplayName -eq "test202206") -Or ($_.DisplayName -eq "プライベートチーム202206") -Or ($_.DisplayName -eq "佐藤のチーム")}
31: $TargetTeams | % {
32:      $TeamId = $_.GroupId
33:      Get-MgTeamChannel -TeamId $_.GroupId | % {
34:           $ChannelId = $_.Id
35:           $ChannelName = $_.DisplayName
36:           $MembershipType = $_.MembershipType    
37:           Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -Top 1000 | ? {$_.LastModifiedDateTime -ge "2022/6/1"}  | % {
38:                 $MessageSubject = $_.Subject
39:                 $MessageTime = $_.LastModifiedDateTime
40:                 $From = $_.From.User.DisplayName
41:                 $_.Reactions | % {
42:                      $UserId = ($_.User).User.Id
43:                      $UserName = ($Users | ? {$_.ObjectId -eq $UserId}).DisplayName
44:                      $ReactionTime = $_.CreatedDateTime
45:                      $Reaction = $_.ReactionType                 
46:                      $objPs = New-Object PSCustomObject | Select ChannelName, MembershipType, MessageSubject, MessageTime, From, Name, ReactionTime, Reaction
47:                      $objPs.ChannelName = $ChannelName
48:                      $objPs.MembershipType = $MembershipType
49:                      $objPs.MessageSubject = $MessageSubject
50:                      $objPs.MessageTime = $MessageTime
51:                      $objPs.From = $From
52:                      $objPs.Name = $UserName
53:                      $objPs.ReactionTime = $ReactionTime
54:                      $objPs.Reaction = $Reaction
55:                      $Datas += $objPs
56:                 }     
57:           }
58:      }
59: }
60:
61: $Datas | Export-Csv -NoTypeInformation "C:\Data\TeamsReactions.csv" -Encoding UTF8

PowerShellでリアクション情報を取得

では早速コードを書いてゆきましょう。
最初に資格情報です。Microsoft365の管理者アカウントとパスワードを指定します。

1: $Account = "<アカウント>"
2: $Password = ConvertTo-SecureString 'パスワード' -AsPlainText -Force
3: $Credential = New-Object System.Management.Automation.PSCredential $Account, $Password

今回はMicrosoft365、TeamsとGraphのモジュールを利用するので、それぞれ読み込みます。
MSOnlineモジュールはMicrosoft365全般についての情報取得に役立ちます。今回ユーザー一覧を取得するために利用します。
MicrosoftTeamsモジュールはチーム一覧など基本的なTeamsの操作や情報取得のコマンドを提供しています。
Microsoft.GraphモジュールはMicrosoft365などのクラウドサービスのAPIを簡単に利用できるサービスで、PowerShjellからでも利用できるようにモジュールが提供されています。Teamsのコマンドで足りないところはこちらで補います。

5: Install-Module MSOnline -Force
6: Install-Module -Name MicrosoftTeams -Force
7: Install-Module Microsoft.Graph -Force

こちらはMicrosoft.Graphを使って、PowerShellからアイテム分析情報を利用するためのおまじないです。アイテム分析情報コマンドはベータ版でのみ使用可能となるため、これを呼び出す前にベータ版プロフィールに切り替えます。

12: Select-MgProfile -Name "beta"

Microsoft.Graphを使ってリソースにアクセスする範囲と権限を指定します。これによって全てのチームやチャネルの投稿から情報を取得することができるようになります。

13: $Scopes = @(
14: Group.ReadWrite.All,
15: GroupMember.ReadWrite.All,
16: TeamsApp.ReadWrite.All,
17: TeamsAppInstallation.ReadWriteForTeam,
18: TeamsAppInstallation.ReadWriteSelfForTeam,
19: TeamSettings.ReadWrite.All,
20: TeamsTab.ReadWrite.All,
21: TeamMember.ReadWrite.All,
22: ChannelSettings.Read.All, 
23: Channel.ReadBasic.All, 
24: ChannelSettings.ReadWrite.All
25: )
26: Connect-MgGraph -Scopes $Scopes

リアクション情報からユーザーIDが取得できるので、ユーザー名を参照するために、Get-MsolUserコマンドでユーザー一覧情報を取得しておきます。

29: $Users = Get-MsolUser

Get-Teamコマンドでは全てのチームを取得できますが、情報を収集する体調チームを絞ることもできます。今回は3つのチームに限定しています。

30: $TargetTeams = Get-Team | ? {($_.DisplayName -eq "test202206") -Or ($_.DisplayName -eq "プライベートチーム202206") -Or ($_.DisplayName -eq "佐藤のチーム")}

いくつかForEachがありますので、それぞれ見てゆきましょう。

31: $TargetTeams | % {
32:      $TeamId = $_.GroupId
33:      Get-MgTeamChannel -TeamId $_.GroupId | % {
34:           $ChannelId = $_.Id
35:           $ChannelName = $_.DisplayName
36:           $MembershipType = $_.MembershipType    
37:           Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -Top 1000 | ? {$_.LastModifiedDateTime -ge "2022/6/1"}  | % {
38:                 $MessageSubject = $_.Subject
39:                 $MessageTime = $_.LastModifiedDateTime
40:                 $From = $_.From.User.DisplayName
41:                 $_.Reactions | % {
   
  ~中略~
   
56:                 }     
57:           }
58:      }
59: }

31行目 メッセージを取得する対象のチームすべてに対して実行します。
33行目 各チーム内の全てのチャネルに対して実行します。
37行目 チャネル内のメッセージを取得します。
-Top オプションを指定しない場合は既定で20投稿まで取得します。日付を指定してフィルタすることも可能です。
41行目 リアクション情報を取得します。複数のリアクションとなるのでこちらもForEachで全て取得します。

事前に Get-MsolUser コマンドで取得したユーザーリストからユーザーIDをキーとしてユーザー名を抽出しています。

43: $UserName = ($Users | ? {$_.ObjectId -eq $UserId}).DisplayName

PSCustomObject を作成してリアクションをカウントするために必要な情報を格納します。

46: $objPs = New-Object PSCustomObject | Select ChannelName, MembershipType, MessageSubject, MessageTime, From, Name, ReactionTime, Reaction

リアクション情報を配列変数に格納します。

55: $Datas += $objPs

最後に配列をcsvに出力します。

61: $Datas | Export-Csv -NoTypeInformation "C:\Data\TeamsReactions.csv" -Encoding UTF8

実行結果

実行してみましょう。
csvファイルとして、リアクションの情報が出力されました。

 以上が、PowerShellによるTeamsのリアクションカウント方法となります。取得したデータはリアクションの集計だけではなく、「承認の代わり」にしたり、重要な投稿を「誰がまだ未読か」などデータとして取得・集計することで色々と活用方法がありそうです。

実行してみると分かると思いますが、前回のPower Automateで同様のフローを作成しましたが、メンバーではないチームの投稿や、プライベートチャネルの投稿についても情報が取得できています。また、実行速度も明らかにPowerShellで処理した方が速いのも確認できると思います。

 Power Automateは手軽に開発できる簡易版のツールとしては最適です。一方大量のデータに対しての情報処理などはやはりPowerShellなどプログラミングアプローチが圧倒的に優位となります。利用シーンに合わせて、どちらでも対応できるスキルを身に着けておくと活躍の場が広がりそうです。

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネットグループ株式会社

1999年6月GMOインターネットグループ株式会社に入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。「マイクロソフトMVPアワード」を15度受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW