Power Apps での ForAll 関数

値を計算し、テーブル のすべてのレコード にアクションを実行します。

内容

ForAll 関数は、テーブルのすべてのレコードの数式を評価します。 数式は、値を計算したり、操作 (データの変更や接続の操作など) を実行したりできます。 With 関数 を使用して、単一レコードの数式を評価します。

現在処理されているレコードのフィールドは、この数式内で使用できます。 その他の値と同じように、名前でそれらを参照できます。 また、アプリ全体からのコントロール プロパティやその他の値を参照することもできます。 詳しくは、以下の例と「レコードのスコープに関する作業」を参照してください。

戻り値

各数式の評価結果は、入力テーブルと同じ順序でテーブルに返されます。

数式の結果が単一の値の場合は、結果のテーブルは単一列テーブルになります。 数式の結果がレコードの場合、結果のテーブルには、結果のレコードと同じ列を持つレコードが含まれます。

数式の結果が空白値の場合、レコードがその入力レコードの結果テーブルに存在していません。 この場合、結果テーブルのレコードはソース テーブルよりも少なくなります。

アクションの実行

数式には、Patch および Collect 関数を用いてデータ ソースのレコードの変更など、アクションを実行する関数を含めることができます。 数式は、接続に対してメソッドを呼び出すこともできます。 ; 演算子 を使用して、複数のアクションをレコードごとに実行できます。 ForAll 関数の対象となるテーブルを変更することはできません。

数式を記述する場合、レコードは任意の順序で、可能な場合は並行して、処理できることに注意してください。 テーブルの最初のレコードが最後のレコードの後に処理される場合があります。 順序の依存関係を避けるように注意してください。 したがって、UpdateContextClear、および ClearCollect 関数は、効果の影響を受けやすい変数を保持するために簡単に使用できるため、 ForAll 関数で使用することはできません。 Collect を使用することはできますが、レコードが追加される順序は定義されていません。

CollectRemove、および Update を含むデータ ソースを変更する複数の関数は、変更されたデータ ソースを戻り値として返します。 これらの戻り値は大きく、ForAll テーブルのすべてのレコードに対して返された場合、かなりのリソースを使用する可能性があります。 また、ForAll が並行して動作でき、および結果の取得からこれらの関数の副作用を切り離す場合があるので、これらの戻り値が予想どおりのものではないこともあります。 幸いにも、データ変更関数によくありますが、ForAll からの戻り値が実際に使用されていない場合、戻り値は作成されず、リソースまたは順序の懸念はありません。 ただし、ForAll の結果およびデータ ソースを返す関数のいずれかを使用している場合、結果の構造方法について十分検討し、最初は小さいデータ セットで試してください。

代替手段

Power Apps の多くの関数は、単一列テーブルを使用して一度に複数の値を処理することができます。 たとえば、Len 関数はテキスト値のテーブルを処理して、ForAll の場合と同じように長さのテーブルを返すことができます。 これにより、多くの場合 ForAll を使用する必要がなくなり、より効率的、およびより読み取りやすくなります。

別の考慮事項は、ForAll が委任可能ではないのに対して、Filter などの他の関数は可能であることです。

委任

データ ソースと共に使用する場合、この関数は委任できません。 データ ソースの最初の部分のみが取得され、その後にその関数が適用されます。 結果は完全なストーリーを表さない場合があります。 この制限が存在することを知らせ、可能であれば委任できる代替の選択肢に切り替えるように提案する警告が、作成時に表示される場合があります。 詳しくは、「委任の概要」を参照してください。

構文

ForAll( Table, Formula )

  • Table - 必須。 操作されるテーブル。
  • Formula - 必須。 Table のすべてのレコードに関して評価する数式。

計算

次の例では、平方データ ソース を使用します。

このデータ ソースをコレクションとして作成するには、Button コントロールの OnSelect プロパティを次の数式に設定し、プレビュー モードを開き、次にボタンをクリックまたはタップします。

ClearCollect( Squares, [ "1", "4", "9" ] )

計算式 内容 結果
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
入力テーブルのすべてのレコードについて、列の平方根を計算します。 Sqrt 関数は単一列テーブルでも使用できるので、ForAll を使用しないでこの例を実行することができます。
ForAll( Squares, Power( Value, 3 ) ) 入力テーブルのすべてのレコードについて、列を三乗します。 Power 関数は、単一列テーブルをサポートしていません。 したがって、この場合は、ForAll を使用する必要があります。

接続の使用

次の例では、Expressions データ ソース を使用します。

このデータ ソースをコレクションとして作成するには、Button コントロールの OnSelect プロパティを次の数式に設定し、プレビュー モードを開き、次にボタンをクリックまたはタップします。

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

この例では、Microsoft Translator 接続も使用します。 アプリにこの接続を追加するには、接続を管理する 方法に関するトピックを参照してください。

計算式 内容 結果
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Expressions テーブルのすべてのレコードについて、Value 列の内容をスペイン語 (省略形 "es") に翻訳します。
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Expressions テーブルのすべてのレコードについて、Value 列の内容をフランス語 (省略形 "es") に翻訳します。

テーブルのコピー

場合によっては、データをフィルター処理、整形、並べ替え、および操作する必要があります。 Power Apps では、FilterAddColumns、および Sort など、これを実行するためのいくつかの関数が提供されています。 Power Apps では、各テーブルを値として扱い、簡単に使用できるようにします。

さらに、後で使用できるように、この結果のコピーを作成することが可能です。 または、データ ソースから別の場所に情報を移動することも可能です。 Power Apps では、データをコピーするため Collect 関数 を提供しています。

ただし、コピーを作成する前に、本当に必要かどうかを十分検討してください。 要求に応じて、数式を使用して基になるデータ ソースのフィルター処理および整形を行うことにより、多くの状況に対処することができます。 コピーの作成のいくつかの欠点を次に示します。

  • 同じ情報のコピーが 2 つあるということは、そのうち一方が同期されなくなる可能性があることを意味します。
  • コピーの作成では、多くのコンピューター メモリ、ネットワーク帯域幅、および/または時間が消費される可能性があります。
  • ほとんどのデータ ソースでは、コピーを委任できず、移動できるデータ量を制限します。

次の例では、製品データ ソース を使用しています。

このデータ ソースをコレクションとして作成するには、Button コントロールの OnSelect プロパティを次の数式に設定し、プレビュー モードを開き、次にボタンをクリックまたはタップします。

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 } 
    )
)

目標は、利用可能よりも多く要求され、そのため注文をする必要があるアイテムのみを含む派生テーブルを使用することです。

このタスクは、すべてがさまざまな長所と短所があって同じ結果を生み出すいくつかの異なる方法で実行できます。

要求に応じたテーブルの整形

そのコピーを作成しないでください! 必要であればどこでも次の数式を使用できます。

// Table shaping on demand, no need for a copy of the result
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 関数によって作成されます。

この例では、Filter 関数を委任できます。 たとえそれが多数のテーブルのうちのわずか少数のレコードであっても、条件を満たすすべての製品を見つけることができるので、これは重要です。 現時点では、ShowColumns および AddColumns は委任できないため、注文する必要がある製品の実際の数は制限されます。 この結果のサイズが常に比較的小さいことを分かっている場合、この方法で問題ありません。

および、コピーを作成しなかったため、管理するまたは古くなる情報の追加のコピーはありません。

要求に応じた ForAll

別の方法として、ForAll 関数を使用して、テーブル整形関数を置き換えます。

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

この数式は、一部のユーザーにとって読み取りおよび書き込みが容易な可能性があります。

ForAll のどんな部分も委任できません。 製品テーブルの最初の部分のみが評価されますが、このテーブルが非常に大きい場合は問題になることがあります。 前の例で、Filter は委任することができたので、大規模なデータ セットではよりよく機能する可能性があります。

結果の収集

場合によっては、データのコピーが必要な場合があります。 データ ソースから別の場所に情報を移動することが必要になる場合もあります。 この例では、ベンダーのシステムで NewOrder テーブルによって注文を行います。 高速なユーザー対話のために、ローカル コピーをキャッシュして、サーバーの待機時間が発生しないようにすることが必要な場合があります。

前の 2 つの例と同じテーブル整形を使用しますが、結果をコレクションに取り込みます。

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 および Collect は委任できません。 そのため、この方法で移動できるデータの量は制限されます。

ForAll 内での収集

最後に、ForAll 内で直接 Collect を実行できます。

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

やはり、この時点では ForAll 関数は委任できません。 製品テーブルが大きい場合、ForAll は最初のレコードのセットのみを参照して、注文が必要な一部の製品を見逃す可能性があります。 ただし、小さいままであることが分かっているテーブルの場合は、この方法で十分です。

ForAll の結果を取り込んでいないことに注意してください。 その中から行なわれた Collect 関数の呼び出しは、すべてのレコードに対して NewOrder データ ソースを返し、取り込んだ場合は大量のデータに達することがあります。