Power Apps / SharePoint のメモ
■ SharePointのリストを切り替える
Power Apps Formの参照データソースを動的に切り替える
https://zezeze.hateblo.jp/entry/2020/06/08/233157
何故か変数方式ではデータソースを切り替えることができませんでした。変数にデータソース型ってあるのでしょうか?
//NGコード:無効な引数が含まれていますとのエラーが出ます。
UpdateContext({locDs:cmbDs.Selected.Ds});
Patch(locDs,Defaults(locDs),{Title:locTitle});
テキストだから駄目なのかなと思い、データソースの配列を作ってLookupで抽出してもダメでした。
//NGコード
ClearCollect(dsDBs,{Sgn:"D01",dsDB:D01},{Sgn:"D02",dsDB:D02},...,{Sgn:"D99",dsDB:D99})
Patch(LookUp(dsDBs,Sgn=locDs,dsDB),Defaults(LookUp(dsDBs,Sgn=locDs,dsDB)),{Title:locTitle});
仕方がないので、Switchで切り替えました。リストの数だけ書くので間抜けで酷いコードです。
//多分OKだと思うコード
Switch(locDs,
"D01",Patch(D01,Defaults(D01),{Title:locTitle}),
"D02",Patch(D02,Defaults(D02),{Title:locTitle}),
...
"D99",Patch(D99,Defaults(D99),{Title:locTitle})
)
切り替えができるコントロールは一部です。
Patchとギャラリー(Item)は、Switchが使えました。
フォームとテーブルは、Switchで切り替えることができないようです。残念。
Global variable to store data source · Community (powerapps.com)
■ If()やSwitch()でリストの切り替えが可能な機能
1) 切り替え可能な機能
- ギャラリー
- Patch()
2) 切り替え不可能な機能
- フォーム
- データテーブル
- Set()、UpdateContext()の中
■ SharePointのリストの項目名
SharePointのリストの項目名は少なくとも3つあるようです。
1) リスト表示画面で追加、変更できる表示名
2) リストの設定で表示、変更できる表示名
3) リストの設定でURLのFieldに表示される内部名
Power Appsで1つのSharePointリストを使用している場合は、表示名でコードを書きます。
Power Appsで複数の同じ項目名のリストを切り替える場合は、内部名でコードを書く必要がありそうです。なので、複数のデータソースを切り替える場合は、内部名=表示名にしておく必要がありそうです。
内部名に使用できる文字は半角アルファベットのみのようです。半角数字はNGです。アンダースコアは使えました。スペースやドットは使えません。
内部名は作成時に決まり、後から変更できません。
Excelからインポートしたリストの内部項目名は、最初の項目名がTitleになり、以降はField数字の形式になります。表示名はExcelの表示名になります。何故かExcelの項目名"Type"はインポートできません。しかし、SharePointのリストで項目名に"Type"は使用できます。内部名も"Type"は使用できます。Excelの日付をインポートするとSharePoint側の日付書式が変わります。変わる書式は一定ではありません。謎です。好みの書式にするには、JSONで設定する必要がありそうですが、この書式マニュアルの所在が不明です。
■ SharePointのリストのレコードの削除
レコード数が500を超えてくると、とても時間がかかります。
■ SharePointのリストにExcelのデータをコピー&ペーストで貼り付ける
レコード数が500を超えてくると、とても時間がかかります。一度にコピーするレコード数は100位にしておいた方が良さそうです。
Excel側の日付表示形式をSharePointの形式に合わせておく必要があります。また、Power Automateは日付&時刻を文字列で処理するようなので、時刻も表示しておいたほうが良さそうです。
調べていないのですが、もしかするとタイムゾーンの違いによる9時間ずれが発生するかも知れません??
Excelデータに問題が無くても、文字列に0x0Bがあるとのエラーで止まることがあります。この場合、0x0Bを示す□文字を消せば処理が再開されますが、エディタが非常に遅く1文字消すだけでも時間がかかります。
Excelデータに問題が無くても、日付のエラーで止まることがあります。
以上のことから大きなExcelのデータをコピー&ペーストでSharePointのリストに貼り付けるのは困難です。対策としては、Power Automateでコピーするフローを作成します。
Power AutomateでExcelからSharePointへ値を転記する際の対応方針(1):Excelのテーブル編
https://artisan.jp.net/blog/convert-excel-to-sharepoint-1/
■ 承認ワークフロー
Power Appsで承認ワークフローを検索すると、Power Automateの承認コントロールを使用するが多くヒットします。しかし、この方法では以下の欠点があるかもしれません。
(1) 30日を超えるとタイムアウトでワークフローが停止します。下記対応が示されていますが、Common Data Service connectorを使用するのでPremiumライセンス費用が必要です。
長期にわたる承認とその他の改善点:https://learn.microsoft.com/ja-jp/business-applications-release-notes/april19/microsoft-flow/long-lived-approvals-other-approval-improvements
(2) 承認待ちの数が52に制限されます。例えば平均承認期間が14日の場合、52/14=3.7件/日しか承認依頼を発行できません。
承認コネクタ利用に関する思わぬ落とし穴!?:https://tana-techlog.net/?p=334
上記欠点を考えると「Power Apps キャンバスアプリ上から承認/拒否を実施」の方が良いかもしれません。
Power Apps キャンバスアプリ:承認機能の設計方針:https://artisan.jp.net/blog/power-apps-canvas-app-approval/
■ リッチテキストエディタの書式
Power AutomateではなくPower Appsで承認フローを作るには、承認依頼メールに承認アプリのリンクを貼る必要があります。この為にはリッチテキストエディタで本文を作成する必要がありますが、Power Appsのリッチテキストの書き方の情報を発見できていません。試行錯誤した結果、リッチテキストコントロールのDefaultに以下を記述します。注意点は、href=の後のURLを"で囲んではだめで、'で囲む必要があるということです。
"<p>1. 下記の文書の確認をお願いします。<br/>
文書格納場所:<a href='" & gblUrl & "'>" & gblUrl & "</a></p>
<p>2. 下記のリンクの承認システムで承認処理をしてください。<br/>
承認システム:<a href='" & gblAppr & "'>" & gblAppr & "</a></p>"
下記ではリッチテキストコントロール上ではリンクになりますが、送ったメールがリンクになりません。
文書格納場所:<a href="" & gblUrl & "">" & gblUrl & "</a></p>
承認システム:<a href="" & gblAppr & "">" & gblAppr & "</a></p>"
■ SharePointの参照列をLookUpの条件式に入れる方法
参照列は値が入っているのではなく親のIDが入っているようです。なので、直接値の比較ができません。よって、親の値をLookUpで比較します。
SharePointの親リスト:Code,Model,Price,Weight
SharePointの子リスト:Code(参照列),Code:Model(参照で追加した列),Person,Qty,Date
Set(gblCode,"A0001");
LookUp(子,Code.Id=LookUp(親,Code=gblCode,ID),Person)
■ SharePointの参照列に値を書き込む方法
参照先には値ではなく参照元のIDを書き込みます。
Patch(参照先データソース,Defaults(参照先データソース),{Title:gblTitle,
参照列名:{'@odata.type':"#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
Id:LookUp(参照元データソース,参照列名=値).ID,Value:ダミー値}}
■ ParseJSON()をコレクションに変換する方法
ParseJSON()は型指定されていないテーブルを返すので、コレクションを操作する関数が使えません。そこで、下記方法によりコレクションに変換します。
PowerApps Parse JSON examples
https://devoworx.net/powerapps-parse-json-examples/
You can use the for all function to loop in your JSON string and collect the rows in your collection as shown in the bellow code.
これによりSharePointのリストの項目を固定したまま、可変長のテーブルやコレクションをJSON()でSharePointのリストに格納し、それを読み取りPower Appsのコレクション関係の関数で操作をすることができます。
入れ子の配列は次のように2重のForAllで型付のコレクションに変換します。
//元の入れ子の配列を持つコレクション
Set(NameA,"A");Set(NameB,"B");Set(NoA,1);Set(NoB,2);
//ClearCollect(colA,[1,2]); // DataAの初期値
//ClearCollect(colB,[3,4]); // DataBの初期値
ClearCollect(colA,[{Value:1},{Value:2}]); // DataAの初期値
ClearCollect(colB,[{Value:3},{Value:4}]); // DataBの初期値
ClearCollect(colJ,{Name:NameA,No:NoA,Data:colA});
Collect(colJ,{Name:NameB,No:NoB,Data:colB});
//コレクションをJSONに変換
Set(jsn,JSON(colJ)); //これをSharePointのリストの複数行テキストに保存します。jsnは次のようになります。
//[{"Data":[{"Value":1},{"Value":2}],"Name":"A","No":1},{"Data":[{"Value":3},{"Value":4}],"Name":"B","No":2}]
//([{"Data":[1,2],...のようにはならず、JSON()ではValueが付加されます。)
//ParseJSONからコレクションに変換
ClearCollect(colJ2,ForAll(Table(ParseJSON(jsn)),{Name:Text(Value.Name),No:Value(Value.No),Data:ForAll(Table(Value.Data),{Value:Value(ThisRecord.Value.Value)})})); //SharePointリストの複数行テキストからJSONを呼び出し、型付のコレクションに変換します。
Set(jsn2,JSON(colJ2)); //再びJSONにしてSharepointに戻すことができます。
■ 入れ子の配列を抜き出す方法
表colJ2のNo:1のレコードのData列に入っている1次元配列をcolA2に代入する方法
Clear(colA2);ForAll(LookUp(colJ2,No=1,Data) As Tmp,Collect(colA2,{Value:Tmp.Value}));
■ コンボボックスの初期値にアプリを起動しているOffice365ユーザーを初期値に設定する方法
DefaultSelectedItmesに下記を設定します。
{DisplayName:User().FullName,Claims:"office365Users.SearchUser" & Lower(User().Email),Department:"",Email:User().Email,JobTitle:"",Picture:""}
下記ではだめでした。
First(Office365ユーザー.SearchUserV2({SearchTerm:User().Email}).value)
Office365ユーザー.SearchUserV2({SearchTerm:User().Email}).value
コンボボックスのDefaultSelectedItemsは、Itemsと同じデータソースである必要があります。同じ値の変数などを設定するとコンボボックスに表示されるので、一見選択できているような表示になりますが、内容を読み出すと空になり選択できていません。この選択されていない初期値をコンボボックスから取得する方法を発見できていません。なので、コンボボックスからの値の取得は、以下のようにすることが考えられます。
1) 初期値を変数に保存。
2) IsBlank(.Selected.Feild)=falseなら、変数に.Selected.Feildを代入。
3) 2)ではなく、IsBlank(.SearchText)=falseなら、変数に.SearchTextを代入。
4) 2)3)ではなく、IsBlank(.SelectedItems) || IsEmpty(.SelectedItems) = trueなら、変数にBlank()を代入。
■ SharePointのドキュメントライブラリのコンテンツ数制限
2024年にSharePointのコンテンツ数が約4万を超えたところでPower Automate DPAのSPOアクションが数%失敗しました。リトライを入れてもダメです。暫く時間を置かないと成功しません。なので、1ライブラリのコンテンツ数を2万または5千以下で使うのが安全です。NASの様に自由にSharePointにファイルを入れるとコンテンツ数の削減が難しくなり危険です。Teamsのファイルも同じです。Power Platformは、速度とコンテンツ数については要注意です。キャッシュの更新は遅いです。
※ 当方はIT関係でもプログラマでも無いExcelユーザーですので、間違いがあると思います。
| 固定リンク





コメント