ブログ記事

Power Apps

メールボックス検索画面(Screen1)の作成手順

  1. データソースの接続
1. 左側のメニューから「データ」を選択
2. 「データソースの追加」をクリック
3. 「SharePoint」を選択
4. 対象のSharePointサイトを選択
5. 以下の2つのリストを選択して接続
- 業務用メールボックス一覧
- 業務用メールボックス利用者一覧
  1. 検索画面の作成
1. 「画面の追加」で新しい画面を作成
2. 画面名を「Screen1」に設定
  1. 検索用テキストボックスの配置
1. 「挿入」→「テキスト入力」を選択
2. プロパティを設定:
- Name: TextSearchBox
- HintText: "メールアドレスを入力してください"
- OnChange:
If(
Len(TextSearchBox.Text) > 0,
Set(
varSearchResults,
Filter(
'業務用メールボックス一覧',
StartsWith(メールアドレス, TextSearchBox.Text)
)
)
)
  1. 検索結果表示用ギャラリーの配置
1. 「挿入」→「垂直ギャラリー」を選択
2. ギャラリーの基本設定:
- Items: Filter(
'業務用メールボックス一覧',
StartsWith(メールアドレス, TextSearchBox.Text)
)
- OnSelect:
Set(varSelectedMailbox, ThisItem);
UpdateContext({showActionButtons: true})

3. ギャラリーのテンプレートをカスタマイズ:
- ギャラリーを選択
- 右側の「テンプレートのカスタマイズ」をクリック
- ラベルを配置し、以下を設定:
- Text: ThisItem.メールアドレス
  1. アクションボタンの配置
1. 「挿入」→「ボタン」で2つのボタンを配置

2. 利用者登録ボタンの設定:
- Text: "利用者登録"
- Visible: showActionButtons
- OnSelect: Navigate(Screen2, None)

3. 利用者削除ボタンの設定:
- Text: "利用者削除"
- Visible: showActionButtons
  1. レイアウトの調整
1. テキストボックスを画面上部に配置
2. ギャラリーをテキストボックスの下に配置
3. 2つのボタンをギャラリーの下に横並びで配置
  1. 動作確認
1. 「プレビュー」ボタンをクリック
2. 以下を確認:
- メールアドレスの入力で検索結果が表示されるか
- 検索結果をクリックするとボタンが表示されるか
- ボタンクリックで画面遷移するか
  1. エラー処理の追加
検索テキストボックスのOnChangeプロパティに追加:
If(
IsEmpty(TextSearchBox.Text),
UpdateContext({showActionButtons: false})
)

メンバーシップ画面(Screen2)の作成手順

  1. 画面の追加
1. 左側の「Tree view」から「New screen」をクリック
2. 「Blank screen」を選択
3. 画面名を「Screen2」に設定
  1. 画面タイトルの配置
1. 「挿入」→「ラベル」を選択
2. プロパティを設定:
- Text: varSelectedMailbox.メールアドレス & " のメンバー一覧"
- Font size: 20
- Position: 上部中央
  1. 既存メンバー一覧表示用ギャラリーの配置
1. 「挿入」→「垂直ギャラリー」を選択
2. ギャラリーの基本設定:
- Name: MembershipGallery
- Items: Filter(
'業務用メールボックス利用者一覧',
メールボックスID = varSelectedMailbox.ID
)

3. ギャラリーのテンプレートをカスタマイズ:
- ギャラリーを選択して「テンプレートのカスタマイズ」をクリック
- ラベルを配置:
Text: ThisItem.メールアドレス
- 右側に削除アイコンを追加(オプション):
- 「挿入」→「アイコン」→「削除」を選択
- OnSelect: Remove(
'業務用メールボックス利用者一覧',
ThisItem
)
  1. メンバー追加用のプラスマークボタンの配置
1. 「挿入」→「アイコン」→「追加」を選択
2. プロパティを設定:
- Position: ギャラリーの下
- Size: 40
- OnSelect: UpdateContext({showAddUserForm: true})
  1. メンバー追加フォームの作成(同じ画面内に配置)
1. 「挿入」→「フォーム」を選択
2. フォームのプロパティ設定:
- Name: AddUserForm
- Visible: showAddUserForm
- DataSource: '業務用メールボックス利用者一覧'

3. フォーム内にテキスト入力を配置:
- 「挿入」→「テキスト入力」
- Name: NewUserEmailInput
- HintText: "追加するメールアドレスを入力"

4. 決定ボタンを配置:
- Text: "決定"
- OnSelect:
Set(varNewUserEmail, NewUserEmailInput.Text);
Navigate(Screen3, None)
  1. 戻るボタンの配置
1. 「挿入」→「アイコン」→「戻る」を選択
2. プロパティを設定:
- Position: 左上
- OnSelect: Navigate(Screen1, None)
  1. レイアウトの調整
1. 画面要素の配置順序:
- 戻るボタン(左上)
- タイトル(上部中央)
- メンバー一覧ギャラリー(中央)
- プラスマークボタン(ギャラリーの下)
- 追加フォーム(プラスマーク押下時に表示)

2. スペーシングの設定:
- Padding: 20
- Gap between items: 10
  1. 条件付き表示の設定
1. フォームの表示制御:
- AddUserForm.Visible: showAddUserForm

2. エラー表示の追加:
If(
IsEmpty(MembershipGallery.Items),
UpdateContext({showNoMembersMessage: true})
)
  1. エラーメッセージの追加
1. 「挿入」→「ラベル」を選択
2. プロパティを設定:
- Visible: showNoMembersMessage
- Text: "メンバーが登録されていません"
- Color: グレー
  1. 動作確認
1. プレビューモードで以下を確認:
- メンバー一覧が正しく表示されるか
- プラスマークで追加フォームが表示されるか
- 戻るボタンで前の画面に戻れるか
- メールアドレス入力後、確認画面に遷移するか
  1. パフォーマンス最適化
1. OnVisible プロパティに以下を設定:
Clear(varNewUserEmail);
UpdateContext({showAddUserForm: false})

メンバーシップ画面(Screen2)の作成手順-修正版

  1. 追加用のコレクション変数の設定
Copy1. App OnStartで以下を設定:
   ClearCollect(
       colNewUsers,  // 追加予定のメールアドレスを保持するコレクション
       []
   )
  1. メンバー追加フォームの修正
Copy1. フォームの設定修正:
   Name: AddUserForm
   Visible: showAddUserForm

2. テキスト入力ボックスの設定:
   Name: NewUserEmailInput
   HintText: "追加するメールアドレスを入力"
   Reset: true  // 入力後にクリアする

3. 決定ボタンの設定:
   Text: "追加"
   OnSelect: |
      Collect(
          colNewUsers,
          {
              mailAddress: NewUserEmailInput.Text,
              timestamp: Now()
          }
      );
      Reset(NewUserEmailInput);
      UpdateContext({showNewUserList: true})
  1. 追加したメールアドレス一覧表示用ギャラリーの配置
Copy1. 「挿入」→「垂直ギャラリー」を選択
2. ギャラリーの設定:
   Name: NewUsersGallery
   Items: colNewUsers
   Visible: showNewUserList

3. ギャラリーのテンプレートをカスタマイズ:
   - メールアドレス表示用ラベル:
     Text: ThisItem.mailAddress
   
   - 削除アイコン:
     Icon: Cancel
     OnSelect: |
        Remove(
            colNewUsers,
            ThisItem
        )
  1. 一括登録ボタンの配置
Copy1. 「挿入」→「ボタン」を選択
2. ボタンの設定:
   Text: "これらのメールアドレスを登録"
   Visible: !IsEmpty(colNewUsers)
   OnSelect: Navigate(Screen3, None)  // 確認画面へ遷移
  1. 確認画面(Screen3)の修正
Copy1. 確認メッセージラベル:
   Text: "以下のメールアドレスを登録しますか?"

2. 追加予定一覧表示用ギャラリー:
   Items: colNewUsers
   テンプレート内のラベル:
     Text: ThisItem.mailAddress

3. OKボタン:
   OnSelect: |
      ForAll(
          colNewUsers,
          Patch(
              '業務用メールボックス利用者一覧',
              Defaults('業務用メールボックス利用者一覧'),
              {
                  メールボックスID: varSelectedMailbox.ID,
                  メールアドレス: ThisItem.mailAddress
              }
          )
      );
      Clear(colNewUsers);
      Navigate(Screen4, None)  // 完了画面へ
  1. エラー処理の追加
Copy1. メールアドレス重複チェック:
   決定ボタンのOnSelectに追加:
   If(
       CountRows(
           Filter(
               colNewUsers,
               mailAddress = NewUserEmailInput.Text
           )
       ) > 0,
       Notify("このメールアドレスは既に追加されています", NotificationType.Warning),
       // 既存の追加処理
   )

2. 入力値の検証:
   If(
       IsMatch(
           NewUserEmailInput.Text,
           "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
       ),
       // 既存の追加処理,
       Notify("有効なメールアドレスを入力してください", NotificationType.Warning)
   )

この実装により:

  • メールアドレスを1件ずつ追加できる
  • 追加したメールアドレスの一覧が表示される
  • 追加したメールアドレスを個別に削除できる
  • すべての追加が完了したら一括で登録できる
  • 重複や無効なメールアドレスのチェックができる

実装時のポイント:

  1. colNewUsers コレクションは一時的なデータ保持用で、確定するまでSharePointには保存されません
  2. 画面遷移時にもコレクションは保持されます
  3. 登録完了後はコレクションをクリアして再利用可能な状態にします

この機能を実装後、以下の動作確認をお勧めします:

  • 複数のメールアドレスを連続して追加できるか
  • 追加したメールアドレスが正しく一覧表示されるか
  • 個別の削除が機能するか
  • 一括登録が正しく動作するか
  • エラー処理が適切に機能するか

Screen2のメールアドレス追加処理の修正

Copy// メールアドレス入力フォームの設定
1. 「追加」ボタンのOnSelectプロパティを以下のように設定:

OnSelect: |
    // メールアドレスの形式チェック
    If(
        !IsMatch(
            NewUserEmailInput.Text,
            "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
        ),
        // メールアドレスの形式が不正な場合
        Notify("有効なメールアドレスを入力してください", NotificationType.Error),
        // メールアドレスの形式が正しい場合は重複チェック
        If(
            // 既存メンバーとの重複チェック
            CountRows(
                Filter(
                    '業務用メールボックス利用者一覧',
                    メールボックスID = varSelectedMailbox.ID &&
                    メールアドレス = NewUserEmailInput.Text
                )
            ) > 0,
            // 既存メンバーと重複している場合
            Notify("このメールアドレスは既に登録されています", NotificationType.Warning),
            // 追加予定リストとの重複チェック
            If(
                CountRows(
                    Filter(
                        colNewUsers,
                        mailAddress = NewUserEmailInput.Text
                    )
                ) > 0,
                // 追加予定リストと重複している場合
                Notify("このメールアドレスは既に追加予定リストにあります", NotificationType.Warning),
                // すべてのチェックをパスした場合、追加処理を実行
                Collect(
                    colNewUsers,
                    {
                        mailAddress: NewUserEmailInput.Text,
                        timestamp: Now()
                    }
                );
                Reset(NewUserEmailInput);
                UpdateContext({showNewUserList: true})
            )
        )
    )

このエラー処理では以下をチェックします:

  1. また、進捗状況を確認したい場合は、以下のように書くこともできます:
powershellCopy$chunkSize = 1MB
$totalSize = 1GB
$chunks = $totalSize / $chunkSize
$bytes = New-Object byte[] $chunkSize

$fs = New-Object System.IO.FileStream("large_file.bin", [System.IO.FileMode]::Create)
for ($i = 0; $i -lt $chunks; $i++) {
    $fs.Write($bytes, 0, $bytes.Length)
    Write-Progress -Activity "Creating large file" -Status "$([Math]::Round(($i/$chunks)*100))% Complete" -PercentComplete ($i/$chunks*100)
}
$fs.Close()
Write-Progress -Activity "Creating large file" -Completed

このコードでは、.bin拡張子を使用していますが、.dat.img.isoなどの他の拡張子も使用可能です。選択する拡張子は用途に応じて変更してください。

DataverseとSharePointの同期設定手順

Dataverseの「行を一覧する」のフィルター行に以下のように設定します:

createdon gt '2025-01-14T08:26:13Z' or modifiedon gt '2025-01-14T08:26:13Z'

この日時を動的に設定するには:

  1. まず、「式の追加」(fx)で現在時刻から1日前を計算:
formatDateTime(addDays(utcNow(), -1), 'yyyy-MM-ddTHH:mm:ssZ')
  1. この式の結果を使って、フィルター行を構築:
createdon gt '@{formatDateTime(addDays(utcNow(), -1), 'yyyy-MM-ddTHH:mm:ssZ')}' or modifiedon gt '@{formatDateTime(addDays(utcNow(), -1), 'yyyy-MM-ddTHH:mm:ssZ')}'

ポイント:

  • formatDateTime 関数で、Dataverseが期待する形式(ISO 8601形式)に変換
  • addDays(utcNow(), -1) で現在時刻から1日前を計算
  • フィルター内で動的な値を使用する場合は @{式} の形式で囲む

これにより、フローの実行時刻を基準に、過去24時間以内に作成または更新されたレコードを取得できます。

コメント