PowerApps の ForAll 関数ForAll function in PowerApps

値を計算し、テーブルのすべてのレコードに対して操作を実行します。Calculates values and performs actions for all records of a table.

説明Description

ForAll 関数は、テーブルのすべてのレコードについて数式を評価します。The ForAll function evaluates a formula for all records of a table. 数式は、値を計算したり、操作 (データの変更や接続の操作など) を実行したりできます。The formula can calculate a value and/or perform actions, such as modifying data or working with a connection.

現在処理中のレコードのフィールドを数式で利用できます。Fields of the record currently being processed are available within the formula. その他の値と同じように、名前で参照するだけです。You simply reference them by name as you would any other value. アプリ全体から、コントロール プロパティとその他の値も参照できます。You can also reference control properties and other values from throughout your app. 詳細については、後述する例とレコード スコープの操作を参照してください。For more details, see the examples below and working with record scope.

戻り値Return value

各数式の評価結果はテーブルで返され、その順序は入力テーブルと同じです。The result of each formula evaluation is returned in a table, in the same order as the input table.

数式の結果が単一の値の場合、結果として返されるテーブルは単一列テーブルになります。If the result of the formula is a single value, the resulting table will be a single column table. 数式の結果がレコードの場合、結果として返されるテーブルには、結果のレコードと同じ列を含むレコードが格納されます。If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

数式の結果が "空白" 値の場合、その入力レコードに対応するレコードが結果テーブルに存在しません。If the result of the formula is a blank value, then there will be no record in the result table for that input record. この場合、結果テーブル内のレコード数は元のテーブルよりも少なくなります。In this case, there will be fewer records in the result table than the source table.

操作の実行Taking action

この数式には、Patch 関数と Collect 関数によるデータ ソースのレコードの変更など、操作を実行する関数を含めることができます。The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. また、この数式は、接続に対してメソッドを呼び出すこともできます。The formula can also call methods on connections. ; 演算子を使用すると、レコードごとに複数の操作を実行できます。Multiple actions can be performed per record by using the ; operator. ForAll 関数の対象であるテーブルを変更することはできません。You can't modify the table that is the subject of the ForAll function.

数式を記述する際、レコードはどのような順序でも (可能な場合は並行して) 処理できることに注意してください。When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. テーブルの最初のレコードが最後のレコードの後に処理される場合があります。The first record of the table may be processed after the last record. 順序に依存しないように注意してください。Take care to avoid ordering dependencies. このため、UpdateContextClearClearCollect 関数を ForAll 関数内で使用することはできません。これらの関数は、この影響を受けやすい変数を保持するために簡単に使用できる可能性があります。For this reason, you can't use the UpdateContext, Clear, and ClearCollect functions within a ForAll function because they could easily be used to hold variables that would be susceptible to this effect. Collect を使用することはできますが、レコードが追加される順序は定義されていません。You can use Collect, but the order in which records are added is undefined.

CollectRemoveUpdate など、データ ソースを変更するいくつかの関数は、戻り値として変更後のデータ ソースを返します。Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. このような戻り値は大きくなり、ForAll テーブルのレコードごとに返される場合に多くのリソースを使用する可能性があります。These return values can be large and consume significant resources if returned for every record of the ForAll table. また、これらの戻り値が予想したものとは異なることに気付く場合もあります。これは、ForAll が並行して動作できることで、これらの関数の副作用が結果の取得から切り離される可能性があるためです。You may also find that these return values are not what you expect, because ForAll can operate in parallel and may separate the side effects of these functions from obtaining their result. さいわいにも、ForAll からの戻り値が実際には使用されない場合 (データ変更関数の場合によく見られます)、戻り値は作成されないため、リソースまたは順序付けに関する懸念事項はありません。Fortunately, if the return value from ForAll is not actually used, which is often the case with data modification functions, then the return value will not be created and there are no resource or ordering concerns. ただし、ForAll の結果やデータ ソースを返す関数のいずれかを使用している場合は、結果の構築方法について慎重に考えて、最初は小さいデータ セットで試してください。But if you are using the result of a ForAll and one of the functions that returns a data source, think carefully about how you structure the result and try it out first on small data sets.

代替手段Alternatives

PowerApps の多くの関数は、単一列テーブルを利用して複数の値を一度に処理することができます。Many functions in PowerApps can process more than one value at a time through the use of a single-column table. たとえば、Len 関数は、テキスト値のテーブルを処理して、ForAll と同じように、長さのテーブルを返すことができます。For example, the Len function can process a table of text values, returning a table of lengths, in the same manner that ForAll could. これにより、多くの場合は ForAll を使用する必要性がなくなり、効率が向上し、読みやすくなります。This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

もう 1 つの考慮事項は、ForAll が委任できないのに対して、Filter などの他の関数は委任できることです。Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

委任Delegation

この関数は、データ ソースに対して使用した場合、委任できません。When used with a data source, this function can't be delegated. データ ソースの先頭の部分のみが取得され、関数が適用されます。Only the first portion of the data source will be retrieved and then the function applied. 結果は完全でない場合があります。The result may not represent the complete story. 作成時に、この制限について通知し、可能であれば委任可能な代替関数への切り替えを提案する青い点が表示されます。A blue dot will appear at authoring time to remind you of this limitation and to suggest switching to delegable alternatives where possible. 詳細については、委任の概要に関する記事を参照してください。For more information, see the delegation overview.

構文Syntax

ForAll( Table, Formula )ForAll( Table, Formula )

  • Table - 必須。Table - Required. 操作対象のテーブル。Table to be acted upon.
  • Formula - 必須。Formula - Required. Table のすべてのレコードについて評価する数式。The formula to evaluate for all records of the Table.

Examples

計算Calculations

次の例では、Squares データ ソースを使用します。The following examples use the Squares data source:

このデータ ソースをコレクションとして作成するには、ボタン コントロールの OnSelect プロパティをこの数式に設定し、プレビュー モードを開始して、ボタンをクリックまたはタップします。To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Squares, [ "1", "4", "9" ] )ClearCollect( Squares, [ "1", "4", "9" ] )
数式Formula 説明Description 結果Result
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
入力テーブルのすべてのレコードについて、Value 列の平方根を計算します。For all the records of the input table, calculates the square root of the Value column. Sqrt 関数も単一列テーブルで使用できます。これにより、ForAll を使用しなくてもこの例を実行できます。The Sqrt function can also be used with a single-column table, making it possible perform this example without using ForAll.
ForAll( Squares, Power( Value, 3 ) )ForAll( Squares, Power( Value, 3 ) ) 入力テーブルのすべてのレコードについて、Value 列の 3 乗を計算します。For all the records of the input table, raises the Value column to the third power. Power 関数は、単一列テーブルをサポートしていません。The Power function does not support single-column tables. そのため、この場合は、ForAll を使用する必要があります。Therefore, ForAll must be used in this case.

接続の使用Using a connection

次の例では、Expressions データ ソースを使用します。The following examples use the Expressions data source:

このデータ ソースをコレクションとして作成するには、ボタン コントロールの OnSelect プロパティをこの数式に設定し、プレビュー モードを開始して、ボタンをクリックまたはタップします。To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

この例では、Microsoft Translator 接続も使用します。This example also uses a Microsoft Translator connection. アプリにこの接続を追加するには、接続を管理する方法に関するトピックを参照してください。To add this connection to your app, see the topic about how to manage connections.

数式Formula 説明Description 結果Result
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Expressions テーブルのすべてのレコードについて、Value 列の内容をスペイン語 (略語は "es") に翻訳します。For all the records in the Expressions table, translate the contents of the Value column into Spanish (abbreviated "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Expressions テーブルのすべてのレコードについて、Value 列の内容をフランス語 (略語は "fr") に翻訳します。For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

テーブルのコピーCopying a table

場合によっては、データのフィルター処理、形成、並べ替え、操作が必要になります。Sometimes you need to filter, shape, sort, and manipulate data. PowerApps には、FilterAddColumnsSort など、この処理を行うための多数の関数が用意されています。PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps では、各テーブルが値として扱われるため、これは数式にの対象として簡単に使用できるようになります。PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

さらに、後で使用できるように、この結果のコピーを作成する場合があります。And sometime you will want to make a copy of this result for later use. また、データ ソース間で情報を移動する場合もあります。Or you will want to move information from one data source to another. PowerApps には、データをコピーするための Collect 関数が用意されています。PowerApps provides the Collect function to copy data.

ただし、コピーを作成する前に、本当に必要かどうかを十分検討してください。But before you make that copy, think carefully if it is really needed. 数式で必要に応じて基のデータ ソースのフィルター処理や形成を行うことで、多くの状況に対処することができます。Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. コピーの作成の欠点のいくつかを次に示します。Some of the downsides to making a copy include:

  • 同じ情報のコピーが 2 部あるということは、そのうち一方が同期されなくなる可能性があることを意味します。Two copies of the same information means that one of them can fall out of sync.
  • コピーの作成では、多くのコンピューター メモリ、ネットワーク帯域幅、時間が使用される可能性があります。Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • ほとんどのデータ ソースでは、コピーを委任できないため、移動できるデータ量は制限されます。For most data sources, copying cannot be delegated, limiting how much data can be moved.

次の例では、Products データ ソースを使用します。The following examples use the Products data source:

このデータ ソースをコレクションとして作成するには、ボタン コントロールの OnSelect プロパティをこの数式に設定し、プレビュー モードを開始して、ボタンをクリックまたはタップします。To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Products, Table( { Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 }, { Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 }, { Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 }, { Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 } ) )ClearCollect( Products, Table( { Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 }, { Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 }, { Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 }, { Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 } ) )

ここでの目的は、リクエストされた数量が在庫数量を超えているアイテムのみが含まれる派生テーブルを操作することです。そのためには、注文する必要があります。Our goal is to work with a derivative table that includes only the items where more has been requested than is available, and for which we need to place an order:

このタスクはさまざまな方法で実行できます。すべての方法には、さまざまな長所と短所がありますが、結果は同じになります。We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

要求に応じたテーブルの整形Table shaping on demand

そのコピーを作成しないでください。Don't make that copy! 必要であればどこでも次の数式を使用できます。We can use the following formula anywhere we need:

  • ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )

レコード スコープは、それぞれ各レコードの 'Quantity Requested' フィールドと 'Quantity Available' フィールドを使用して比較操作と減算操作を実行する Filter 関数と AddColumns 関数によって作成されます。A record scope is created by the Filter and AddColumns functions to perform the comparison and subtraction operations, respectively, with the 'Quantity Requested' and 'Quantity Available' fields of each record.

この例では、Filter 関数を委任できます。In this example, the Filter function can be delegated. これは、条件を満たすすべての製品を検出できるため、テーブルの多数のレコードのうちほんのわずかであっても、重要です。This is important, as it can find all the products that meet the criteria, even if that is only a few records out of a table of millions. この時点では、ShowColumnsAddColumns を委任できません。そのため、注文する必要がある製品の実際の数は制限されます。At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. この結果のサイズが常に比較的小さくなることがわかれば、この方法で十分です。If you know the size of this result will always be relatively small, this approach is fine.

また、コピーを作成しなかったため、ほかに管理したり古くなったりする情報のコピーはありません。And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

要求に応じた ForAllForAll on demand

別の方法として、テーブル整形関数の代わりに ForAll 関数を使用します。Another approach is to use the ForAll function to replace the table-shaping functions:

  • ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )

この数式は、一部の人にとって読み書きしやすくなっている場合があります。This formula may be simpler for some people to read and write.

ForAll のどの部分も委任できません。No part of the ForAll is delegable. Products テーブルの最初の部分のみが評価されますが、このテーブルが非常に大きい場合は問題になることがあります。Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Filter は、前の例では委任できたので、大きなデータ セットではより有効に動作する可能性があります。Because Filter could be delegated in the previous example, it could work better with large data sets.

結果の収集Collect the result

場合によっては、データのコピーが必要になることがあります。In some situations, a copy of data may be required. データ ソース間で情報を移動することが必要になる場合もあります。You may need to move information from one data source to another. この例では、ベンダーのシステム上の NewOrder テーブルから注文が行われます。In this example, orders are placed through a NewOrder table on a vendor's system. ユーザー操作の速度を上げるために、サーバーの待ち時間が発生しないようにテーブルのローカル コピーをキャッシュすることもできます。For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

ここでは、前の 2 つの例と同じテーブル整形を使用しますが、結果をコレクションにキャプチャします。We use the same table shaping as the previous two examples, but we capture the result into a collection:

  • ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )
  • ClearCollect( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )ClearCollect( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

ClearCollectCollect は委任できません。ClearCollect and Collect can't be delegated. その結果、この方法で移動できるデータの量は制限されます。As a result the amount of data that can be moved in this manner is limited.

ForAll 内での収集Collect within ForAll

最後に、ForAll 内で直接 Collect を実行できます。Finally, we can perform the Collect directly within the ForAll:

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

繰り返しますが、この時点で ForAll 関数を委任することはできません。Again, the ForAll function can't be delegated at this time. Products テーブルが大きい場合、ForAll は先頭のレコード セットのみを参照するため、注文する必要がある製品をいくつか見落とす可能性があります。If our Products table is large, ForAll will look at the first set of records only and we may miss some products that need to be ordered. ただし、小さいままであることがわかっているテーブルの場合は、この方法が適しています。But for tables that we know will remain small, this approach is fine.

ForAll の結果をキャプチャしていないことに注意してください。Note that we are not capturing the result of the ForAll. その関数の中から行われた Collect 関数の呼び出しにより、すべてのレコードに対して NewOrder データ ソースが返されるため、キャプチャした場合は最終的に大量のデータが生じることになります。The Collect function calls made from within it will return the NewOrder data source for all the records, which could add up to a lot of data if we were capturing it.