【Power Apps】添付ファイルをPower Automateで処理

  • 添付ファイルをPower Automateで処理
    添付ファイルをPower Appsでデータソースとして登録せずにPower Automateで処理する方法。

    添付ファイルコントローラーはデータソースに一時的にShare Pointを追加し
    Formを作ろうとすると、添付ファイルコントローラーが自動的に追加されるので、
    その添付ファイルコントローラーを切り取りして使うと効率が良い。

    Galleryを追加しておき、Itemsには「colItemAttachmentFile」を設定しておく。
    Gallery内にはテキストと画像を配置し、それぞれ「ThisItem.Name」と「ThisItem.Value」を設定しておく。
    Galleryは非表示としておく。

    画面でボタンをクリックしたら以下の処理を行う。

    ClearCollect(colItemAttachmentFile, S01_atc_添付ファイル.Attachments);
    ForAll(S01_gly_添付ファイル一覧.AllItems As tmp,
        Collect(colUpdateFile,
            {
                Title: tmp.Name,
                FileData: tmp.S01_obj_添付ファイルオブジェクト.Image,
                Name: tmp.Name,
                Value: tmp.S01_obj_添付ファイルオブジェクト.Image
            }
        )
    );
    Collect(colItemBase, {添付ファイル: colUpdateFile});
    Set(gblJSONData, JSON(colItemBase, JSONFormat.IncludeBinaryData));
    
    PowerAutomate名称.Run(gblJSONData)
    

    Power Automateの処理は以下の通り。
    ・Share Pointコネクタ-新しいフォルダの作成
     一覧またはライブラリ:ドキュメント
     フォルダーのパス:00_管理/添付資料/Share PointのID/日付

    ・それぞれに適用する:添付ファイル
     前のステップから出力を選択します:body(‘JSON_の解析’)

    ・JSONの解析:添付ファイル
     Content:items(‘それぞれに適用する:添付ファイル’)[‘添付ファイル’]
     Schema:以下の内容

    {
        "type":"array",
        "items": {
            "type":"object",
            "properties": {
                "FileData": {
                    "type":"string"
                },
                "Title": {
                    "type":"string"
                }
            },
            "required": [
                "FileData",
                "Title"
            ]
        }
    }
    

    ・それぞれに適用する:添付ファイル単一
     前のステップから出力を選択します:body(‘JSON_の解析:添付ファイル’)

    ・変数の設定
     名前:添付ファイル識別子
     値:string(variables(‘添付ファイル識別子整数’))

    ・変数の設定
     名前:添付ファイル名分割配列
     値:split(items(‘それぞれに適用する:添付ファイル単一’)[‘Title’],’.’)

    ・変数の設定
     名前:添付ファイル名の日付付与
     値:concat(variables(‘添付ファイル名分割配列’)[sub(length(variables(‘添付ファイル名分割配列’)), 2)],’_’,variables(‘添付ファイル識別子’))

    ・変数の設定
     名前:添付ファイル名禁則文字置換
     値:replace(items(‘それぞれに適用する:添付ファイル単一’)[‘Title’],variables(‘添付ファイル名分割配列’)[sub(length(variables(‘添付ファイル名分割配列’)), 2)],variables(‘添付ファイル名の日付付与’)),’>’,”)
    上記以外に「<」などの禁則文字を空欄に置換

【Power Apps】複雑な検索処理

  • 複雑な検索処理
    Power Appsでコレクションに対して複雑な検索処理を実施する方法は以下の通り。

    With(
        If(gblユーザー種別="一般ユーザー",
            // 一般ユーザーの場合
            {baseFiltered: Filter(colコレクション,
                Find(gbl操作者メールアドレス, 照会者メールドレス) > 0 &&
                表示フラグ = true &&
            },
            If(gblユーザー種別="一般管理者",
                // 一般管理者の場合
                {baseFiltered: Filter(colコレクション,
                    ステータス <> "一時保存中" &&
                    Find(gbl操作者メールアドレス, 閲覧者メールドレス) > 0 &&
                    表示フラグ = true &&
                },
                // 上級管理者の場合
                {baseFiltered: Filter(colコレクション,
                    Find(gbl操作者メールアドレス, 閲覧者メールドレス) > 0 &&
                }
        ),
        With(
            {baseFiltered2: 
                Switch(S01_rgo_検索条件切り替え.Selected.Value,
                    "検索条件なし", baseFiltered,
                    "タイトルで曖昧検索", Search(baseFiltered, S01_txt_タイトル.Text, タイトル),
                    "照会者名で曖昧検索", Search(baseFiltered, S01_txt_照会者名.Text, 照会者名),
                )
            },
            With(
                {baseFiltered3: SortByColumns(baseFiltered2, "ID", If(gbl表示順 = "降順", SortOrder.Ascending, SortOrder.Descending))
                },
                Filter(baseFiltered3, 
                    If(S01_drp_フィルターステータス.Selected.Value = "ステータス",
                        true,
                        IsBlank(S01_drp_フィルターステータス.Selected.Value) || ステータス = Text(S01_drp_フィルターステータス.Selected.Value)
                    ),
                    If(S01_drp_フィルター部署名.Selected.Value = "部署名",
                        true,
                        IsBlank(S01_drp_フィルター部署名.Selected.Value) || Left(照会者ユーザー情報.Department, Find("/", 照会者ユーザー情報.Department) -1) = Text(S01_drp_フィルター部署名.Selected.Value)
                    )
                )
            )
        )
    )
    

【Power Apps】Share Pointのユーザー列を取得後の処理

  • Share Pointのユーザー列を取得後の処理(単一選択)
    Share Pointのユーザー列をPower Automateで取得後の処理は以下の通り。

    ClearCollect(colコレクション,
        ForAll(
            Table(ParseJSON(PowerAutomate名称.Run().resultJson)),
            {
                ID: Value(ThisRecord.Value.ID),
                ユーザー氏名: Left(Text(ThisRecord.Value.ColumnUser.DisplayName), Find("(", Text(ThisRecord.Value.ColumnUser.DisplayName)) -1)
            }
        )
    )
    
  • Share Pointのユーザー列を取得後の処理(複数選択)
    Share Pointのユーザー列をPower Automateで取得後の処理は以下の通り。

    ClearCollect(colコレクション,
        ForAll(
            Table(ParseJSON(PowerAutomate名称.Run().resultJson)),
            {
                ID: Value(ThisRecord.Value.ID),
                ユーザー氏名: Concat(ForAll(Table(ThisRecord.Value.ColumnUser), {DisplayName: Text(ThisRecord.Value.DisplayName)}), Left(DisplayName, Find("(", DisplayName) -1), ";")
            }
        )
    )
    

【Power Apps】ドロップダウンやコンボボックスのItems

  • ドロップダウンやコンボボックスのItems
    ドロップダウンやコンボボックスのItemsは単純に実装すると「ShowColumns(担当者マスタ, 表示名)」のようになるが、
    この形式の場合、担当者マスタからデータを削除すると、このデータをトランザクションデータに持つデータを
    表示しようとすると、画面表示時にそのデータが選択されなくなってしまう。
    そのため、以下の対策を取ることがある。

    Table({Value: Blank()}, ShowColumns(担当者マスタデータ, 表示名), Distinct(ShowColumns(トランザクションデータ, 表示名), 表示名))
    

【Power Apps】ドロップダウンとコンボボックスの初期値

  • ドロップダウンの初期値
    ドロップダウンのItemsで表示している内容を設定している変数をDefaultに設定すると画面表示時に初期設定される。
  • コンボボックスの初期値
    コンボボックスのItemsで表示している内容を設定している変数をDefaultSelectedItemsに設定すると画面表示時に初期設定される。
    例えばそのコンボボックスが複数選択可能なShare Pointのユーザー列の場合、以下のようにすると初期設定される。

    ForAll(
        gblSelectedItem.複数選択可能なユーザー列,
        {
            Claims: ThisRecord.Claims,
            Department: ThisRecord.Department,
            Email: ThisRecord.Email,
            DisplayName: ThisRecord.DisplayName,
            JobTitle: ThisRecord.JobTitle,
            Picture: ""
        }
    )
    

【Power Apps】Share Pointフォルダ作成時の禁則文字

  • Share Pointフォルダ作成時の禁則文字
    Share PointにPower Automateでフォルダ作成時に以下の禁則文字があるとエラーになります。

    ・先頭半角スペース
    ・末尾半角スペース
    ・コロン
    ・ダブルクォーテーション
    ・アスタリスク
    ・小なり
    ・大なり
    ・クエスチョン
    ・スラッシュ
    ・バックスラッシュ
    ・パイプ
    ・末尾ピリオド
    ・上記以外に制御文字(例えばタブ)
    

    対応方法としては、フォルダパスを構成する要素をPower Apps側でチェックするのが実施しやすい。
    例えばPower Apps画面のテキストボックスの値がそのままフォルダに使われる場合、
    以下のチェック処理を実施する。

    If(IsMatch(DataCardValue.Text, "[:""*<>?/\\|.\t]", MatchOptions.Contains),
        "[:""*<>?/\\|.タブを含めることはできません。"
        If(Left(DataCardValue.Text, 1)=" " || Left(DataCardValue.Text, 1)=" ",
            "先頭にスペースを含めることはできません。",
            "問題ありません。"
        )
    )
    

【Power Apps】FromのItemとGalleryのItemsの違い

  • FromのItemとGalleryのItemsの違い
    画面のOnVisibleに以下が指定されているとする。

    ClearCollect(colSampleList, SampleList);
    UpdateContext({locSampleList: First(colSampleList)});
    

    FormのItemとGalleryのItemsに以下が指定されているとする。

    FormのItem:locSampleList(Form内の項目はThisItem.項目名)
    GalleryのItems:colSampleList
    

    画面のボタンのOnSelectに以下が指定されているとする。

    Patch(colSampleList,
        locSampleList,
        {
            Title: "テスト更新",
            Name: "山田 太郎更新"
        }
    );
    ResetForm(Form1);
    

    上記のボタンをクリックした場合、
    Form
    キャッシュされるため、Patchで更新しても最新化されない。
    最新化するためには項目のDefaultに変数を指定し、その変数を最新化する必要がある。

    Gallery
    常に最新化される。

    ※GalleryがFormの中にある場合も同様の動作となる。

【Power Apps】コレクションへの格納方法

  • 保存方法1
    Power Automateから以下のエスケープされたJSON文字列で戻ってくるとする。

    エスケープされたJSON文字列
    "resultJson":"[{\"コード1\":\"001\",\"コード2\":\"002\",\"削除フラグ\":false},{\"コード1\":\"101\",\"コード2\":\"202\",\"削除フラグ\":false}]"
    
    実際のJSON文字列(ParseJSON関数を行うと以下の文字列になる)
    "resultJson":"[{"コード1":"001","コード2":"002","削除フラグ":false},{"コード1":"101","コード2":"202","削除フラグ":false}]"
    
    ClearCollect(colコードマスタ,
        ForAll(
            Table(ParseJSON(PowerAutomate名称.Run().resultJson)),
            {
                コード1: Text(ThisRecord.Value.コード1),
                コード2: Text(ThisRecord.Value.コード2),
                削除フラグ: Boolean(ThisRecord.Value.削除フラグ)
            }
        )
    )
    
  • 保存方法2
    既にあるコレクション2つから新しいコレクションを作る。

    Clear(colコレクション);
    ForAll(
        colコレクションB As tmp,
        With(
            {
                newItem: LookUp(colコレクションA, 社員コード=tmp.社員コード)
            },
            Collect(colコレクション,
                {
                    社員コード: tmp.社員コード,
                    部門コード: tmp.部門コード,
                    部門名: LookUp(col部門コレクション, 部門コード=tmp.部門コード).部門名,
                    社員名: newItem.氏名
                }
            )
        )
    )
    
  • 保存方法3
    既にあるコレクションを編集して新しいコレクションを作る。(Itemsに指定する)
    AddColumnsの第1引数は元テーブル、第2引数は新しい項目名、第3引数は新しい項目値となる。

    Table(
        {氏名: ""},
        AddColumns(
            Filter(colコレクション, 部門コード='001'),
            所属名,
            氏名&"("&部門名&")"
        )
    )
    
  • 保存方法4
    以下のカスタムプロパティでテーブル(コレクション)を戻す。

    プロパティの型:アクション
    戻りデータの種類:テーブル
    
    With(
        {
            tmpResult: PowerAutomate名称.Run().resultJson
        },
        if(Not(IsBlank(tmpResult)),
            ForAll(
                Table(ParseJSON(tmpResult)),
                {
                    コード1: Text(ThisRecord.Value.コード1),
                    コード2: Text(ThisRecord.Value.コード2),
                    削除フラグ: Boolean(ThisRecord.Value.削除フラグ)
                }
            )
        )
    )