Teams の祝日設定は手動登録…
Teams の通話機能、いわゆる Teams Phone を導入して、それぞれのメンバーが会社の電話番号で Teams から外線を発信することはできたけど、いざ会社のお休みの日にはメッセージ流すように設定していたら祝日は手動で設定するしかなかったのよね…(自動化方法あるのかもしれないけど、調べた限りなかった)
スクリプトでエクスポートとインポートはできそうだと言うことは分かったので、じゃあインポート用の CSV 作ってどこまで自動化できるか検討してみようと始まった挑戦です。
最初に作り始めたころはほとんど情報もなかったのですが、この記事を書こうと思って改めて調べたら同じようなことをやっていてコードもきれいでそのまま Teams にインポートまでしてしまう PowerShell コードが記載されていたのでコード的には無駄になってしまった感がありますが、私の目的はすべて自動化することまでが目標なのでとりあえずこのまま検討を続けようと思っています。
ローカルで PowerShell 動かして CSV 作ってインポートだと最低限年1回自動で動作するローカルの環境が必要で、 Windows 等が常に稼働しているような状況が必要になってしまうので、できるだけクラウド上で完結できることを目指しています。ただし、現状では解決策なしではあります。
現状検討している内容
- PowerShell のクラウド実行の方法( Azure cloud Shell ?)
- PowerAutomate → 単体では現状無理( PowerShell 以外のスクリプト可能性?)
Teams の祝日をエクスポートする
とりあえず Teams の管理センター上で作成した休日の設定が CSV 上でどのような形式になっているのか調査しました。
まずはターミナルから Teams PowerShell に接続します。
PS > $credential = Get-Credential
PowerShell credential request
Enter your credentials.
User: user@contoso.com
Password for user@contoso.com: ****************
PS > Connect-MicrosoftTeams -Credential $credential
Account Environment Tenant TenantId
------- ----------- ------ --------
user@contoso.com AzureCloud 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000
次に祝日のファイルをエクスポートするための自動応答の ID を取得してみます。
PS > Get-CsAutoAttendant
Identity : 00000000-0000-0000-0000-000000000000
TenantId : 00000000-0000-0000-0000-000000000000
Name : 事業部ルーティング
LanguageId : ja-JP
VoiceId : Female
DefaultCallFlow : 事業部ルーティング Default call flow
Operator :
TimeZoneId : Tokyo Standard Time
VoiceResponseEnabled : False
CallFlows : 事業部ルーティング After hours call flow, 祝日
Schedules : After hours 事業部ルーティング, 2025年祝日
CallHandlingAssociations : AfterHours(1), Holiday(1)
Status :
DialByNameResourceId :
DirectoryLookupScope :
ApplicationInstances : {00000000-0000-0000-0000-000000000000}
AuthorizedUsers : {}
HideAuthorizedUsers : {}
…
作成している自動応答の数だけ並んでしまうので、祝日ファイルがひとつだけなら名前を指定して取得しても大丈夫。
PS > Get-CsAutoAttendant -Name "総務ルーティング"
Identity : 00000000-0000-0000-0000-000000000000
TenantId : 00000000-0000-0000-0000-000000000000
Name : 総務ルーティング
LanguageId : ja-JP
VoiceId : Female
DefaultCallFlow : 総務ルーティング Default call flow
Operator :
TimeZoneId : Tokyo Standard Time
VoiceResponseEnabled : False
CallFlows : 総務ルーティング After hours call flow, 祝日
Schedules : After hours 総務ルーティング, 2025年祝日
CallHandlingAssociations : AfterHours(1), Holiday(1)
Status :
DialByNameResourceId :
DirectoryLookupScope :
ApplicationInstances : {00000000-0000-0000-0000-000000000000}
AuthorizedUsers : {}
HideAuthorizedUsers : {}
これで祝日ダウンロードに必要な ID が取得できたので、実際にダウンロードしてみます。
PS > $bytes = Export-CsAutoAttendantHolidays -Identity "00000000-0000-0000-0000-000000000000"
WARNING: Please dump the generated byte-array output to disk as a CSV file (refer to the MSDN documentation of the cmdlet for assistance).
PS > [System.IO.File]::WriteAllBytes("C:/Users/user_name/Downloads/Holidays.csv", $bytes)
実際にダウンロードされたファイルの中身はこんな感じです。
Name,StartDateTime1,EndDateTime1,StartDateTime2,EndDateTime2,StartDateTime3,EndDateTime3,StartDateTime4,EndDateTime4,StartDateTime5,EndDateTime5,StartDateTime6,EndDateTime6,StartDateTime7,EndDateTime7,StartDateTime8,EndDateTime8,StartDateTime9,EndDateTime9,StartDateTime10,EndDateTime10,StartDateTime11,EndDateTime11,StartDateTime12,EndDateTime12,StartDateTime13,EndDateTime13,StartDateTime14,EndDateTime14,StartDateTime15,EndDateTime15
2025年祝日,01/01/2025 00:00,04/01/2025 00:00,13/01/2025 00:00,14/01/2025 00:00,11/02/2025 00:00,12/02/2025 00:00,24/02/2025 00:00,25/02/2025 00:00,20/03/2025 00:00,21/03/2025 00:00,29/04/2025 00:00,30/04/2025 00:00,05/05/2025 00:00,07/05/2025 00:00,21/07/2025 00:00,22/07/2025 00:00,11/08/2025 00:00,12/08/2025 00:00,15/09/2025 00:00,16/09/2025 00:00,23/09/2025 00:00,24/09/2025 00:00,13/10/2025 00:00,14/10/2025 00:00,03/11/2025 00:00,04/11/2025 00:00,24/11/2025 00:00,25/11/2025 00:00,30/12/2024 00:00,01/01/2025 00:00
同じ形式の CSV ファイルを作ってみる
冒頭でも記載しましたが、コードの簡潔さ奇麗さ等すでに公開されている方がいらっしゃるので、ちゃんとしたコードがお望みならそちらをご確認ください。
そもそも CSV の吐き出し方がへたくそなのでコードがきれいではないのですが、ポイントとしては国民の祝日以外に会社が休日となる年末年始を CSV に入れ込んでいることくらいですかね…
# 今日の日付
$td = (Get-Date);
# 内閣府提供の祝日ファイルを取得する
$response = Invoke-WebRequest https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
# 文字化け対策
$dataCsv = [System.Text.Encoding]::GetEncoding("Shift_JIS").GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($response.Content) )
# 来年の祝日データだけ切り取り
$year = $td.Year + 1
$holidays = -split $dataCsv -match $year
# 配列に代入
$title = @("Name")
[string[]]$data = @("${year}年祝日")
# 12/29 ~ 1/3 は休み
$title += "StartDateTime1"
$title += "EndDateTime1"
$year = $td.Year
$data += "29/12/${year} 00:00"
$year = $td.Year + 1
$data += "04/01/${year} 00:00"
for( $i = 2; $i -lt $holidays.Count + 1; $i++ ) {
$title += "StartDateTime${i}"
$title += "EndDateTime${i}"
$days = $holidays[$i - 1].split(',')
$date = ([Datetime]$days[0]).ToString("dd/MM/yyyy 00:00")
$data += $date
$date = ([Datetime]$days[0]).AddDays(1).ToString("dd/MM/yyyy 00:00")
$data += $date
}
# 日付データをカンマ区切りに変更
$data = $data -join ", "
# タイトル情報をヘッダーとして CSV を生成しファイルとして保存
$data | ConvertFrom-Csv -Header ($title | Out-String -Stream) | Export-Csv -Path .\Holidays.csv -Encoding UTF8 -NoTypeInformation -UseQuotes Never
※ ちなみに Chat-GPT (無料版)にリファクタリングお願いしたら全然ダメダメだったのでとりあえずコードこのままで…
これでとりあえず Teams から吐き出した CSV と同等の CSV を翌年のデータとして書き出すことには成功しました。これを手動で書き戻すか、完全自動化して 12 月初めころか中旬を目途に自動で書き込む(+各事業部のルールとして設定)ことができれば目的は達成です。
Teams に手動で書き込む場合
ターミナルで Teams への接続は書き出すときと同じなので省略して、実際に書き込んでみます。
PS> $bytes = [System.IO.File]::ReadAllBytes("C:/Users/user_name/Downloads/Holidays.csv")
PS> Import-CsAutoAttendantHolidays -Identity 00000000-0000-0000-0000-000000000000 -Input $bytes
Name : 2026年祝日
DateTimeRanges : 2025/12/29 0:00:00 - 2026/01/04 0:00:00
2026/01/12 0:00:00 - 2026/01/13 0:00:00
2026/02/11 0:00:00 - 2026/02/12 0:00:00
2026/02/23 0:00:00 - 2026/02/24 0:00:00
2026/03/20 0:00:00 - 2026/03/21 0:00:00
2026/04/29 0:00:00 - 2026/04/30 0:00:00
2026/05/03 0:00:00 - 2026/05/04 0:00:00
2026/05/04 0:00:00 - 2026/05/05 0:00:00
2026/05/05 0:00:00 - 2026/05/06 0:00:00
2026/05/06 0:00:00 - 2026/05/07 0:00:00
2026/07/20 0:00:00 - 2026/07/21 0:00:00
2026/08/11 0:00:00 - 2026/08/12 0:00:00
2026/09/21 0:00:00 - 2026/09/22 0:00:00
2026/09/22 0:00:00 - 2026/09/23 0:00:00
2026/09/23 0:00:00 - 2026/09/24 0:00:00
2026/10/12 0:00:00 - 2026/10/13 0:00:00
2026/11/03 0:00:00 - 2026/11/04 0:00:00
2026/11/23 0:00:00 - 2026/11/24 0:00:00
Succeeded : True
FailureReason :
実際にインポートできたか確認してみます。
ただこの方法だと「自動応答」設定の「休日の通話フローの編集」で「休日」のリストを置き換えしないとだめですよね。

今後の完全自動化を考えると祝日設定を年別にせずにスクリプトで上書きとかできるか等も検証してみないとダメそうです。
と思ったら…インポートで使用した事業部の ID では「休日の通話フロー」が追加される形で登録されていました…

しかも、リストは追加されるけれどもそれ以外の設定は行われていないという状況…

これじゃさすがに使い物にならない…追加された方を削除して元の祝日設定のリスト設定を変更することで対応することにしますが、これ既存のリストを上書きしたらどうなるのか?も検証が必要ですね…
まとめ
ローカル端末等を利用しない完全なクラウド上だけでの祝日リスト更新までにはまだまだ課題がたくさんありますが、地道に検証して作り上げていきたいと思います。
何かヒントがありましたら是非教えてください!
