前回紹介しました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に必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(514)
-
イベント(192)
-
カルチャー(49)
-
デザイン(46)
TAG
- "eVTOL"
- "Japan Drone"
- "ロボティクス"
- "空飛ぶクルマ"
- 5G
- Adam byGMO
- AGI
- AI
- AI人財
- APT攻撃
- AWX
- BIT VALLEY
- Blade
- blockchain
- Canva
- ChatGPT
- ChatGPT Team
- Claude Team
- cloudflare
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEGYM Academy
- ConoHa
- ConoHa、Dify
- CS
- CSS
- CTF
- DC
- design
- Designship
- Desiner
- DeveloperExper
- DeveloperExpert
- DevRel
- DevSecOpsThon
- DiceCTF
- Dify
- DNS
- Docker
- DTF
- Expert
- Felo
- GitLab
- GMO AIR
- GMO AIロボティクス大会議&表彰式
- GMO DESIGN AWARD
- GMO Developers Day
- GMO Developers Night
- GMO Developers ブログ
- GMO Flatt Security
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOインターネット
- GMOインターネットグループ
- GMOクラウド]
- GMOグローバルサイン
- GMOサイバーセキュリティbyイエラエ
- GMOサイバーセキュリティ大会議
- GMOサイバーセキュリティ大会議&表彰式
- GMOソリューションパートナー
- GMOデジキッズ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOメディア
- GMOリサーチ
- GMO大会議
- Go
- GPU
- GPUクラウド
- GTB
- Hardning
- Harvester
- HCI
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kaigi on Rails
- Kids VALLEY
- KidsVALLEY
- LLM
- MCP
- MetaMask
- MySQL
- NFT
- NVIDIA
- NW構成図
- NW設定
- Ollama
- OpenStack
- Perl
- perplexity
- PHP
- PHPcon
- PHPerKaigi
- PHPカンファレンス
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- Slack
- Slack活用
- Spectrum Tokyo Meetup
- splunk
- SRE
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- vibe
- VLAN
- VS Code
- Webアプリケーション
- WEBディレクター
- XSS
- アドベントカレンダー
- イベントレポート
- インターンシップ
- インハウス
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- クリエイター
- クリエイティブ
- コーディング
- コンテナ
- サイバーセキュリティ
- システム研修
- スクラム
- スペシャリスト
- セキュリティ
- ソフトウェアテスト
- チームビルディング
- デザイン
- ドローン
- ネットのセキュリティもGMO
- ネットワーク
- ビジネス職
- ヒューマノイド
- ヒューマノイドロボット
- プログラミング教育
- ブロックチェーン
- ベイズ統計学
- マルチプレイ
- ミドルウェア
- モバイル
- ゆめみらいワーク
- リモートワーク
- レンタルサーバー
- ロボット
- 京大ミートアップ
- 人材派遣
- 出展レポート
- 動画
- 協賛レポート
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 展示会
- 応用
- 技育プロジェクト
- 技術広報
- 採用
- 採用サイトリニューアル
- 採用活動
- 新卒
- 新卒研修
- 日本科学未来館
- 映像
- 映像クリエイター
- 暗号
- 業務効率化
- 業務時間削減
- 機械学習
- 決済
- 物理暗号
- 生成AI
- 視覚暗号
- 開発生産性
- 開発生産性向上
- 階層ベイズ
- 高機能暗号
PICKUP