Power Platform学習アプリ作成会#6

おはようございます、こんにちは、こんばんは。先日は学習アプリ作成会にご参加いただきありがとうございました。今回もレポートとして記事を投稿いたします。分かりにくかった点は以下の動画#6をご覧ください。

また、記事に誤りがあった場合は、優しくご指摘いただけますと幸いです。なお、この記事は筆者が一方的に書いているものなので、文責はkuro.が負うものです。ご理解いただけますと幸いです。

動画#6

仕事が早い…!いつもありがとうございます。

120分ほどある動画を編集するのって大変なんですよね…。10分ですら大変なのですが、今回もお忙しい中…。チャンネル登録、高評価で応援よろしくお願いします!

例:Count, CountA, CountIf, CountRows関数

学習アプリ作成会で使用した関数は、ようさんのチャンネルで『関数解説シリーズ』としてリリースされています。チャンネル登録、高評価よろしくお願いします!

前回の復習(#5)

復習に関しては動画を視聴していただくか、当ブログの『Power Platform学習アプリ作成会#5』をお読みいただければと思います。Akiraさんのチャンネルは高評価と登録をよろしくお願いします

今回(#6)の目指すところ

画面左のカレンダーを作っていきます

前回はSharePointリストのデータをDistinct関数で重複を避けて表示していました。この方法だと、データ型が一致せず、Text関数を利用しなければなりません。しかも、縦にスクロールしていかなければ目的のデータにたどり着けないため、ちょっと不格好です。

今回(#6)は、もっと視覚的に、カレンダーを使って成績照会できるようにしよう!という回になります。満遍なく関数が登場するので毎日が楽しいです。

カレンダーを自作する理由

ということで「カレンダーを作ってみようぜ!」ということになったわけですが、わざわざ作らずともPower Appsには2種類のカレンダーが用意されています。

便利なのは便利なのですが…。

もちろん、このまま使っても問題ないのですが、①一度カレンダーボタンを押してから日付を選びに行かないといけないこと、そして、②「日…月…火…」のような表記がアプリを使う側からすると少々見た目がよくないような気がします。

まずはCalendarコントロール。スクリーンとして「カレンダー」も用意されているのですが、右図のように日付を選択(=OnSelect)するまではデータ(予定)が表示されませんし、以下のような膨大なコードが書かれてあります。

これは説明できない

コードを理解しないまま開発を進めるのもどこか危うい感じがします。まあ、そのためのローコード開発ではあるのですが、この島国のことです。何かあっては責任が(市民)開発者に集中するに決まっています。

以上の問題意識から、数列を利用したカレンダー作成を試みることになりました。コードが少なくなるということは、それだけアプリ実行時の速度やバグの低減や解消に繋がるということです。

今回は成績を絞り込むだけの機能があれば良いですし、見た目も良くなるのであれば知っておいて損はありません。ということで、Akiraさん、ようさん、今回もよろしくお願いします。

カレンダーを実際に作る

カレンダーの原理を考える

カレンダーは、等差数列でできています。例えば、9月1日(木)の翌週は、1+7=8日となりますし、さらにその翌週の木曜日は1+7+7=15日となります(日付a+曜日数=日付b)

これを敷衍すれば、9月の木曜日の日付は、7n+1(nは任意の整数)で表すことができるということです。n=0であれば、9月1日が木曜日となり、n=3であれば22日が木曜日という計算になります。

さらに、9月の金曜日の日付であれば、2, 9, 16, 23日となりますので、先ほどの式を参考にして考えると7m+2(mは任意の整数)で表すことができます

つまり、以下の箇条の問題を整理できれば、簡単にカレンダーが作れてしまいます。

  1. その年の月初めの曜日を常に0という数値データにする(2022年9月であれば1日の木曜日が0になる、2022年10月であれば1日の土曜日が0になる)
  2. その0という数値データから1を引いた値、-1は先月末の日付である(2022年8月31日の水曜日)
  3. 数値データを日付(0であれば9月1日、-1であれば8月31日)に置き換える

…ということで、これを関数で書き換えてみましょう。

Now関数, Today関数

※この記事は11日に執筆しています

説明の余地はないと思いますが、Today関数は「今日の日付」を取得する関数です。一方、Now関数は「現在の日時」を取得する関数です。今回必要なのはToday関数ですね。

Day関数, Month関数, Year関数

※この記事は11日に執筆しています

このままではデータ型が「日付」のままとなってしまいます。この日付から日にちだけを抜き出し、数値データに書き換える必要があります。そこで使用するのがDay関数です。

DateAdd関数

※この記事は11日に執筆しています

DateAdd関数とは、日付(及び時刻)値に加算する関数です。今日の日付に1を加算したい場合は、DateAdd ( Today ( ) , 1 ) のように、第二引数に1を入れてあげれば良いです。同じく、減算したい場合は-1を入れてあげます。

※この記事は(ry

ここまで書くことができたら、この関数を応用して上の図のように「月初め」を算出することができるはずです。「今日の日付」から「今日の日付」を引き、その値に1を足すことによって1という解になります。

具体的に言えば、この記事を執筆しているのが9月11日なので、11+(-11)+1 = 1となります。うーん…気持ちいい。社会科の時間が嫌すぎて数学の問題を解答していた頃を思い出します。

Weekday関数

これであとは曜日を数字に書き換えられたらカレンダーが完成します。つまり、その月初めの曜日(基準)を0とする準備が必要になってきます。ここでWeekday関数の登場です。

Power Apps におけるWeekday関数とは、日付/時刻値の曜日を返す関数です。以下のテーブルをご覧ください。

Weekday関数
曜日

2022年の9月1日は木曜日なので、先ほど算出した月初めのコード、DateAdd ( Today ( ) , -Day ( Today ( ) ) + 1 ) をWeekday関数で括ってあげると、下のスクリーンショットのように5という値が戻って来ます。

これで仕込みは完了です。

カレンダーを完成させる

新規ギャラリー(galCalendar)を追加し、そのItemsプロパティに 1~42の数字(4週+2週の6行)を入れます。ギャラリーの Itemsプロパティは、データソースとなるものなので、ブラケット( コイツのこと → [ ] )で閉じてテーブル化しておきます。1

テンプレートに新規ラベル(lblCalendar)を追加し、Textプロパティには ThisItem.Value と入力。さらに、ギャラリーの折り返しの数を7とすると、これだけでカレンダーっぽくなります。

勘の鋭い方であれば、もうお分かりのことと存じます。このlblCalendarのTextプロパティに入っている ThisItem.Value から先ほどWeekday関数で括られた数式を引いて上げれば、月初めの値として0を取得できます。

ThisItem.Value-Weekday(DateAdd(Today(),-Day(Today())+1))

あとは、この ThisItem.Value に DateAdd ( Today ( ) , – Day ( Today ( ) ) + 1、つまり、1を足すことによって、以下の図のように、0を基準とした日付が算出されます。

あとは、これをDay関数で括ってあげると…。

カレンダーの完成です。

Day(
    DateAdd(
        Today(),
        -Day(Today()) + 1 + ThisItem.Value - Weekday(
            DateAdd(
                Today(),
                -Day(Today()) + 1
            )
        )
    )
)

なお、後で別画面に切り取って貼り付けるので、サイズを変えてもレイアウトが崩れないようにプロパティを設定しておきます。以下の箇条をご参考ください。

  • galCalendar
    • TemplateSizeプロパティ
      Self.Height/6
  • lblCalendar
    • Widthプロパティ
      Parent.Widh/7

もっとカレンダーっぽくする

新規ギャラリー(galWeekday)を追加し、Itemsプロパティに [ “月” … “日” ] と入れてあげます。これカレンダーの完成…ですが、ちょっと便利な関数を教えてもらいました。

Calendar関数

関数内容
Calendar.MonthsLong()“January” から始まる、各月の完全な名前を含む単一列テーブル。
Calendar.MonthsShort()January の “Jan” から始まる、各月の省略された名前を含む単一列テーブル。
Calendar.WeekdaysLong()“Sunday” から始まる、各曜日の完全な名前を含む単一列テーブル。
Calendar.WeekdaysShort()Sunday の “Sun” から始まる、各曜日の省略された名前を含む単一列テーブル。
Docsより抜粋

Calendar関数は、前回(#5)でも登場しました。日本語だとLongであろうとShortであろうと無関係ではありますが、上の表にまとめておきました。今回は、Calendar.Weekdays の方を使用します。

Short で日、月…とならない。なぜ。

Left, Right, Mid, Len関数

日本語対応していない、とのことなので「文字列操作関数」を使って「日、月、…」とします。

関数内容
Right (文字列, いくつ抜くか)右から何文字抜くのか
Mid (文字列, どこから抜くか [ , いくつ抜くか] )どこから(いくつ)抜くか
Left (文字列, いくつ抜くか)左から何文字抜くのか
Len (文字列)何文字あるのか
ようさんの関数アプリをテーブルにしてみました

今回は、左から1文字を取るだけなので、Left ( Calendar . MonthsShort ( ) , 1 ) であっさり解決です。ひとまず、これで#6は終わりです。

次回(#7)に向けて

https://ai-powerplatform.connpass.com/event/259012/
ようさん、スタイリッシュ…

早いものでもう7回目です。
次回のイベントでは色分けをしていくことになるのかな…? If関数(もしくはSwitch関数)が活躍しそうですね。早くも次回が楽しみです。

あと、今回、カレンダーを作り始めるよりも前にText関数も使いましたが、Value関数などが再登場した時に復習しておくことに致します。よく使われる関数なので、どこかで会えるはず…? どうしても知りたければ、Akiraさんとようさんの動画をご視聴ください。

それでは。

隅田智尋

  1. Sequence関数を使う方法もありますが、少し上級者向け。
PAGE TOP