PowerApps|ForAllの使い方と4つの具体例【コピペ可】
PowerAppsで繰り返し処理を実行するためには、
ForAllメソッドを使用します。
ただForAllは、PowerApps特有のメソッドの1つであり、意外と理解しづらいものです。
この記事では、ForAllの基本的な使用方法と具体例を交えた実際の使用方法について紹介していきます。
この記事はこんな人向け
- キャンバスアプリで繰り返し処理を行いたい
- 条件に合致したデータに対して特定の処理を行いたい
- ForAllの使い方がわからない
では、まずは基本的な使用方法から見ていきましょう!
目次(クリックで読みたい部分にジャンプできます)
ForAllの基本的な使用方法
ForAllメソッドは、
テーブルデータの各行に対して一連の操作を行い、その結果から新しいテーブルを生成するために使用されます。
これにより、
- 各要素の修正
- テーブルデータの更新
のようなことが可能になります。
ForAllの基本的な構文
ForAll( Records, Formula )
- Records: 処理対象となるテーブルやコレクション。
- Formula: 各レコードに対して適用する式や操作。
このように書きRecordsの中のデータに対して、Formulaの処理を実行していく流れです。
ForAllと一緒に使う〜ThisRecord, Value, Sequence 〜
ForAll関数を使用するときには、以下の3つのメソッドが登場します。
- ThisRecord
- Value
- Sequence
これらは、ForAll内でセットで用いられるものですので、一緒に覚えておくと書くときにつまづきにくくなります。
ThisRecord = 現在処理中のレコード
ForAllでは、データ内の各レコードに対して処理を行います。
そして、ThisRecordは、現在処理中のレコードを呼び出し全てのフィールドにアクセスができます。
ThisRecordを使用した例
例えば、以下のようなデータ(Productsテーブル)があるとしましょう。
これに対して、ThisRecordを使用して、以下のような式を書きます。
ForAll(Products, {ProductName: ThisRecord.Name, TaxIncludedPrice: ThisRecord.Price * 1.08})
TaxIncludedPrice という値は、ThisRecord(処理中の今のレコード)のPriceをに対して、1.08をかけて、格納しています。
これにより新しく以下のデータが表示されます。
Value = 現在のレコードの数値 , Sequence = ForAllで繰り返す回数を指定
Sequence関数とValueはセットで使われるので、一緒に紹介します。
Sequence関数は、ForAllと一緒に用いることで繰り返す回数を指定することができます。
Valueは繰り返すときにSequenceで与えられた数値を取得することができます。
つまり、ForAllで今何回目を行っているかを取得することができます。
Sequence, Valueを使用した例
以下のようなForAll関数を使った式を書きます。
ForAll(Sequence(10), {Number: Value, CalculatedValue: Value * 10})
Sequenceは、繰り返す回数を指定するので、今回は10回繰り返すことになります。
この式を実行すると以下のような結果が得られます。
このValueという値は、Sequence関数によって生成された数値です。
なので、Sequence関数を使用していない場合は、Valueを用いることはできませんので、注意してくださいね。
では、ここから実際の具体例を紹介していきます。
【具体例①】テーブルデータの更新
あるテーブルに対して、特定のフィールドの値を更新する場合の例です。
以下のようなデータを想定してます。
ID | Name | Price |
---|---|---|
1 | Pen | 100 |
2 | Pencil | 50 |
// テーブルデータの作成
ClearCollect(MyProducts, [{ID: 1, Name: "Pen", Price: 100}, {ID: 2, Name: "Pencil", Price: 50}]);
// Price フィールドの値を10%増加
ForAll(MyProducts, Patch(MyProducts, ThisRecord, {Price: Price * 1.1}))
処理後のデータは以下のようになります。
ID | Name | Price |
---|---|---|
1 | Pen | 110 |
2 | Pencil | 55 |
MyProductsというコレクションに対して、
Priceの値を1.1倍にしています。
Patchメソッドは、レコードを更新するメソッドです。
Patchメソッド = レコードを更新する
突然、Patchメソッドというものが出てきました。
詳しくは今回の主題ではないので書けませんが、
簡単にいうと、特定のテーブルデータの特定のレコードを更新する際に使用するメソッドです。
Patch(対象のテーブルデータ, 対象のレコード, {更新するデータ})
上記のように書くので、今回更新したい対象のレコードをThisRecordによって当てはめています。
ThisRecordは先ほど紹介した「今処理しているレコードのこと」です。
現在処理中のレコードを抽出できることで、Patch関数に当てはめることができます。
【具体例②】結果を新しいコレクションに保存
操作の結果を新しいコレクションに保存することもできます。
これにより、既存のコレクションを変更せずに新しいコレクションの中でデータを加工できます。
OriginalData
// 元のコレクション
ClearCollect(OriginalData, [{Name: "Tom", Score: 80}, {Name: "Jerry", Score: 90}]);
// Score を5点加点し、新しいコレクションに保存
ClearCollect(NewScores, ForAll(OriginalData, {Name: Name, Score: Score + 5}));
NewScores
それぞれのスコアに対して、5点上乗せして新しい「NewScores」に格納しています。
【具体例③】条件に基づく操作
この部分が一番使う頻度が多いかもしれませんが、
すべてのデータに対して繰り返すのではなく、
特定の条件にあったデータのみに対して、データの加工を行いたい場合についてです。
この時は、ForAllの中にIf文を書き込みます。
// 商品リスト
ClearCollect(Products, [{Name: "Apple", Stock: 30}, {Name: "Banana", Stock: 0}, {Name: "Cherry", Stock: 20}]);
// 在庫が0の商品に対して注文を促すメッセージを生成
ForAll(Products, If(Stock <= 0, Concatenate(Name, " is out of stock")))
生成された文字列
このif文によって、
特定の条件にのみ対象のレコードを更新したり、特定の処理を行ったりすることができるようになります。
【具体例④】データに列番号を挿入する
テーブルデータに対して、時には何番目のデータかを挿入したい場合なども考えられます。
その場合は、以下のように書きます。
// 適当なデータを生成
ClearCollect(data, [{Name: "Item1", Value: 10}, {Name: "Item2", Value: 20}]);
With({_items: data},
ForAll(Sequence(CountRows(_items)),
Patch(Index(_items, Value),
{RowNumber:Value}
)
)
)
生成されたデータ
この方法はキャンバスアプリのギャラリーに行番号を振りたい時に活用することができます。
詳しい方法は以下の記事を参考にしてみてください。
まとめ
今回は、ForAllメソッドを用いて、使用方法と具体例をもとに紹介していきました。
またよく使うのが、行番号を振りたい場合などです。
各データには、行番号なるものはなく、自分で実際にForAllを使用して加えていかないといけません。
以下の記事では、その詳しい方法について紹介していますので、ぜひ参考にしてみてくださいね。