Oh! 365 blog

主に SPO や Teams に関する情報を発信しています。

【SPO】SharePoint Online の予定表リストに祝日を重ねわせる方法 (PowerShell スクリプトを利用)

会社では Microsoft Teams のチームのタブに SharePoint Online の予定表リスト (予定表アプリ) を追加し、休暇の管理として使っています。ふと祝日が考慮されていないことに気づき、祝日の予定表をインポートする方法を探しました。

しかし、Exchange Online や Outlook の予定表を重ねれば良いかと思っていましたが、どうやらそれは実現できないようでした。

docs.microsoft.com
answers.microsoft.com

SharePoint 上の予定表リスト上に、別の予定表リストを重ね合わせすることはできるため、祝日のみがイベントとして保存されている予定表リストがあれば実現できるのですが、Google CalendarOutlook の予定表などをインポートすることができないようでした。

1 年間で 10 数回の祝日しかないので手入力でイベントを作ればいいかとも思いましたが、何度も行う可能性も考えるととても面倒になったので、既存の予定表リストに祝日のイベントを作成する PowerShell スクリプトを書いてみました。せっかくなので備忘録として残しておきます。

記事のスクリプトで実現できること

指定した予定表リストに祝日のイベントを作成します。祝日のイベントを追加した予定表リストを、メインの予定表リストに重ね合わせることで、祝日のイベントを反映させます。

f:id:keisuke-blog:20210126221738p:plain
予定表リストに祝日用の予定表を重ね合わせている

スクリプト

PnP PowerShell を使用した PowerShell スクリプトです。

param(
    [parameter(Mandatory=$true,Position=0)]
    [String]$webUrl,
    [parameter(Mandatory=$true,Position=1)]
    [string]$calendarListName
)

# Install PnP PowerShell Module.
### Install-Module SharePointPnPPowerShellOnline

# Get Japan holidays list (CSV) from Cabinet Office
$holidayList = Invoke-WebRequest -uri "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
$holidayListUTF8 = [System.Text.Encoding]::GetEncoding("Shift_JIS").GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($holidayList.Content))

Connect-PnPOnline -url $webUrl -UseWebLogin

$currentYear = Get-Date -Format "yyyy"
foreach($line in $holidayListUTF8 -split "`r`n")
{
    if($line.StartsWith($currentYear))
    {
        [datetime]$date = $line.split(",")[0]
        $title = $line.split(",")[1]
        $startDate = $date.ToString("yyyy/MM/dd 00:00")
        $endDate = $date.ToString("yyyy/MM/dd 23:59")
        
        $result = Add-PnPListItem -list $calendarListName -Values @{ "Title"=$title; "EventDate"=$startDate; "EndDate"=$endDate; "fAllDayEvent"=$True}

        Write-Host $title, $date.ToString("yyyy/MM/dd")
    }
}

祝日について

内閣府の HP にその年の祝日が公開されています。また、CSV ファイルとしてダウンロード可能です。PowerShell スクリプト内で Invoke-WebRequest コマンドを使用して CSV ファイルから祝日の一覧を取得しています。2021 年のようにオリンピックの影響で祝日が変則的になる可能性があるため、内閣府の HP の祝日を参照するのが最も良いと判断しました。

スクリプトにより追加される祝日について

内閣府CSV では、1955 年から現在 (今年なら 2021 年) までの祝日の一覧が格納されています。過去の祝日は不要取りこまないよう、 PowerShell を実行する年の祝日のみ作成するようにしています。

例) 2021 年に実行すると 2021 年の祝日のみをイベントとして追加する。

スクリプト内の $currentYear 変数を翌年 (2022) に変更すれば翌年の祝日のみを取り込んでくれます。例えば 2021 年のうちに内閣府の公開している CSV ファイルに翌年 (2022) の祝日が反映されていたら、変数 2022 に変えて実行すれば、2022 年の祝日のみが追加されます。内閣府の HP にアクセスし、翌年の祝日が公開されていないかを確認してください。
CSV のリンクが変わってしまったら、修正するか、外部サイトなどで公開されているものを CSV ファイルとして手動で保存するのもありです。

実行方法

1) 事前に祝日のイベントを作成する新規予定表リスト (例. 祝日用カレンダー) を作成しておきます。

f:id:keisuke-blog:20210117003508p:plain

2) PowerShell を起動します。
3) PnP PowerShell モジュールをインストールします。

Install-Module SharePointPnPPowerShellOnline


4) 上述のソースコードをメモ帳などにコピーして ps1 ファイルとして保存します。
(例. AddJPNHolidays.ps1)

5) 以下のように実行します。

.\AddJPNHolidays.ps1 -webUrl https://<tenant>.sharepoint.com/sites/sitename -calendarListName "祝日用カレンダー"

※ 実行時に資格情報を求めるポップアップが起動するため、指定したサイトにアクセス権を持つユーザーの資格情報を入力します。

  • -webUrl: 祝日用に作成した予定表リストがあるサイト URL
  • -calendarListName: 祝日用に作成した予定表リストの表示名

実行結果例

実行に成功すると、以下のように予定表に追加された祝日が列挙されます。

f:id:keisuke-blog:20210117004958p:plain

予定表リストにアクセスし、[すべてのイベント] ビューを見ると、祝日用のイベントが作成されていることが確認できます。

f:id:keisuke-blog:20210117005236p:plain

メインの予定表に祝日用の予定表を重ね合わせれば、祝日の予定を反映することができます。
重ね合わせの方法は下記記事をご参考ください。

support.microsoft.com
※ 記事中の Exchange 予定表の部分は SharePoint Online では利用できません。

おわりに

自由にパブリックな予定表をインポートできればよかったのですが、PowerShell スクリプトを使用する方法となってしまいました。もしかしたらもっと簡単な方法があるかもしれないので、もしいい方法があればコメントお待ちしております。

SharePoint 上の予定表リスト上ではなくて、個人の予定表で祝日が参照できれば良い場合は、以下の記事のように個人の Outlook と同期される方法が良いですね。

a-zs.net


スクリプトで使用している PnP については過去の記事にまとめています。
www.samurainote.com

今回の投稿は以上です。