Power Apps で日用品の購入管理アプリを作る

(2020/01/17)
Power Automate のフロー作成手順の記事へのリンクを「その3：Power Automate で日付減算とメール通知処理フローを作成する」章の文中に追加しました。


#きっかけ
日用品って、いざ使おうと思った時に「あれ？在庫ないぞ？」って気付くんですよね。
そして、買い物に行った時に「あれ？何買うんだっけ？」って忘れるんですよね。
<br>
我が家は頻繁にこれを繰り返していて、時折バスマジックリンを切らして風呂場を水洗いしたり、食洗器用の洗剤を切らして洗い物の時間が余分にかかったりしていました。

そんなことを数年間も繰り返していた我が家ですが、最近ふと妻が
「これアプリで何とかならない？」
と。

そんな会話をきっかけに、実際に日用品管理アプリを作ってみました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「無くなったアレ、何だっけ？」<br><br>何が無くなったのかをいつも忘れ、色々買いそびれる日用品の購入目安を可視化する <a href="https://twitter.com/hashtag/powerapps?src=hash&amp;ref_src=twsrc%5Etfw">#powerapps</a> アプリを作ってみました。<br>Automate で毎日残日数が減っていき、残日数が少なくなってきたら買い時。買ったら「買った」ボタンを押せば既定日数だけ加算される仕組み。 <a href="https://t.co/8pKeR2RdPv">pic.twitter.com/8pKeR2RdPv</a></p>&mdash; Jun’ichi Kodama (@KodamaJn) <a href="https://twitter.com/KodamaJn/status/1216269343509512192?ref_src=twsrc%5Etfw">January 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで、せっかくなので実際に作ったアプリの作り方を公開することにしました。
（Power Apps の部分は初学者向けに書いてみたので、ご存知の方には不要な情報が多いかもしれません）

#アプリ概要
イメージはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/6860572f-ee45-deb3-9f09-3963d6840de7.png)
アプリの画面には、
・日用品の品目
・各々あと何日くらいで買えばよいのか（残日数）
が残日数順に一覧表示されていて、買ったら「買った」ボタンを押せば残日数が増える。
ボタンを押した際に残日数を何日増やすかは品目ごとに数字を持っておき、後からでもメンテナンスできるようにする。
洗剤の詰め替えなどは買う度に「2倍」や「4.4倍」など容量が異なり調整が必要になるため、残日数は直接修正もできるようにする。


#システム構成
我が家のライセンスは Office 365 Business Essentials ということもあり、データソースは SharePoint のリストにします。
日用品の商品名や次回購入までの残日数などを管理する品目リストと、購入のタイミングを記録する購入履歴リストの2つを用意しました。

Power Apps アプリでは、残日数を確認する他、品目情報の登録・編集や、購入履歴の追加を行います。
Power Automate のフローは毎日定期実行させ、残日数の減算の他、そろそろ購入すべき品目をメール通知させるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/5bbe7f51-7548-2e06-4652-2c45b292de7f.png)



#その1：SharePoint リストを作成する
###品目リスト
既存のタイトル列は商品目として利用します。
追加した列は、次回購入までの残日数を格納する "残日数" と、購入時に残日数を何日延長するかを格納する "購入周期" の2列で、両方とも数値型です。
列を追加したら、この後のアプリ作成をやり易くするために、適当な品目を追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/14e0acec-c916-11be-2fef-42e2e7e7d958.png)

###購入履歴リスト
既存のタイトル列は利用しないため、予め列の設定で必須入力を "いいえ" にしておきます。
追加した列は、品目リストの商品レコードのIDを格納するための "商品ID" のみで、数値型です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/ded4749c-c274-17b5-a66b-3a125061cbf7.png)

続いて、上記のリストを用いてアプリを作成します。


#その2：Power Apps でアプリを作成する
残日数を確認する他、品目情報の登録・編集や、購入履歴の追加を行うアプリを作成します。
先ほど作成したリストから自動生成したアプリをちょっとカスタマイズするだけなので、非常に簡単です。

1. まずは、先ほど作成した "品目リスト" からアプリを自動生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/b606853b-3dd4-6628-6602-33ec34f87c5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/31551814-3b85-5a39-736c-e6a77b2dbe5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/4a974f4d-2ab2-45f5-f8c7-d205a6c5ac09.png)
自動生成されました。
これをベースに、ちょっとだけ変更を加えます。

2. テーマカラーを変更してみます。
妻も利用するので、今回は赤系にしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/6fa85df8-285c-3773-eb6f-cd6863268cc6.png)

3. 購入履歴リストをデータソースに追加します。
商品を購入した際に、購入履歴に追加するためです。
画面左側の "データソース" タブから、SharePoint コネクタを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/618e2da9-e4b8-0071-70d8-2d9459844c97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/a8260cdf-a21b-d0bb-4048-ecbea3f73add.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/67b291a0-f880-f492-ce2b-16f3d30feb3c.png)
追加されました。

4. Gallery 内にボタンを追加します。
商品を購入した際に、残日数の延長と、購入履歴への追加を行うためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/4dd7b19c-4ec9-710a-7859-1e29e1fc77dd.png)
なお、Gallery 内にコントロールを追加する際は、既に Gallery 内にあるコントロールを選択するなどして、Gallery 内のテンプレート領域を選択した状態で追加しましょう。これを忘れると、追加したコントロールが Gallery の外に配置されてしまいます。
（私の知り合いが、ここが分からず 30 分詰んだと言っていたので、ご存じない方はご注意くださいませ！）

5. 追加したボタンを適当に右側に寄せ、表示文字（Text）を分かりやすい文字に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/eeadf16f-f635-02c5-5aa3-8557e138942a.png)

6. ボタンを押した際の処理（OnSelect）に、以下を記述します。
1行目では、品目リストの該当商品に対して残日数の延長を行っています。商品が持つ残日数の情報に、同じく商品が持つ延長日数（購入周期）を加算しているだけです。
2行目では、購入履歴リストに該当商品のIDを追加しています（購入日時は、自動的に記録されるレコードの登録日時を利用します）。
Patch 関数については、以下を参照ください。
[Power Apps の Patch 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-patch)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/967b90c1-88ff-5fd6-d066-b550eefe2598.png)

    ```aaa:OnSelect
    Patch('日用品-品目', ThisItem, {残日数:ThisItem.残日数+ThisItem.購入周期});
    Patch('日用品-購入履歴', Defaults('日用品-購入履歴'), {商品ID:ThisItem.ID});
    ```

7. Gallery 内の表示を整えます。残日数は大きくして見やすくしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2c20476a-edbb-ceaf-4e30-a89836e27e8e.png)

8. 最後に、Gallery の並び順を "残日数順" にします。
Gallery の Items 内のソート列名を "残日数" の列名に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2a0bba82-fe31-1988-c7ed-0e53f87e39b0.png)
なお、ソートの列指定には、日本語は利用できません（2020/01/13 現在）。
SharePoint の列名を日本語で生成した方は、列の編集画面の列IDをコピペするか（以下参照）、または SharePoint で列を生成する際に英語名で生成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/9e283539-3226-6000-7a7c-b0e9c402e8b3.png)

9. 続いて DetailScreen に購入履歴を表示させます。
既存のヘッダのパーツを適当にコピペして、体裁を整えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/89dcca2b-c285-3d07-943c-2ceceb3225d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/4675439b-fa4f-65b4-04ac-e23eac97ecc0.png)

10. Gallery を追加します。
購入履歴を表示するので、データソースは購入履歴リストを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/76bdc4cc-1e06-e14b-ce62-a545c90e637c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/ab56e575-7c04-5b9b-9be2-9a64d4c83b90.png)

11. 追加した Gallery を画面下部に移動させ、ラベルを追加し、登録日時を表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/4f06adcf-af9f-4101-83ac-376f9e03999e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/9fec88c2-da7c-2607-9f53-3126e9798a9d.png)

12. 幅を縮めて見やすくして…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/443d6e3f-62bc-6fe1-bd80-6717ae4284e7.png)

13. 追加した Gallery の Items に、以下を記載します。
購入履歴データから、今選択している商品のみを登録日時降順で表示させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/acf49239-baaf-f0fd-c8b3-f20bbd5d5ebd.png)

    ```aaa:Items
    SortByColumns(Filter('日用品-購入履歴', 商品ID = BrowseGallery1.Selected.ID), "Created", Descending)
    ```

アプリはこれで完成です。
シンプルな手順を重視したため、デザインがアレだったり無駄なコントロールが残っていたりしますが、ご了承ください。

名前を付けて保存し、必要な人に共有しておきます。
初回の保存後に修正した場合は、発行もお忘れなく。


#その3：Power Automate で日付減算とメール通知処理フローを作成する
残日数の減算を行い、そろそろ購入すべき品目をメール通知させるフローを毎日定期実行させます。
全体像はこんな感じです。これができれば、完成です。
詳細な作成方法は別記事にしましたので、「この図を見るだけではちょっと…」という方は、以下も参考にしてみてください。
[Power Apps で日用品の購入管理アプリを作る（Power Automate 編）](https://qiita.com/KodamaJn/items/1a766d220b7b22339a7b)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/f8151be7-cfd4-854c-0a20-1cb352764a0d.png)


#まとめ
一見難しそうなアプリですが（難しそうに見えない？！）、データソースの作成からフローの作成まですべて行っても、慣れれば1時間以内にできてしまうほど、簡単なものです。

これからは、欲しいアプリは欲しい人が作り、欲しいデータは欲しい人が集める時代です。
ハッピーになりたい人が自分の力でハッピーになれる世界へ。

是非皆さまも素敵な Power Platform ライフを！