BEMAロゴ

エンジニアの
成長を支援する
技術メディア

【Power Apps入門】With関数でコードの可読性とパフォーマンスを劇的に改善!AIコードの「なぜ」を理解する

はじめに 

皆さん、こんにちは。株式会社メンバーズラピッドスケールカンパニーOpen in new tabの大槻幸誠です。

私は現在、Power AppsOpen in new tabを使ったローコード開発で、R社の業務効率化案件に携わっています。Power Appsは、Microsoft社が提供しているローコード開発向けのアプリケーションプラットフォームで、少ない工数でプロダクトを作成できる点が特徴です。

Power Appsは、Microsoft Power PlatformOpen in new tabという統合ローコードプラットフォームの一部であり、Power Platformには他にも業務フロー自動化の Power AutomateOpen in new tab、データ分析の Power BIOpen in new tab、チャットボット作成の CopilotStudioなどのサービスが含まれます。

しかし、複雑なロジックではスクラッチ開発(コードを1から書く開発)と同様に「コードの可読性低下」や「アプリのパフォーマンス悪化」といった課題に直面します。
さらに、Power Platformは日本語の学習リソースが少ないため、AI(Copilotなど)と壁打ちしながら生成したコードを参考にすることも多くなります。

そんな中、先日同僚から「AIはWith関数を頻繁に使うが、なぜコンテキスト変数を使わずにWith関数を使うのか、その明確なメリットが分からない」と相談を受けました。

この相談を機に、With関数のメリットや注意点を改めて調査・整理しました。

With関数は、Power Appsコードの可読性とパフォーマンスを格段に上げてくれる強力な関数です。

「あまり使ってない」「何に使うの?」という方や、AIが生成したコードを正しく理解したいPower Platform開発者や学習者に向けて、「With関数」に焦点を当て、その具体的な使い方とメリットを解説します。
ぜひご一読ください。

1. With関数とは?

Power AppsにてWith関数は、ロジック内で一時的に名前付きのスコープを作成し、そのスコープ内で複雑な計算式やデータ操作などを実行するための関数です。

簡単に言えば、一時的な「変数」のように使える機能です。Power Appsには変数が他にもグローバル変数 (Set) やコンテキスト変数 (UpdateContext) がありますが、With関数はそれらと異なる以下の特徴を持っています。

  • With関数の中で定義した値(変数)は、そのWith関数の中でしか使えない
  • 非動作プロパティ(TextプロパティやItemsプロパティなど表示することが目的のプロパティ)で使用できる

公式ドキュメントでもグローバル変数やコンテキスト変数よりWith関数の使用が推奨されています。

> Withは自己完結型であり、理解しやすく、宣言型の数式コンテキストで使用できるため、コンテキストまたはグローバル変数よりも優先されます。 (“With 関数 - Power Platform”)Open in new tab

2. メリット・デメリット

前項で整理したそれぞれの特徴から、メリットを整理していきます。

スコープが限定されることによる可読性の向上

「スコープが限定される(そこでしか使えない)」という特徴が大きなメリットです。

例えば、コントロールのプロパティ(例: TextInput1.Text)やFilter関数の結果などを、同じ処理(例: Patch関数)の中で何度も呼び出したり、同じ計算を複数回記述したりしますよね。これは、コードの可読性を下げ、パフォーマンスにも影響を与える可能性があります。

かといって、その処理ブロックの中でしか使わない値のためにUpdateContextでコンテキスト変数(画面変数)を定義すると、変数の管理が煩雑になり、意図せず他の場所で使われてしまうリスクも生じます。

With関数を使えば、必要な計算結果や参照に一時的な名前を与え、Withのスコープ内でそれを利用することで、コードがスッキリとし、読みやすくなります。

2-1.例:Patch関数での利用

Patch関数はデータを更新するための関数です。

Before

// Button.OnSelect プロパティ
Patch(
    Invoices,
    Defaults(Invoices),
    {
        Title: "New Invoice",
        定価列: Value(TextInput1.Text),
        税列: Value(TextInput1.Text) * 0.1, 
        合計価格列: Value(TextInput1.Text) + Value(TextInput1.Text) * 0.1
// Value(TextInput1.Text) という記述が4回も登場し、冗長。
    }
);

After

// Button.OnSelect プロパティ
With(
    {
        // 呼び出しを一度にまとめ、計算結果にも分かりやすい名前を付ける
        定価: Value(TextInput1.Text),
        税: Value(TextInput1.Text) * 0.1
    },
    
    // --- Withスコープ内 ---
    // ここでだけ「定価」と「税」が使える
    Patch(
        Invoices,
        Defaults(Invoices),
        {
            Title: "New Invoice",
            定価列: 定価, // 名前を参照するだけ
            税列: 税,   // 名前を参照するだけ
            合計価格列: 定価 + 税 // 計算ロジックが明確
        }
    )
);

非動作プロパティでロジックを完結できる

まず、Power Appsのプロパティには大きく2種類あります。

  • 動作プロパティ (Behavioral Properties): OnSelect (ボタンクリック時) や OnVisible (画面表示時) など、特定のイベント発生時に実行されるもの。UpdateContextMapsなどの命令的な関数が使えます。
  • 非動作プロパティ (Data Properties): Text (ラベルの表示文字) や Items(ギャラリーのデータ) など、常に特定の値を返す(または保持する)もの。原則としてUpdateContextなどは使えません。

With関数は、この「非動作プロパティ」で使えます。

メリットは、「そのコントロールが最終的に何を表示・保持しているのか」という計算ロジックを、そのプロパティ内で完結させやすくなる点です。(Excelで特定のセルの値がどう計算されているか、そのセルの数式バーを見ればわかる感覚に近いです。)

  • Before の例では、計算ロジックがButton.OnSelect(動作プロパティ)にあり、Label.Text(非動作プロパティ)は計算結果の変数FinalPriceを参照しているだけです。これでは、「このラベルの金額はどうやって決まるのか?」を知るために、FinalPriceがどこで更新されているかを探し回る必要があります。
  • After の例では、Label.Textプロパティ内でWithを使い、必要なデータ取得(LookUp)や計算ロジックをその場で定義・実行し、最終的な表示テキストを生成しています。これにより、そのラベルを見れば、計算根拠がわかるようになります。

2-2.例:ラベルの表示テキスト

Before

// 1. Button.OnSelect プロパティ (動作プロパティ)
// データを取得し、計算結果を変数に「あらかじめ」格納
UpdateContext({
    選択された製品: LookUp(Products, ID = varSelectedID),
    割引率: 0.8
});
UpdateContext({
    // 計算ロジックがここにある
    最終価格: 選択された製品.Price  割引率  1.1
});

// 2. Label.Text プロパティ (非動作プロパティ)
// 計算結果の変数を「参照するだけ」
"合計金額: " & Text(最終価格, "[$-ja-JP]¥#,##0")

After


// Label.Text プロパティ (非動作プロパティ)
// このプロパティ内で "UpdateContext" は使えない。
// しかし "With" は使える!
With(
    {
        // 動作プロパティでやるようなデータ取得や計算を「その場で」定義
        選択された製品: LookUp(Products, ID = varSelectedID),
        割引率: 0.8
    },
   
    // --- Withスコープ内 ---
    // 取得した情報を使って、最終的な表示内容を「その場で」計算・整形
    "合計金額: " & 
    Text(
        選択された製品.Price  割引率  1.1, 
        "[$-ja-JP]¥#,##0"
    )
)

⚠️ パフォーマンスに関する注意点

ただし、この「非動作プロパティにロジックを集約する」方法には注意が必要です。

LookUpのようなデータ取得処理や、非常に複雑な計算を、多くのコントロール(例: ギャラリー内のラベル)の非動作プロパティに記述すると、画面が表示されるたび、または関連する値が変更されるたびにその重い処理が実行され、アプリのパフォーマンスを著しく低下させる原因にもなります。

また、一時変数(ローカルスコープ)であるため、UpdateContextやSetで定義した変数と異なり、Power Apps Studioの変数ビューで値を追跡できません。計算の途中の値を確認しにくいといった欠点もあります。

実装する際は、そのロジックが本当にここで実行されるべきか(OnVisibleで一度だけ変数に格納する方が効率的ではないかなど)を評価し、可読性とパフォーマンスのバランスを考慮してから実装してください。

3.まとめ

今回、With関数について改めて調査し、その使い方を整理しました。

With関数は、OnSelectのような動作プロパティはもちろん、Textプロパティのような非動作プロパティ内でも、コードの可読性を劇的に向上させるための非常に強力な機能です。

一方でWith関数は、あくまでコードを読みやすくするための道具です。 アプリのパフォーマンスを決定づけるのは、「どこで重い処理(LookUpFilter)を実行するか」という設計思想です。可読性のためにWithを使いこなしつつも、ギャラリーなどの重い処理が予想される場面では、OnVisibleAddColumnsやコレクションを使って事前処理を行う。このバランス感覚こそが、単に動作するアプリを作るだけでなく、実用的なPower Apps開発における必須スキルだと感じました。

この記事が役に立ったと思ったら、
ぜひ「いいね」とシェアをお願いします!

リンクをコピーXでシェアするfacebookでシェアする

この記事を書いた人

大槻 幸誠
大槻 幸誠
2024年メンバーズに新卒入社。現在はRapidScaleカンパニーに所属し、ローコード開発を行なっている。キャンプが好き。
詳しく見る
ページトップへ戻る