Power Apps で Gallery の中身を月単位で表示する方法

#はじめに
データから自動生成したアプリでは、Gallery（一覧表示）に表示するレコードの数は、登録すればするほど増えていきます。
DateAdd などの日付関数を用いて「過去30日分」のようにフィルタリングすることもできますが（弊社の残業申請アプリはそのようにしています）、用途によっては過去に遡って確認をしたいケースもあるかと思います。
そんな時に Gallery を沢山スクロールするのは大変なので、ここでは Gallery の表示を月単位で表示させる簡単な方法についてご紹介します。

#用いるデータ
我が家の家計簿のデータを抜き出してきました（笑）
データは SharePoint リストに置いています。
今回ポイントになるのは、日付列である purchaseday です。

| 用途      | 列名         | 型           |
|:----------|:-------------|:-------------|
| 購入日    | purchaseday  | 日付         |
| カテゴリ  | category     | 1行テキスト  |
| 金額      | price        | 数値         |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/b7ca6c2e-1390-573f-014d-a539d4c7a42d.png)


#月単位で表示させる方法
今回はここからスタートします。
データから自動生成したものについて、Gallery の中身の表示をちょっと変更し、Gallery の上にあった検索ボックスと検索アイコンを非表示にしただけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/fbf14aed-e300-f839-db12-c63398f04bff.png)

##月表示ラベルと月切り替えアイコンを置く
空いているところ（検索アイコン等があった場所）に、現在の月を表すラベルと、月を切り替えるアイコンを配置します。
ラベルは中央揃えにしておくとよいかもです。
 - ラベル：LabelCurrentMonth
 - 左アイコン：IconPrevMonth
 - 右アイコン：IconNextMonth

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f3dba53c-935e-da1c-13fc-205e28d8a34a.png)


##アプリ起動時に「今月の1日」を変数に格納する
App の OnStart で、今月1日の日時情報を変数 "varFirstDayOfMonth" に格納します。
「今月１日」は、「今日の日付から、今日の日の数字分だけ日にちを減算し、1を足す」ことで定義できます。
（例：7/4の場合は、そこから日の部分である4日を減算し（6/30になる）、そこに1日足すと7/1になる）

```PowerApps:OnStart
Set(varFirstDayOfMonth, DateAdd(Today(), -Day(Today())+1, Days))
```

記載したら、OnStart を実行しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/5b16f2f3-212e-98f3-f91d-d9313f84cf2e.png)

定義した変数 "varFirstDayOfMonth" は、ラベル "LabelCurrentMonth" で表示しておきしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/81290b9d-f1ca-3b7c-e2f3-fd766abbfa16.png)



##"左"、"右" アイコンをクリックしたら変数をそれぞれ前月1日、翌月1日にする
OnStart で利用した方法を応用して、左右のアイコンをクリックした時に変数 "varFirstDayOfMonth" をそれぞれ前月1日、翌月1日になるよう更新します。

**"左"アイコン**

```PowerApps:OnSelect
Set(varFirstDayOfMonth, DateAdd(varFirstDayOfMonth, -1, Months))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/d94fe0a0-d8c7-240d-65be-5c43da4cf755.png)
※なお、ここでなぜか変数 "varFirstDayOfMonth" が値なし状態になり、ラベルの表示がなくなりますが、気にせず進みます。


**"右"アイコン**

```PowerApps:OnSelect
Set(varFirstDayOfMonth, DateAdd(varFirstDayOfMonth, 1, Months))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f5f2a1f6-f2fb-aebb-3d8b-13964b7cd21b.png)


ここまで終わったら、再度 App の OnStart を実行しておきます。
左右アイコンをクリックしてラベルの日付が月単位で切り替わることを確認したら、ラベルの表示を年月のみに変えておきましょう。

```PowerApps:Text
Text(varFirstDayOfMonth, "yyyy年mm月")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/e887c455-cf30-ac74-c897-a9e4d8a63b0b.png)


##変数を用いて Gallery をフィルタリングする
最後に、定義した変数 "varFirstDayOfMonth" を用いて、Gallery の表示を月単位にします。
Gallery の Items を以下に書き換えます。
日付列である purchaseday の範囲を、
　変数 "varFirstDayOfMonth" 以上（つまり、今月1日以上）　かつ
　変数 "varFirstDayOfMonth" に1ヶ月加算した日付未満（つまり、来月1日未満）
とすることで、指定した月の分のみを表示させることができます。

```PowerApps:Items
SortByColumns(
    Filter(
        [@'家計簿-メイン'],
        purchaseday >= varFirstDayOfMonth,
        purchaseday < DateAdd(varFirstDayOfMonth, 1, Months)
    ),
    "purchaseday",
    If(
        SortDescending1,
        Descending,
        Ascending
    )
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/8fcec9c6-ba61-590f-7042-d0093916429e.png)

#完成！
これで、左右アイコンをクリックする度に Gallery の表示範囲を月単位で切り替えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/84b7d881-99ef-45d4-8dc8-a65327ba2247.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/db4896c5-83d6-db98-2476-0a4b387024b9.png)


これを応用すれば、年単位や日単位での実装も可能です。
色々なシーンで利用できる機能かと思いますので、是非お試しください。
<br>

欲しいアプリは欲しい人が作り、欲しいデータは欲しい人が集める時代へ。
何かのご参考になれば幸いです。