PowerApps│アクセス権のないプランにタスクをまとめて登録する方法

こんにちは、あんこ先生です。

権限のないプランにまとめてタスク登録させたいことありませんか?

たとえば、1件ずつ行う方法では、どこまでやったかわからなくなりますよね。

そこで、今回はPowerAutomateを使ってアクセス権がなくてもplannerにタスクをまとめて登録する方法を手取り足取り紹介します。

いままでよりも作成難度は高まりますが、動かすだけならほぼコピペでいけます。

ぜひ、チャレンジしてみてください。


以下、別記事で紹介したアプリに機能を追加する形で解説します。

まだ読まれていない、アプリを作成されていない場合は先に下記記事を読んでください。

アクセス権のないプランにタスクを登録する方法


アクセス権について

PowerAppsから好きなようにタスクの参照や登録ができるわけではありません。

Plannerならそのプランに対して共有(アクセス権)されたユーザーのみが利用できます。

そのため、アクセス権を持たないユーザーがプランにアクセスしようとすると否認されます。

つまり、アプリを経由してもタスクを登録することができません。


アクセス権の壁を回避する方法

PowerApps単体の機能ではそのユーザーが持つアクセス権を超えての要求は通せません。

そこで、PowerAutomateのフローを経由してアクセス権を持つ代理権限で処理を行わせます。

注意点として、フローの所有者が該当プランのアクセス権を持っていることが前提となります。

応用すれば、アクセス権のないSharePointリストに書き込むこともできますね。

今回はこの仕組みを利用して、アクセス権のないプランにタスクをまとめて登録させます。


割当者の追加


今回はタスク作成時に割当も行えるようにします。

させない場合は飛ばしてください。

元アプリにひとつコンボボックスcmbAssignUsersを追加し、ボタンbtnOrderとともに次のコードを転記します。

これでプランに参加してる人を選択できるようになり、そのIDをコレクションに格納できます。

cmbAssignUsers.Items

//プラン参加者一覧を取得
Office365グループ.ListGroupMembers("プランのグループID").value


btnOrder.OnSelect

//カート用コレクションに追加
Collect(colCart,
    {
        gloupId:"",
        planId:drpCode.Selected.PlanId,
        BucketId:drpCode.Selected.BucketId,
        title:"数量"&drpValue.Selected.Value,
        startDateTime:Text(Today(),"yyyy-mm-dd")&"T00:00:00",
        dueDateTime:Text(dteStandardDelivery.SelectedDate,"yyyy-mm-dd")&"T00:00:00",
        userId:Concat(ForAll(cmbAssignUsers.SelectedItems,ThisRecord.id).Value,Value,";")
    }
);
//コントロールを初期値に戻してから商品一覧に戻る
Reset(drpValue);Reset(dteStandardDelivery);Reset(cmbAssignUsers);
Set(_visible,!_visible)

フローの作成│PowerAutomate


今回は複数のタスクをまとめて登録していきます。

一見難しそうですが、上図のとおり4ステップで完了します。

図解すると次の通りです。


PowerAppsからフローにテーブル値を渡す│PowerApps(V2)

PowerApps│アクセス権のないプランにタスクを登録する方法


はじめにトリガー(フローの開始条件)として、PowerAppsから実行します。

カートの中身はテーブルのコレクションなので、そのままではフローに渡せません。

そこで、タスク登録に必要な情報をJSON形式でフローに渡します。

JSONなにそれ厚切りなの?と思うかもしれません。

JSON (JavaScript Object Notation)は、JavaScriptをベースに作られた軽量のデータ交換フォーマットです。

WEB開発やデータ交換などで利用されています。

PowerAppsには、うまい具合に変換してくれるJSON関数が用意されているので小難しく考える必要はありません。

作成方法は後述しますね。


フローから代理権限でタスクをまとめて登録│タスクを作成する

PowerApps│アクセス権のないプランにタスクを登録する方法


次に、渡されたJSONを解析して、タスクを登録します。

代理権限(フローの作成者)で実行する設定は、のちほど紹介します。

フローがやってることはたったこれだけです。

このくらいならできそうだと思いませんか?


PowerAppsからフローを作成する


フローの作成は、PowerAppsから直接行えます。

アクションタブフローを新規作成するの順にクリックします。


たくさんテンプレートが出てきますが、今回のは短いので一から作った方が早いです。


トリガーを作成する


作成画面が表示されたら、トリガーを作り直すために表示されているトリガーを削除します。

三点リーダから削除を押せばすぐ消えます。

削除が完了するとコネクタ選択画面が表示されるので、PowerAppsを選びます。

そしてトリガー選択画面になったら下側のPowerApps(V2)を選びます。

今回はJSONで渡すので、テキスト型をひとつだけ用意します。

名前は後工程で使うためわかりやすいものが良いです。

サンプルは入力としました。

以上でトリガーの作成は終了です。


操作を作成する│JSONの解析


はじめに渡されたJSONをフローで使える形に解析します。

データ操作JSONの解析を追加します。


コンテンツは前ステップの入力を選びます。

スキーマは下記をコピペしてください。

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "groupId": {
                "type": "string"
            },
            "planId": {
                "type": "string"
            },
            "title": {
                "type": "string"
            },
            "bucketId": {
                "type": "string"
            },
            "startDateTime": {
                "type": "string"
            },
            "dueDateTime": {
                "type": "string"
            },
            "userId": {
                "type": "string"
            }
        }
    }
}

これでフローでも使える形になりました。


操作を作成する│タスクの登録


実際にタスクに登録する操作を作成します。

+新しいステップを押して、Plannerタスクを作成するを選びます。

Plannerで検索するとすぐ出てきますよ。

タスクを作成するの画面が表示されると、どの項目に何の値を当てはめるか設定します。

たくさん選択肢がでてきますが、一番下のカスタム値の入力を選びます。

右側にどの値を当てはめるか候補が表示されるので、先ほどのトリガーで設定したものをひとつずつ選んでいきます。

すると、Apply to eachというものが自動でできあがります。

これはテーブルを指定した際に、その中身分だけ繰り返す処理を示しています。

ForAll関数みたいなものですね。

気にせず、すべて当てはめると上図のようになります。

今回、割り当ても追加しています。

空欄でも大丈夫ですが、割当を行わない場合はuserIdを消してください。

これで操作の作成は完了です。


フローの完了を通知する│応答する

PowerApps│アクセス権のないプランにタスクを登録する方法


最後に、ちゃんとフローが終わったかPowerAppsに通知する機能を加えてみます。

+新しいステップを押して、PowerAppsPowerAppsまたはFlowに応答するを選びます。


これを使えば、フローからPowerAppsに値を返すことができます。

処理が完了したことをresultという変数に入れて返します。

あとは保存してPowerAppsに戻ります。

フローが追加されていればOKです。

フローの埋め込み│PowerApps


ボタンを押すとフローが実行されるようにする

適当なボタンOnSelectに次のようなコードを記述します。

 Notify(フロー名.Run(JSON(フローに渡すテーブル値,JSONFormat.IndentFour)).result)

今回は完了通知を受け取るために、Notify関数で囲っています。

また、フローに渡す値、つまりカートの中身をJSONに変換するため、JSON関数を使用しています。

プロパティのJSONFormat.IndentFourは、コードを読みやすくするためのものです。

具体的には各列と入れ子レベルの改行が含まれ、インデント レベルごとに 4 つのスペースが使用されます。

実際には次のように記載しています。

//空の場合は処理しない、フローの処理結果を返す
If(IsBlank(colCart),
    Notify("カートが空です。"),
    Notify(権限ないけどまとめてタスク登録するフロー.Run(JSON(colCart,JSONFormat.IndentFour)).result)
);

//あとかたづけ
Clear(colCart);

resultはフローから戻ってくる値の名前です。

フローが完了したら、その中身が通知されます。

エラーが出た場合は、フローの実行結果で原因を探して対処しましょう。


フローを代理権限で実行させる


一通り動くようになったのですが、まだアクセス権がユーザーに依存しています。

上図の手順で実行時の接続をフローの作成者にします。

これでだれが実行してもアクセス権を持ったフローの作成者が代行します。

もちろんフローの作成者がアクセス権を持っていないと動きませんよ。

ただし、トリガーがPowerApps(V2)でないと選べないので注意してください。

アクセス権のないプランにタスクをまとめて登録する方法のまとめ

今回は以前作成したネットショップっぽいUIのアプリに機能を追加する形で紹介しました。

別記事の問題点であった1件ずつのタスク登録から解放されます。

テーブルとJSONを取り扱うので難易度は高まりますが、便利なのでぜひ試してみてください。

ご支援よろしくおねがいします

この記事を気に入ってくださった方、寄付してあげてもいいよという方がいらっしゃっいましたら、ご支援いただけると助かります。

下記リンクからAmazonギフト券で、金額は15円からお気持ちを入力してください。

受取人のメールアドレスは amazon@anko7793.com までお願いします。

メッセージもいただけるとたいへん喜びます。

よろしくお願いします。

Amazonギフト券(Eメールタイプ) 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。