0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Power Automate で SharePoint リストに祝祭日リストを自動生成する

Posted at

後で運用するために祝祭日リストを持っておきたい

SharePoint リストに祝祭日リストを自動生成する Power Automate のフローを作りました。 Power Automate 上で祝祭日判定するのは他のフローでも紹介している通り可能なのですが、 SharePoint リストで使用するもしくは Power Apps で使用することを想定し、まずは SharePoint リスト上に祝祭日リストを自動生成することを目指したものです。

前提条件

  • 祝祭日をカレンダーから取得しリスト化する
  • 会社の休日(年末年始等)を含ませることができるようにする
  • 一定期間で自動更新する

実装

全体の流れは以下の通り。

クリックで開く

image.png

例の通りまずはトリガーを手動実行に設定しておき、完成後に繰り返しに変更しております。なお、繰り返しの設定は 3 か月頻度です。理由は実行されていないフローは 90 日で警告が発報されさらに 30 日後にフローが停止されてしまうため 3 か月ごとの自動実行としています。
image.png

変数の設定

まずはフローに必要な各種変数を設定していきます。
「変数を初期化する」フローで「today」を設定しました。これはフロー実行時の現在の日付を取得する変数です。
image.png
値には以下のようにutcNow()関数で UTC の時刻を取得しconvertFromUtc()関数で UTC+9 の時間に変換しています。

convertFromUtc(utcNow(),'Tokyo Standard Time','yyyy-MM-ddT00:00:00')

次に「1_year_later」変数を設定しています。これは祝祭日を取得する際にフロー実行時から 1 年後の終了時間を格納しておく変数となります。
image.png
値には以下のように変数「today」からaddDays()関数で 365 日後を生成しています。おおよそ 1 年のデータが取得できればいいので、厳密に設定する必要はありません。

addDays(variables('today'),365)

次に祝祭日のデータを保管するための「holiday」変数と中間データを保管する「data」変数を配列型のアレイで用意しておきます。
image.png
最後に個別の休日を設定しておくための変数「addithion」を配列型のアレイとして用意し、値には配列としてデータを収めておきます。
image.png
今回は 2023 年から 2024 年の年末年始の予定を["休日名","日付"]の形式で複数記載しています。創立記念日等がお休みの場合にも事前に記載しておけば祝祭日リスト内に含めておくことが可能です。

Outlook から「日本の休日」を取得する

次に「イベントのカレンダー ビューの取得(V3)」フローを利用して Outlook のカレンダーから日本の休日を取得します。フロー実行者自身のカレンダーに日本の休日が設定してあることが必要になりますので、別途設定しておいてください。
image.png
「カレンダー ID 」には自身のカレンダーから「日本の休日」を選択します。「開始時刻」には「today」変数を、「終了時刻」には「1_year_later」変数を設定しておきます。詳細オプションで「並べ替え順」にstart/dateTimeを設定しておくと日付順でデータを取得できますので便利です。

祝日の配列を作成する

Outlook から取得したデータをApply to eachフローを利用しループ処理で配列に配置していきます。
image.png
Outlook から取得できるデータは以下のようになっています。

{
  "subject": "みどりの日",
  "start": "2023-05-04T00:00:00.0000000",
  "end": "2023-05-05T00:00:00.0000000",
  "startWithTimeZone": "2023-05-04T00:00:00+00:00",
  "endWithTimeZone": "2023-05-05T00:00:00+00:00",
一部省略
}

ここからstartのデータを利用しようと思います。
まずは用意していた「today」変数を再利用して祝日の日付を格納します。
image.png
値には以下のように設定しました。

formatDateTime(items('Apply_to_each(祝日の配列作成)')?['start'],'yyyy/MM/dd')

祝日のデータに自前の休日データを差し込む

年間の祝日データをループ処理させながら、間に自身で設定した休日データを挟む処理を入れていきます。 Power Automate ではソートの機能が弱いのでできるだけ最初から挟んでおいた方が楽なような気がします。
image.png
ループ処理の中に「Apply to each」フローで「addithion」変数をループ処理させます。「条件」フローを追加し条件を以下のように設定します。

items('Apply_to_each')[1] 次の値以下 「today」変数

結果がtrueだけ処理を行えばいいので「はいの場合」に「配列変数に追加」フローで「holiday」変数に値を追加します。
image.png
この時値にはカンマ区切りで以下のような 2 つの値を設定しています。

items('Apply_to_each')[0]
items('Apply_to_each')[1]

カンマも含めた数式としては入力できなかったので、数式 2 つをカンマ区切りとしています。

この後のループですでに追加したデータは省いておきたいので、配列変数から追加済みのデータを削除します。しかし、設定済みの配列から 1 行だけ簡単に削除できなかったのでちょっと工夫してます。
まず「作成」フローを利用して最初の 1 行だけ削除した配列のデータを作成します。
image.png
入力には以下のように設定しています。

skip(variables('addition'),1)

「addition」変数からskip関数を利用して 1 行飛ばしたデータを取得しています。
次に「変数の設定」フローで配列を書き換えています。
image.png
「配列変数に追加」フローで複数の配列データの追加はできなかったこと、直接変数にskip関数で書き込もうとすると、代入する変数と「値」で処理する変数が同じ場合できなかったためこのような方法を取りました。

配列に祝日のデータを書き込み

取得した祝日データを自身のデータを書き込みながら配列に追加していきます。
image.png
「値」には Outlook で取得した「件名」と「today」変数をカンマ区切りで書き込みます。
これで祝日データのリストが配列で作成できました。

SharePoint リストの祝祭日データを取得しクリアする

3 か月置きに毎回 1 年分のデータを取得するので、 SharePoint リストのデータは一度クリアしてしまい、最新のデータを書き込むようにしています。リストを取得してループ処理させて新しいデータの追記でも良いのですが、この方が処理的にも早いかなと思ってこの方法にしました。

まずは「複数の項目の取得」フローで SharePoint リストで事前に作成していた「祝祭日リスト」を読み込みます。
image.png
この時「フィルター クエリ」にTitle ne ''としておくと警告がでません。 ODATA クエリで何らかの処理を入れておかないとデータを絞り込めと警告されますが、今回すべてのデータを取得したいためタイトル欄が空のデータを省くとしています。

次に「Apply to each」フローを利用し取得したデータをループ処理で全削除しています。「項目の削除」フローを利用し ID を指定することですべてのデータが消えます。
image.png

SharePoint リストに祝日のデータを書き込む

最後にループ処理で生成した祝日のデータ配列をリストに書き込めば完了です。
「Apply to each」フローを利用し「holiday」変数をループ処理させデータを書き込みます。
image.png
「変数の設定」フローで書き込むデータを生成します。
image.png
「data」変数に以下の記述で書き込むデータを作成しています。

split(items('Apply_to_each(祝日)'),',')

変数内にカンマ区切りでデータが格納されているため、split関数で分割して「data」変数に配列として入力しなおしています。
これを「項目の作成」フローで SharePoint リストに書き込みます。
image.png
「タイトル」は以下の記述で

variables('data')[0]

「日付」には以下の記述で

variables('data')[1]

それぞれデータを書き込みます。

これで SharePoint リスト「祝祭日リスト」に実行時から 1 年間のリストが生成できました。

まとめ

会社独自の休日も含めた祝祭日リストをリストとして持っておきたかったため自動で生成するフローを作成しました。今回のキーは以下の通りです。

  • 祝日のデータは Outlook の「日本の休日」から取得できる
  • 自前のデータは配列を作成しておいてループ処理で挟み込めばリストに含められる
  • アレイ変数の一部削除はちょっと面倒、ソートも面倒

ちなみに、作ったリストは他のリストから「参照」で読み込むことは簡単にできます。しかし本当は入力された日付から祝日かどうかを判定したかったのですけど、 SharePoint リストだけではちょっと無理っぽいです。 Power Apps とかとの連携になるかな?

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?