Power Appsの使い方

Power AppsとPower Automateの使い方やできることがわかるブログを目指しています。

Power Apps キャンバスアプリで Dataverse 選択肢フィールドでソートするには

キャンバスアプリで Dataverse を使用しているときに、選択肢フィールドでソートしたい場合について。

 

普通に試すと、ソートができない

キャンバスアプリで選択肢フィールドを対象にSort()関数などでソートしようとすると、どうにもうまくいきません。通常のフィールドのように指定しても、エラーが出てしまいます。

 

現状私が確認した限りでは、Sort()SortByColumns()でソートをする方法はなさそうです。

 

ビューでソートする

では詰みかと思いきや、そうでもありません。

Dataverse ビュー の機能を使用すると、ビューで設定したフィルタ条件とソート順でキャンバスアプリにデータをもってくることができます。これを利用することで実現可能です。

 

手順

細かい手順は省きますが、ざっくり2ステップでソート済みデータをキャンバスアプリに持ってくることができます。

 

・ソート順を指定したビューを作成

並 へ 替 え 臺 準 . 
↓ OptionSetField 
三 自 加 の 並 べ 替 え 墓 準 
X

 

・作成したビューをキャンバスアプリから参照

プ ロ バ テ ィ 
デ - タ ソ - ス 
諱 設 を 
5 し 厄 mp 
SortayOptionset 
、 ノ

 

上記の手順で選択肢によるソートが実装できます。

 

動的にフィルタもしたいんだけど・・・

ユーザーからの入力値によって動的にしたい場合、ビューでは少し弱いです。できないわけではないんですが・・・。

全てのパターンをビューで網羅するのは厳しいので、その中から実際にユーザーが利用するパターンを洗い出して限定的にビューで実装する方向で一度検討してみてはいかがでしょうか。

 

蛇足:ソート用フィールドを追加するのは?

ソート用にフィールドを用意して保持しておく方法もあると言えばありますが、あまりおすすめできません。選択肢の中身を変えたときに対応させるのが面倒になりますし、メンテを忘れそうです。

 

蛇足:委任非対応でよければなんでもあり

コレクション化しているものを対象にする場合など、委任に対応できないことが問題でない場合は以下のようにするとソートができます。

 

Sort(

    colItems,

    Text( OptionSetField ),

    Ascending

)

 

ただ、上記の例だとテキストに変換してソートしてしまうため、本来の並びと異なる可能性があります。

ソート順を変えたくない場合は、ソート順参照用のコレクションを作成しておき、

 

ForAll(

    Sequence(CountRows(Choices( ABC_Set)),1,1) As Index,

    Collect(

        colOptionSets,

        {

            Value:Last(FirstN(Choices( ABC_Set),Index.Value)).Value,

            Text:Text(Last(FirstN(Choices( ABC_Set),Index.Value)).Value),

            Index:Index.Value

        }

    )

)

 

ItemsではAddColumns()を使用してソート用インデックスフィールドを追加したテーブルを用いてソートすることで、ソートが可能です。が、ちょっと面倒。

 

SortByColumns(

    AddColumns( 

        Test_Temp As Source,

        "OptionsetIndex",

        LookUp(colOptionSets,Value = Source.OptionSetField).Index

    ),

    "OptionsetIndex",

    Ascending

)

 

そもそも委任に対応できていないので、使い所も限られてきます。一応ご紹介まで。

 

まとめ

・ひとまず、ビューを試してみるのがおすすめ。

・動的なフィルタには弱い。利用パターンを洗い出してみては。

・委任非対応でよければ、キャンバス側での実装はいくつか方法がある。が、やや面倒。

 

PR

アプリ作成支援や導入支援サービスを提供しています。

Power Apps / Power Automate 技術支援サービス | ZEE CitizenDevSupport

https://powerapps.zee-citizendevsupport.com/

Dataverse for Teams のフローを複製するには

Dataverse for Teams でのフローの複製について整理してみます。

 

Dataverse for Teams のフローは複製できない?

まず、前提として普通に Dataverse for Teams フローを複製しようとすると、うまくいきません。

 

フローを選択して[ 名前をつけて保存 ] から保存、複製しても、Dataverse for Teams 上に表示されません。

どこかに複製されたのか、されていないのか。よくわからない状態になってしまいます。

 

 

複製したフローはどこにいった?

実はフローの複製自体はされています。

 

どこに保存されているかというと、環境内の[マイフロー]に保存されています。

これは、通常の Power Automate ポータルから確認できます。

 

 

どうすれば Dataverse for Teams に表示できる?

Dataverse for Teams に表示されるフローと表示されないフローの違いはなにか?

答えは、特定のソリューションに含まれるか否か、です。

 

Dataverse for Teams に表示されるアプリ、チャットボット、フローはすべて [ Common Data Services Default Solution ] という名前のソリューションに含まれています。

 

逆に言えば、このソリューションに含めることができれば、Dataverse for Teams 上に表示させることができます。

 

Common Data Services Default Solution に追加するには

クラウドフロー一覧から、[ Power Apps で開く ] からソリューション画面に移動します。

 

 

移動先は Common Data Services Default Solution の管理画面です。ここからソリューションに含めることができます。

 

画面上部の [ 追加 ] から、望みのフローをソリューションに追加することができます。

 

 

 

フローを追加すると、一覧に表示されるようになります。

 

フローがソリューション外部の一覧にないことも・・・

残念ながら、全てのフローがこの方式で複製できるわけではありません。

一部のフローはソリューションへの追加に対応しておらず、一覧に出てこないことがあります。

 

たとえば、

Power Automate ボタントリガーを使用しているフロー

 

Power Apps トリガーを使用しているフロー

 

などはソリューションに含めることができないため、複製できないということになります。

(意外にもPower Apps V2トリガーは対応しています。

 

子フローの複製には対応できない

Power Apps V2 トリガーはソリューションに含めることができるので、子フローも複製できるかと思いきや、フローを作成して保存するときにエラーが発生してしまいます。

ソリューションで新規作成したもののみ、子フローとして使用することができます。

 

結局、この方法で複製したフローはどうやっても子フローとして利用することはできません。

 

複製できないときの回避策 トリガーを一時的に変更する

トリガー次第で外部からソリューションに含められるかどうかが決まります。

なので、複製時だけトリガーを変更し、力技で複製する方法が取れるかもしれません。

 

こういうこともあるので、日頃からトリガー変更に強い作り方をしておくといいかもしれませんね。

 

複製できないときの回避策 アクションのコピーでコピーする

子フローとして利用したいフローを複製したい場合は、今回の方法ではどうやっても対応できないと思われます。

どうしてもDataverse for Teams からの新規フロー作成が必要になります。

 

代案として、スコープとアクションのコピーが使えるかもしれません。

予めフロー作成時に全てのアクションをスコープに含めておけば、アクションのコピーで簡単に全体をコピーすることができます。

 

苦肉の策ですが、これらで対応しましょう。

 

まとめ

・普通のやり方では、Dataverse for Teams のフローを複製することができない。

・実はマイフローに複製されている。

・表示させるには、Common Data Services Default Solution に含める必要がある。

・ソリューションに追加できないフローもあるので、注意。

・最後は力技で解決。

 

ということで、Dataverse for Team のフローの複製についてでした。ご参考になれば幸いです。

 

PR

アプリ作成支援や導入支援サービスを提供しています。

Power Apps / Power Automate 技術支援サービス | ZEE CitizenDevSupport

https://powerapps.zee-citizendevsupport.com/

Power Apps 文字や画像を斜めに表示する【解説動画付き】

Power Apps では標準の機能で斜めに文字や画像を表示する機能は付いていませんが、HTMLテキストを使用すると斜め文字を表現することができます。

 

完成イメージ

こんな感じに斜め表示が出来ます。

 

上記サンプルは以下の手順で作成できます。

 

作成手順

HTMLテキストを挿入

・挿入 > テキスト > HTMLテキスト とクリックします。

 

フォントサイズを大きくする

HtmlText.Size

60

 

 

表示テキストを入力

表示したいテキストを<p>タグで囲んでHtmlTextプロパティに入力します。

 

HtmlText.HtmlText

"<p>おすすめ動画!</p>"

 

テキストをdiv で囲む

HtmlText.HtmlText

"<div>

<p>おすすめ動画!</p>

</div>"

 

style="" "" を追加してスタイル指定の準備

HtmlText.HtmlText

"<div style="" "">

<p>おすすめ動画!</p>

</div>"

 

transform: rotate() 文字を斜めにする

HtmlText.HtmlText

"<div style="" transform: rotate(20deg); "">

<p>おすすめ動画!</p>

</div>"

 

background-color: 表示領域を可視化

文字を斜めにすると、表示領域からはみ出してしまいます。

微調整が必要なので、わかりやすいように背景色を設定します。

 

HtmlText.HtmlText

"<div style="" transform: rotate(20deg); background-color: red; "">

<p>おすすめ動画!</p>

</div>"

 

はみ出た部分を調整

width padding を使用してはみ出た部分が収まるように調整します。

 

HtmlText.HtmlText

"<div style=""

transform: rotate(20deg);

background-color: red;

width: 600px;

padding: 0px 0px 0px 0px ;

"">

<p>おすすめ動画!</p>

</div>"

 

背景色を削除

調整が完了したので、背景色を削除します。

 

HtmlText.HtmlText

"<div style=""

transform: rotate(20deg);

width: 600px;

padding: 0px 0px 0px 0px ;

"">

<p>おすすめ動画!</p>

</div>"

 

完成!

うまくいっていれば画像のようにできます。

 

[Advanced] 逆向きも可能

rotate(20deg) の数値をマイナスに設定すれば逆向きも可能です。

 

 

[Advanced] 画像も対応可能

画像も斜めにすることが出来ます。

 

[Advanced] スライダー連動で操作可能

rotate(20deg) の値をスライド値と連動させれば、スライダーで回転させることもできます。

 

[Advanced] タイマーでアニメーション可能

タイマーの値や変数を経由して連動させれば、アニメーションもさせることができます。

 

解説動画もあります

Youtubeに解説動画をアップロードしています。こちらも合わせて参考にしてみてください。

www.youtube.com

 

まとめ

横幅や余白の調整が少し面倒ですが、このように斜めに表示させることが可能です。

ただ、少々手間がかかるため乱用は避けたいですね。もっと他に優先するべき機能がないか思い返してもいいかもしれません。

 

PR

アプリ作成支援や導入支援サービスを提供しています。

Power Apps / Power Automate 技術支援サービス | ZEE CitizenDevSupport

https://powerapps.zee-citizendevsupport.com/

Power Apps から Dataverse 参照型フィールド付きレコードを登録する

Microsoft Dataverse 参照型フィールドに対しての登録、更新は少しクセがあります。

よくわかっていないひとは「え・・・?できないの・・・?」みたいに思ってしまうかもしれませんが、もちろんそんなことはありません。バリバリ出来ます。

 

参照型フィールドに入れるべき値

Power Apps から 参照型フィールドに対して登録、更新をかける場合、レコードごと指定します。

Gallery.Selected LookUp()ComboBox.Selected など、参照先テーブルから選択や検索してきたレコードを指定します。

 

サンプルのデータ構成

以下の例では、

 

TestParent

TestChildA

 

2つのテーブルを使用しています。

TestChildA には TestParent の参照フィールドが定義されています。という状態です。

 

データから作成の例

"データから作成"で作成した場合、自動生成で以下のように設定されます。

 

f:id:botherntu:20210605132256p:plain

 

ComboBox でレコードを選択し、選択されたレコードをそのまま Update 指定していることが確認できます。

 

DataCard.Update

DataCardValue5.Selected

 

Patch()で登録する場合

Patch() で登録する場合も、以下のように登録することができます。
 

 

Collect()で登録する場合

Collect() も同様に登録することができます。

 

 

LookUp() でも可能

LookUp()でも問題なく登録可能です。

 

 

Gallery.Selected でも可能

Gallery.Selected でも問題なく可能です。

 

 

まとめ

参照型フィールドの登録、更新には参照先のテーブルのレコードを指定します。

PR

アプリ作成支援や導入支援サービスを提供しています。

Power Apps / Power Automate 技術支援サービス | ZEE CitizenDevSupport

https://powerapps.zee-citizendevsupport.com/

Power Apps から直接 Teams ユーザーにチャットを送れるか?

Power Apps x Teams 連携として、ユーザーに対して Power Apps から直接チャットを送る方法について考えてみます。

 

コネクタのリファレンスを確認

リファレンスを確認すると、[ PostMessageToConversation ]で実装できそうです。

 

チャットでメッセージを送信する

https://docs.microsoft.com/en-us/connectors/teams/#post-message-in-a-chat-or-channel

 

Post message in a chat or channel 
Operation ID: PostMessageToConversation 
This operation posts a message to a chat or a channel. 
Parameters 
Name 
Post as 
Post in 
Post message request 
poster 
location 
body 
Requi red 
True 
True 
True 
Type 
string 
string 
dynamic 
Description 
Select an option 
Select an option 
The post message request

 

Type : dynamic の箇所が怪しい雰囲気を感じますね。

 

Power Apps で実装してみる

Power Apps で確認してみると、3つ必要な引数が2つまでしか指定できません。

PostMessageToConversetion(poster, location) location: 
v Microsoft Teams . PostMessageToConversationk"F10w bot"

 

Type : dynamic の部分が指定できない状態です。

 

Power Apps は動的スキーマに対応していない

Docs を探してみると、動的スキーマには対応していないという記述がありました。

 

Overview of canvas-app connectors for Power Apps - Actions

https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/connections-list#actions

O Note 
Power Apps doesn't work with dynamic schema. The phrase dynamic schema refers to the possibility that the same action may 
return a different table with different columns. Conditions that may cause the columns in the tables to differ include the action 
input parameters, the user or role that's executing the action, and the group in which the user is working, among others. For 
example, SQL Server stored procedures may return different columns if run with different inputs. For actions with dynamic 
schema, the connector documentation shows The outputs of this operation are dynamic. as the return value. In contrast, Power 
Automate works with dynamic schema and might provide a work-around for your scenario.

 

このように、Power Apps は動的スキーマに対応していません。

同様に引数によって動的に続く引数が変わるようなアクションは実行できないようです。

 

結論

Power Apps 単体ではユーザーにチャットを送信することは(標準機能では)できない。

 

代案

Power Automate を利用すると、フローボットとしてユーザーにチャットを送信できます。ボットとしてでよければ、こちらで代用しましょう。

 

場合によっては Graph API を利用

どうしてもやりたい場合は、Microsoft Graph API の利用を検討します。

 

チャットでメッセージを送信する

https://docs.microsoft.com/ja-jp/graph/api/chat-post-messages?view=graph-rest-1.0&tabs=http

 

ただ、少々手間が掛かりそうです。

無理にチャット機能を実装するより、別のアプローチを検討すべきかもしれません。

機能が無いということは、そういった使い方を想定していない、もしくはして欲しくない可能性があります。それに反するとドツボにはまる可能性が高いので、個人的にはあまりお薦めはできません。

 

まとめ

残念ながら Power Apps 単体でユーザーに対して Teams チャットを送信することは難しそうです。

私であれば Power Automate を利用した形で妥協すると思います。

Graph API は要件にもよりますが、なるべく使わない方向で検討する気がしますね。

 

PR

アプリ作成支援や導入支援サービスを提供しています。

Power Apps / Power Automate 技術支援サービス | ZEE CitizenDevSupport

https://powerapps.zee-citizendevsupport.com/

Power Apps や Power Automate に関する仕事のご依頼は下記ページからお問い合わせください。
ZEE CitizenDevSupport