【Power Apps】アプリ（Single Page Application）をつくってExcelデータベースを更新してみる

PowerAppsで一般的なクラウドサービスにあるような業務アプリを作ったので記事にしました。この記事を読んで実際にアプリを作ってみることでPowerApps開発におけるハードルを下げる事ができれば幸いです。

***本記事で構築する業務アプリ画面です。簡単に作れてすぐに使える:relaxed:***
　![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/7bdc51ac-f87c-3196-41a7-53e592e3713d.png)

PowerAppsのとっつきにくさはディグってもよく分からない事が多い！に尽きると思います。キーワード検索でHitしたものを読んだところで（公式サイトすら）意味が分からなくて、癖も強いので結構ハマります。結局、trial&errorで色々やって問題が解決して、あーそういうことかって後から理解が追いつくような方は多いと思います（学習コストが高い）。なので敬遠してSalesforceやkintoneといった世のクラウドサービスを活用しようという思考に行きがちですが、今度はそのサービス利用に係る学習コスト、無駄なアカウント管理、ランニングコスト、データ移行、Office365連携が必要ならwebAPIを作ったり...メリット感が少ないので結局PowerAppsが優位になるケースが多いと思います:eyes:

:::note info
**If you have an environment where you can use Office 365,**
**there is no reason not to use PowerApps.**:point_up:
:::

## 構築手順

手順1：PowerAppsのホーム画面にて作成タブ内の「空のアプリ」を選択します。
　![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/ed91b73e-287e-25a1-9dfc-e0c78a6c6597.png)

手順2：「空のキャンバスアプリ」で作成をクリックし、「アプリ名」を入力して作成をクリックします。
　![キャプチャ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/bce0ea1f-3af8-0306-8f05-f140e678d5f8.png)

　![キャプチャ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/e89a7191-784c-69a4-126b-f7d76f96efe6.png)

　![キャプチャ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/1adc5f81-b850-1cb8-23c0-b7e03cf3f2aa.png)

:::note info
**モデル駆動型アプリとキャンバスアプリについて**
**モデル駆動型アプリ**は、Microsoft Dataverseデータベースを必要とします。モデル駆動型アプリのビューや詳細画面は、Dataverseのデータ構造に拠ってデザインされます。 このため、アプリの作成者のスキルに依存せず、一貫性のある外観を作成可能です（自由度は低い:helmet_with_cross:）。
**キャンバスアプリ**はDataverseを使用せずとも構築できます。データとサービスへのアクセスはコネクタを利用します。キャンバスアプリは、アーティストのキャンバスのような空白の画面で始まり、各要素の配置をして自由にレイアウトを作成することができます。:saxophone:Excelをデータベースとしてアプリを構築したい場合（本記事の場合）、こちらを選択します。
:::

手順3：キャンバスアプリからExcelに接続するための準備

・事前準備としてExcelファイルを作成し、Excelファイル上にテーブルを定義します。
![キャプチャ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/42124d73-6c1d-91ca-acf0-1ab666a2746a.png)

・作成したExcelファイルをOneDriveやSharePointに格納します。 
![キャプチャ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/7a536a65-0e61-fec8-ae01-c8040494a87e.png)

手順4：アプリ編集画面でデータソースの追加でExcel（テーブル）を接続します。最後に識別子（主キー）を選択しますが、本記事では、日付列を識別子（ユニークキー）としました。

![キャプチャ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/fcbdc743-9652-81a5-7b82-dfa7481b7930.png)

![キャプチャ9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a4ecd2ac-088e-2363-f52a-c8bafae6f35a.png)

![キャプチャ10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/120ceba0-9884-6236-6be5-1dccb0f878b3.png)

手順5：接続したExcelのデータをアプリ上に表示します。

・アプリ編集画面の挿入タブから「データテーブル(プレビュー)」をクリックし、「データソースの選択」でテ―ブル1を選択します。
![キャプチャ11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a7a6b1fc-95d2-804c-f7e9-b34f9e696f9a.png)

・フィールドの編集から、データテーブルにフィールドを追加します。
![キャプチャ12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a91bddfd-b37d-d1f7-c544-2e1ec4466473.png)

![キャプチャ13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/c9cb895f-1706-5b8f-25c7-21cf07b8ad8f.png)

・このようにExcelデータがアプリ編集画面上に表示されます
![キャプチャ14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/31eee7f5-6e2c-aedd-775f-07db6e1221b5.png)


手順6：入力フォームからExcelのデータ（テーブル）をアプリから更新します。
　　　　本記事ではデータテーブルで選択している行の来客と売り上げを更新します。 

・左サイドバーからコンポーネントを選択して更新用の入力欄を作成します。
![キャプチャ15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/fc89c116-8506-2886-2115-38d1d8047344.png)
・来客と同様に売り上げも入力欄を作成します。
　![キャプチャ16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/d22d813f-3a0a-c6fc-c72e-984db59d75f8.png)

・左サイドバーからコンポーネントを選択してボタンを作成します。
　![キャプチャ17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/5cd70b3a-3f84-14e4-9014-7acdf7581580.png)
・ボタンを配置したら、onselectイベントを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/91708fc6-2566-7b74-e8b0-f5f080944806.png)

:::note info
**ボタンを押すとonnselectに記載した以下の式を実行します**
`Patch(テーブル1,LookUp(テーブル1,日付=DataTable1.Selected.日付),{来客: TextInput1.Text,売り上げ:TextInput2.Text});`

・テーブル1＝Excelに設定したテーブル
・DataTable1.Selected.日付＝薄い青で示されている行の日付を示す（上記のテストでは「2024/1/4」）
・TextInput1.Text＝来客の入力欄に記載した文字列（ TextInput1は部品の名前）
・TextInput2.Text＝売り上げの入力欄に記載した文字列（ TextInput2は部品の名前）
:::

:::note info
開発画面で動作を実行したい場合、ALT押しながらクリックか:arrow_forward:ボタンをクリックします。
:::

:::note info
来客の入力がないときはボタンを非活性にして更新不可の制御を行います。
・非活性（入力必須）の設定
　ボタン>詳細設定＞DisplayModeに以下を設定します。
　`If(TextInput1.Text<>"",DisplayMode.Edit,DisplayMode.Disabled)`
:::
:::note info
ボタンなどマウスフォーカス部分にツールチップを表示する場合
・ツールチップの設定
　ボタン>詳細設定＞Tooltipに以下を設定します。
 "選択したレコードを更新します”
:::

手順7(appendix:writing_hand:)：レスポンシブレイアウトの設定

:::note info
レスポンシブ レイアウトについて
レスポンシブとは、画面サイズやフォーム ファクタに対して自動的にアプリを合わせるデザインです。マルチデバイス、フォーム ファクター、画面サイズで優れた UI と UX を提供する機能を指します。

・レスポンシブレイアウトを適用しない場合
![キャプチャ18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/9aa61d78-e373-2845-3b0b-742cb7e500b5.png)
・レスポンシブレイアウトを適用する場合
![キャプチャ19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/e7975817-524a-1bb2-bdd3-c20d21d9feb5.png)
:::

・レスポンシブにする手順
　（事前準備）例としてアプリのタイトルとユーザ名の部品を作成します。
  ![キャプチャ20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/2ef2a5f3-9c3f-d557-c438-65f2a7f6337f.png)

・アプリの設定を変更します。
　![キャプチャ21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/cf8618b6-7bb0-f72d-9e1d-592210afbbab.png)

・まだレスポンシブの設定をしていないので、このようなレイアウトになります。
![キャプチャ22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/9cd69a89-64e3-0c5a-ff7f-9a9423a23f28.png)

・サイドバーから水平コンテナーを選択して「Width」にscreen1.widthを入力します。
![キャプチャ23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/dc8eba45-302a-a476-51e2-9b4a2494451b.png)

・水平コンテナーを画面の上部に移動させて、「アプリのタイトル」と「ユーザ名」を水平コンテナーの中に配置します。
![キャプチャ24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/79d827fd-f6f6-9198-5bd6-64762d8a5068.png)
・「アプリのタイトル」「ユーザ名」の設定を変更
　- プロパティ>幅（伸縮可能）をオンにする　※ユーザ名も同じようにする
　- プロパティ>最小幅を0にする　※ユーザ名も同じようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/bf34a487-b512-240a-0b65-c77acf019362.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/01ffdffc-dbfe-062e-7152-35c9dfa68c68.png)

・iphone用に文字の大きさを調整します（画面の幅によって変数「widthtype」を）動的に変更）
　APPでプルダウンからFomulasを選択して下記のように設定します。
　なお、Fomulas内に書いた構文はアプリ起動時に実行されます。
```
widthtype=If(App.Width<=800,"Small",App.Width<=900,"Medium",App.Width<=1200,"Large","Extra Large");</INS>
```

・「アプリのタイトル」「ユーザ名」について「詳細設定」から「size」を以下のよう変更します。
```
Switch(widthtype,"Small",15,"Medium",20,25)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/3774a981-63b3-9f30-d3ad-c031c9fb232e.png)

・以上の設定を行うことで、動的にサイズを変更するレスポンシブデザインが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/b7694392-e02d-b51c-8652-4343a59443e2.png)

:::note info
※縦方向に並ぶ場合は垂直コンテナーを用います。
　「部分を塗りつぶす」を変更することでコンテナー内の比率が変わります。
 　うまくいかない時はscreen1の画面サイズの設定を変更してみてください。
`Width：Max(App.Width, If(App.Width < App.Height, App.DesignWidth, App.DesignHeight))`
`Height：Max(App.Height, If(App.Width < App.Height, App.DesignHeight, App.DesignWidth))`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/ae728da4-1d5b-9eaf-cf14-e044d8391ca8.png)
:::

以上です。ご精読いただき、ありがとうございました。

---

こちらの記事を参考にさせていただきました。有難うございました。

[Power Appsのレスポンシブレイアウトをやってみた　～コンテナ解説編～](https://qiita.com/rockfun/items/e258e06b52c3126b0fc0)
[Power Apps：キャンバスアプリでレスポンシブ レイアウト対応のアプリを作成する際の設計方針(1)](https://artisan.jp.net/blog/canvas-apps-build-responsive-apps-1/)