【Power Apps】複数のデータに対してCRUD(コピー/メール送信/更新/削除)処理

# Power Apps 複数のデータに対してCRUD/コピー/メール送信を行う方法

コレクションなどに格納されたテーブル値に対してCRUD(Copy/ma-Rusoushin/Update/Delete)処理を行う方法を紹介します。

## 複数のデータを用意する

https://powerplatformnikki.com/multiselectgal

練習の場合は事前にこちらの記事を参考に、複数選択した結果をコレクションに格納してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2bf4c370-a394-61a9-7b92-dc9c8f105c70.png)

既に処理したいテーブル値がある場合は、適宜読み替えながら実装してみてください。

## モダンコントロールのツールバーを追加・編集する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/c83c4e87-fac5-28ae-4764-fd2aa40b7536.png)

モダンコントロールのツールバーで実装方法を紹介します。プレビューなので、正常性が求められる場合はタブ一覧だったりギャラリーで自作したりしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/8a0c2dd2-d2d0-fc08-2b0d-42a228104ee9.png)

ToolbarのItemsには上記の通り謎の文字列でボタンの定義がされているので、以下の文字列を入力することでその下の画像のような表示になります。

```
Table(
    {
        ItemKey: "copy",
        ItemDisplayName: "コピー",
        ItemIconName: "Copy",
        ItemAppearance: "Subtle",
        ItemIconStyle: "Regular"
    },
    {
        ItemKey: "mail",
        ItemDisplayName: "メール送信",
        ItemIconName: "Mail",
        ItemAppearance: "Subtle",
        ItemIconStyle: "Regular"
    },
    {
        ItemKey: "update",
        ItemDisplayName: "更新",
        ItemIconName: "Save",
        ItemAppearance: "Subtle",
        ItemIconStyle: "Regular"
    },
    {
        ItemKey: "delete",
        ItemDisplayName: "削除",
        ItemIconName: "Delete",
        ItemAppearance: "Subtle",
        ItemIconStyle: "Regular"
    }
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/956691c1-81a9-3088-d9a3-d42f9f2b5791.png)

Toolbarのプロパティの詳細はヨウセイさんの記事をご参照ください。

https://youseibubu.com/apps/modern_toolbar

## CRUDの実装方法

数式の全体は以下です。それぞれ解説します。

```
Switch(
    Self.Selected.ItemKey,
    "copy",
    Patch(
        SampleList,
        ShowColumns(ColCheck, タイトル, 価格)
    ),
    "mail",
    Office365Outlook.SendEmailV2(Concat(ColCheck, 更新者.Email & ";"), "件名ですよ", "本文ですよ"),
    "update",
    ForAll(
        ColCheck,
        UpdateIf(
            SampleList,
            ID = ThisRecord.ID,
            {価格:500}
        )
    ),
    "delete",
    ForAll(
        ColCheck,
        RemoveIf(
            SampleList,
            ID = ThisRecord.ID
        )
    ),
    Notify("Unrecognized button clicked")
)
```

### コピー

選択されているレコードをコピーします。

```
Patch(
    SampleList,
    ShowColumns(ColCheck, タイトル, 価格)
)
```

ShowColumns関数でコピー対象の列を絞らないとエラーになるので注意です。
この例ではタイトル列と価格列の値のみコピー対象としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/456ad208-575d-01af-b3ea-f264bdc91d7d.png)

### メール送信

テーブルの中のメールアドレスなどを保持している列の中のユーザーに対してメール送信します。

```
Office365Outlook.SendEmailV2(Concat(ColCheck, 更新者.Email & ";"), "件名ですよ", "本文ですよ")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/200b2d57-1343-ef0b-776c-81ab2db206a7.png)

Concat関数で複数レコードのメールアドレス値を結合しています。

### 更新

コレクションに格納されているレコードを対象に価格更新列の値を500へ一括更新します。

```
ForAll(
    ColCheck,     
    UpdateIf(
        SampleList,
        ID = ThisRecord.ID,
        {価格:500}
    )
)
```

Dataverseであればinが委任できるので以下の数式になります。

```
UpdateIf(
    SampleList,
    ID in ColCheck.ID,
    {価格:500}
)
```

### 削除

コレクションに格納されているレコードを対象に一括削除します。

```
ForAll(
    ColCheck,     
    RemoveIf(
        SampleList,
        ID = ThisRecord.ID
    )
)
```

Dataverseであればinが委任できるので以下の数式になります。

```
RemoveIf(
    SampleList,
    ID in ColCheck.ID
)
```

## 元記事

https://powerplatformnikki.com/multiprocess/