8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Power AppsAdvent Calendar 2024

Day 13

Power Apps で予約データをカレンダーで表示する

Last updated at Posted at 2024-12-22

はじめに

今回は、以下のように、Power Apps で予約データをカレンダーで表示する方法について紹介します。

image.png

データソースの作成

今回は SharePoint リストで以下のような列を作成します。予約に関するリストはかなりシンプルです。必要に応じて予約件名とかも作成ください。

image.png

image.png

装置一覧の方はもっとシンプルです。タイトル列をそのまま使っています。

image.png

OnStart

image.png

[OnStart]あまり推奨しなくなっていますが、以前作成したアプリからの流用なので・・・
ただ、こちらの処理でアプリの起動が凄く遅くなるということはないはず。
こちらで日付に関する変数を定義しています。

// ===========================
// カレンダー情報設定
// ===========================
Set(
    _dateSelected,
    Today()
);
Set(
    _firstDayOfMonth,
    DateAdd(
        Today(),
        1 - Day(Today()),
        TimeUnit.Days
    )
);
Set(
    _firstDayOfWeek,
    DateAdd(
        Today(),
        1 - Weekday(Today()),
        TimeUnit.Days
    )
);
Set(
    _firstDayInView,
    DateAdd(
        _firstDayOfMonth,
        -(Weekday(_firstDayOfMonth) - 2 + 1),
        TimeUnit.Days
    )
);
Set(
    _lastDayOfMonth,
    DateAdd(
        DateAdd(
            _firstDayOfMonth,
            1,
            TimeUnit.Months
        ),
        -1,
        TimeUnit.Days
    )
);
Set(
    _minDate,
    DateAdd(
        _firstDayOfMonth,
        -(Weekday(_firstDayOfMonth) - 2 + 1),
        TimeUnit.Days
    )
);
Set(
    _maxDate,
    DateAdd(
        DateAdd(
            _firstDayOfMonth,
            -(Weekday(_firstDayOfMonth) - 2 + 1),
            TimeUnit.Days
        ),
        40,
        TimeUnit.Days
    )
);

カレンダー日付部分

以下の部分です。今回は、一応、日から土まで枠内に入ったため、一旦、コンテナーの外に配置しています。

image.png

上の方から主要なプロパティの設定を記載します。まず、曜日を表示するギャラリーの [Items]プロパティは以下です。

image.png

次に、そのギャラリー内にラベルを配置して、[Text]プロパティに以下の設定をしています。日曜日とかだと長いためです。

image.png

Switch(
    ThisItem.Value,
    "日曜日", "日",
    "月曜日", "月",
    "火曜日", "火",
    "水曜日", "水",
    "木曜日", "木",
    "金曜日", "金",
    "土曜日", "土"
)

日付側のギャラリーの [Items]プロパティは以下です。

image.png

ギャラリー内のラベルの[Text]プロパティに以下の設定をしています。基準となる日から、数値を足している感じです。

image.png

Day(DateAdd(_firstDayOfWeek,ThisItem.Value,TimeUnit.Days))

カレンダー

カレンダー部分は以下のような部品構造になっています。

image.png

まず、ポイントは、装置を左側に一覧表示して、右側に、該当の装置が、カレンダーに表示されている日付に予約があれば、予約者を表示するようにしており、複数のギャラリーが一緒に上下スクロールするようにしている点です。

こちらを実現するため、以下のスクロール可能な画面を一旦作成し、部品を拝借しています。

image.png

具体的には、以下の部品です。

image.png

そして、装置側のギャラリーは、コンボボックスで選択した装置を ID 順に並べています。

image.png

SortByColumns(
    Filter(
        装置,IsBlank(ComboBox1.Selected.タイトル)||
        タイトル = ComboBox1.Selected.タイトル
    ),
    "ID"
)

右側の予約データを表示する方は、水平コンテナーの配下にギャラリーを入れ子にしています。折り返しをオンにしています。

image.png

そして、外側の垂直ギャラリーは、左側のギャラリーと同じです。こちらにより、左側の装置一覧と並びを連動させています。

image.png

そして、垂直ギャラリーの中に水平ギャラリーを入れています。こちらは、以下のようにして、上の日付と同じになるよう、日付と装置の名前を持ちます。一行あたり 7 日分のデータを持つ感じになります。

image.png

ForAll(
    Sequence(
        7,
        0,
        1
    ),
    {
        日付: DateAdd(
            _firstDayOfWeek,
            ThisRecord.Value,
            TimeUnit.Days
        ),
        装置:ThisItem.タイトル
    }
)

そして、水平ギャラリーの中のラベルにて、日付、装置と一致する予約データを取って来て表示しています。もし、日時ベースで予約を取れるようにしている場合は、開始日時と終了日時を日付の間にあるか確認する感じですかね。また、もし複数の予約を表示させたい場合は、カレンダーの中には入らないため、ボタンを配置して、予約がある場合はボタンを表示して、押下すると予約一覧がポップアップで表示されるようにするのがいいかなと思います。

image.png

LookUp(
    装置予約,
    Start = ThisItem.日付 && タイトル = ThisItem.装置
).User.DisplayName

日付の移動

以下の部分です。

image.png

日付進める場合のアイコンの[OnSelect]です。

/*changes view to next week*/
Set(
    _firstDayOfWeek,
    DateAdd(
        _firstDayOfWeek,
        7
    )
);
Set(
    _firstDayInView,
    DateAdd(
        _firstDayOfMonth,
        -(Weekday(_firstDayOfMonth) - 2 + 1),
        TimeUnit.Days
    )
);
/*changes month view to next month*/
If(
    _firstDayOfWeek > _lastDayOfMonth,
    Set(
        _firstDayOfMonth,
        DateAdd(
            _firstDayOfMonth,
            1,
            TimeUnit.Months
        )
    );
    Set(
        _lastDayOfMonth,
        DateAdd(
            DateAdd(
                _firstDayOfMonth,
                1,
                TimeUnit.Months
            ),
            -1,
            TimeUnit.Days
        )
    );
    
);

戻る方です。


/*changes month view to previous week*/

Set(
    _firstDayOfWeek,
    DateAdd(
        _firstDayOfWeek,
        -7
    )
);
Set(
    _firstDayInView,
    DateAdd(
        _firstDayOfMonth,
        -(Weekday(_firstDayOfMonth) - 2 + 1),
        TimeUnit.Days
    )
);
/*changes month view to previous month*/
If(
    _firstDayOfWeek < _firstDayOfMonth,
    Set(
        _firstDayOfMonth,
        DateAdd(
            _firstDayOfMonth,
            -1,
            TimeUnit.Months
        )
    );
    Set(
        _lastDayOfMonth,
        DateAdd(
            DateAdd(
                _firstDayOfMonth,
                1,
                TimeUnit.Months
            ),
            -1,
            TimeUnit.Days
        )
    );
    
);

まとめ

今回は、Power Apps で予約データをカレンダーで表示する方法を紹介しました。
コントロールの幅や高さの調整は多少試行錯誤する感じになりますが、主要な処理についてはこのような感じになると思います。作成難易度上がりますが、簡易的なカレンダーであれば、Power Apps で作成できます。

更に複雑なカレンダーとなると、部品数や、データ量によってはアプリがかなり重くなると思うため、その辺注意しながら場合によっては落としどころを見つけつつの作成になると思います。

8
2
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
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?