Power Appsの使い方

Power AppsとPower Automateの使い方やできることがわかるブログを目指しています。

Power Apps Formの参照データソースを動的に切り替える

Formなどで参照するデータソースを動的に切り替えたい場合、以下の2つの方法が考えられます。需要としては開発、テスト用データソースに切り替えたいとかですかね。

 

どちらも一長一短、一癖ある感じです。

 

変数方式

変数にデータソースの参照を代入して置き、Form.DataSourceでは変数を参照する方法です。

Screen.OnVisibleButton.OnSelectで別のデータソースを代入することでデータソースを切り替えることができます。

 

UpdateContext({FormDataSource:データソース1});

 

メリット

日本語でフィールドの指定ができるので、デフォルトの指定方法と変わらないのが楽。

 

デメリット

SharePointリストの添付ファイルに対応できない。

 

If() Switch() 分岐方式

Form.DataSource プロパティにIf()分岐などを設置して、条件によりデータソースを切り替える方法です。

 

If(true,データソース1,データソース2)

 

メリット

SharePointリストの添付ファイルに対応できる。

 

デメリット

日本語のフィールドがシステム生成の読めないフィールド名になってしまう。

 

対応表

 

直指定方式

変数方式

If() 分岐方式

フィールドを日本語で指定

 

フィールドを英語(システム生成)で指定

添付ファイル対応

 

※検証中いじってたら変数方式で日本語指定ができなくなったりしたので、アプリ手順によってはできないことがあるかも。ブラウザリロードしたら直りました。

 

まとめ

最初If()で分岐できないのかと思ったりしたので、ちょっと罠ですね。

場合によりどちらも取りうる選択肢になると思います。アプリ要件を満たすものでお好きな方法で分岐させてみてください。

フィールド名は基本英語で作っておくのが吉ですね。

Power Apps 押さえておきたいデータ操作系関数まとめ

Power Apps でデータソースに対してレコードの登録や更新、削除、フィルタリングなどを行うときに使用する関数について、改めてまとめてみようと思います。

 

この記事では、以下の関数について書いていきます。

Patch()

Remove()

Filter()

LookUp()

 

これ以外にもデータ操作を行える関数はありますが、すべてをまとめると混乱の元になりそうなので、今回は個人的に押さえておいたほうがいいだろうと思うもののみにしています。

 

最後にうまくいかない場合のQAがありますので、できないときはそちらも参考にしてみてください。

 

Patch()・・・レコードの登録や更新をするときに!

Patch()関数を使用するとレコードの登録や更新を行うことができます。

基本的に Power Apps でのレコード操作はフォームコントロールを使用して行いますが、Patch()関数を使用するとより柔軟なアプローチでアプリを構成することができます。

 

少しとっつきにくいですが、慣れれば問題なく扱えるようになると思います。そういう意味ではガチ初心者向けの関数ではない気もしています。まずはフォームコントロールを使用したアプリから始めて、データに慣れてきたら以下を参考に柔軟なデータ操作を行うアプリを作ってみましょう。

 

レコードを新規登録する方法

Patch(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    Defaults([データソース]), // 第二引数。Defaults()の引数の中には第一引数と同じデータソースを指定します。

    {

        ID:"1"// 複数フィールドを含める場合は , で区切ります。

        Name:"Makoto Maeda",

        Number:1

    } // 第三引数。フィールド名: }の形式でレコードの値を入れていきます。すべてのフィールドを含める必要はありませんが、必須フィールドは忘れずに含めましょう。

)

 

レコードを更新する方法

Patch(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    Gallery1.Selected// 第二引数。更新したいレコードを指定します。指定には主に Gallery.Selected  ThisItem LookUp() などを使用します。

    {

        ID:"1"// 複数フィールドを含める場合は , で区切ります。

        Name:"Makoto Maeda",

        Number:1

    } // 第三引数。フィールド名: }の形式でレコードの値を入れていきます。更新するフィールドのみ含めればOKです。

)

 

Patch()関数を応用するとどういったことができるか?

フォームコントロールでは実現出来ないような事、例えば以下のようなことができます。

Galleryのリスト上から直接1クリックでレコードを更新する(たとえばBOOL値のトグルなど)

・複数のレコードをまとめて登録、更新する(これにはForAll()を併用します。)

・フォームコントロールに縛られない自由なUIで入力フォームを構築する

・ユーザーに意識させずにバックグラウンドでレコードを登録する

 

Remove()・・・レコードを削除するときに!

Remove()関数を使用するとレコードを削除することができます。

レコードまたはコレクションを指定して、レコード1件または全件を削除対象とすることができます。

 

1件のレコードを削除する方法

Remove(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    Gallery1.Selected // 第二引数。削除したいレコードを指定します。指定には主に Gallery.Selected  ThisItem LookUp() などを使用します。

)

 

複数のレコードを削除する方法

Remove(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    colItems// 第二引数。削除したいコレクションを指定します。指定には主に Filter()  Collection変数 などを使用します。

    All // 第三引数。All と指定するとコレクション内のレコードを全件削除することができます。

)

 

Filter()・・・レコードを複数件取得したいときに!

Filter()関数を使用するとレコードを複数件取得することができます。

Gallery.Itemsに指定したり、Collectionに入れたりして使うことができます。

 

レコードを複数件取得する方法(データソースの一部のレコードをフィルタリングして取得する)

Filter(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    Name = "Makoto Maeda" // 第二引数。取得対象レコードの検索条件を指定します。条件に一致するレコードが取得できます。

)

 

LookUp()・・・レコードを1件取得したいときに!

LookUp()関数を使用するとレコードを1件取得することができます。

複数のレコードが条件に一致する場合には、最初の1件が取得されます。

 

レコードを1件取得する方法

LookUp(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    ID = "1" // 第二引数。取得対象レコードの検索条件を指定します。条件に一致するレコードが取得できます。

)

 

レコードを1件取得して、特定のフィールドを取得する方法

LookUp(

    [データソース], // 第一引数。ExcelSharePointListなどのデータソースを指定します。参照設定できていれば選択肢が出てくるはずです。

    ID = "1"// 第二引数。取得対象レコードの検索条件を指定します。条件に一致するレコードが取得できます。

    Name // 第三引数。省略可能。取得したいフィールドが1つだけの場合は、フィールドを指定することで帯域やメモリの節約、パフォーマンス向上につながります。

)

 

なんかうまくいかないんだけど!?

データソースが選択肢に出てこないときは・・・

データソースが選択肢に出てこないときは、Power Apps にデータソースへの参照設定ができていないかもしれません。

まだ設定していない場合は

[ビュー] > [データソース] > [コネクタ] > [OneDrive for Business]

[ビュー] > [データソース] > [コネクタ] > [SharePoint]

などからデータソースを選んで参照設定しておきましょう。

 

Excelをデータソースにしていて、レコードの登録、更新がうまくいかないときは・・・

データソースにしているExcelをブラウザ等で開いていませんか?

ファイルが開いているとPower Apps からアクセスすることができません。開いているファイルを閉じてもう一度試してみてください。

 

赤いエラーが出てうまくいかないときは・・・

Power Apps は優しいので、エラー解消のヒントを教えてくれています。エラー箇所にカーソルをもっていってエラーメッセージを読んでみましょう。エラー解消の一番の助けになるはずです。

 

まとめ

以上がまず押さえておきたいデータ操作に使う関数です。実は他にもデータ操作に使える関数がありますが、多くのケースでは先に挙げた関数でカバーできると思います。まずはこの関数を扱えるようになりましょう。

Power Apps コレクション 動的に連番コレクションを作成する

コレクションをPower Appsのみ で動的に作成したい場合に使える例をひとつ。

今回挙げるのはループ処理でコレクションを追加していく方法です。

 

コールバック的に使えるSliderを用意する

Power Apps はループ処理系に弱いです。for eachとかfor文とかも使えません。

 

何度も同じ処理をさせたい場合、タイマーコントロールまたはスライダーコントロールを使用すると実現させることができます。

 

今回はスライダーを使用してみます。

 

スライダーを設置しSlider.Valueに適当な変数を指定します。

 

Slider.Value

SliderValue

 

※変数は事前にOnVisibleなどで初期化しておく必要があります。

 

Slider.OnChangeで変数の値を変更する

Slider.OnChange

UpdateContext({SliderValue:SliderValue+1})

 

このようにすると、無限にOnChangeの処理が実行されるようになります。

 

Slider.OnChangeでコレクションに追加する

処理がループで実行されるようになったので、ここでコレクションに追加していきます。

 

Slider.OnChange

Collect(colItems,{Index:SliderValue});

UpdateContext({SliderValue:SliderValue+1});

 

指定した回数で処理をやめる

このままでは無限に実行されてしまうので、条件分岐で変数を変更しない分岐を作ります。

 

Slider.OnChange

Collect(colItems,{Index:SliderValue});

If(

    SliderValue < 10,

    UpdateContext({SliderValue:SliderValue+1})

)

 

上記の例では固定値の10を用いていますが、スライダーやドロップダウンで選択した値を参照させ、ユーザが選択した任意の数字を渡すことも可能です。

 

処理を発火する

処理を発火するには、Sliderコントロールのリセットを行います。

 

Screen.OnVisible

Reset(Slider)

 

これでコレクションを動的に作成することができます。

 

 

スライダーのループ処理については下記のリンクを参考にさせていただきました!

参考URL

#PowerAppsPowerAppsでタイマーコントロールを使わずにタイマーコントロールよりも高速なループを実行する方法

https://qiita.com/github129/items/75f5f83d9842aab89da3

Power Apps DisplayMode.ViewのFormのDataCardに罫線をいれる

DisplayMode.EditFormだとDataCard罫線を出せますが、DisplayMode.ViewFormでは出すことはできません。

プロパティも揃ってて設定もできるのに。一見できそうで歯がゆい・・・。

 

なので、一回諦めましょう。

どうしてもやりたい場合は四角アイコンとか使って人力でやるしかないです。

 

四角アイコンで罫線を再現する

DataCardに四角アイコンを設置することで罫線的なものを再現できます。

ちまちまいれていきましょう。

 

注意点

DataCardのロックを解除しないと挿入できないことと、四角アイコンは再背面に設定することに気をつけて設置してください。

 

感想

出せないのはまだわかるので、項目を非表示にするとかなんかして欲しいですね。

場合によりますが別の案としてDisplayMode.Editで作ってしまうのもありかもです。

PowerApps Gallery.Selectedが取得できないときは・・・

どうも環境によりGallery.Selected正常に動かない場合があるみたいです。

ページの読み込みが完了していない状態でギャラリーを選択した場合や、iOSでの不具合報告もあるようで。

 

安全に取り扱うは、Selectedを使うのをやめてThisItemを変数に格納するようにしたほうがいいかもしれません。

 

同じスクリーンで使用する場合

Gallery.OnSelect

UpdateContext({SelectedItem:ThisItem})

 

遷移先のスクリーンで使用する場合

Gallery.OnSelect

Navigate(Screen2,ScreenTransition.None,{SelectedItem:ThisItem});

 

上記どちらかの方法で代用が可能です。

※複数画面で使用する場合はグローバル変数に入れてください。

 

 

Gallery.Selectedの値が怪しかったら試してみてください。

Power Apps / Power Automate の開発技術支援サービスや1日トレーニングコースを提供しています。

Power Apps や Power Automateに関する仕事のご依頼は下記ページからお問い合わせください。
ZEE CitizenDevSupport