Power Apps(モデル駆動型アプリ)のClient APIを試していたところ、フォームに表示していない列を取得するために列の依存関係を設定しても、getAttribute() で列が null となってしまいました。ということで、色々試した内容を備忘録がてら、残しておきます。
発生した事象
モデル駆動型アプリのフォーム上に配置していない列を、Client APIから取得する処理を実装してみました。
function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
// Webリソースの列依存関係に登録した列を取得する。
const attribute = formContext.getAttribute("csl_naibu_kensho_code");
console.log("取得結果:", attribute);
}
いざ、実行!・・・した結果は null となってしまいました。
取得結果: null
想定している仕様
Microsoft Learnを見てみましたが、javascript Webリソースの列依存関係を設定することで、フォームに配置していない列も取得できると説明がされていました。
なので、javascript Web リソースの依存関係設定画面より、内部検証コード列に対する依存関係を追加していました。
調査内容
Webリソースを再度公開
Webリソースの公開がどこかで失敗してしまったのか?と思い、再度公開(2~3回程度は公開)してみましたが、効果なし・・・
Dataverse側に保存されている依存関係を確認
ChatGPTに聞いてみると、Webリソースの依存関係を保持している dependencyxml なるものがあるようです(webresource テーブルの属性なのだとか)。
ということで、クエリを作ってもらったので、Chromeの開発者ツールでクエリを実行。
const result = await Xrm.WebApi.retrieveMultipleRecords(
"webresource",
"?$select=name,dependencyxml" +
"&$filter=name eq 'csl_client_script_lab_js'"
);
console.log(result.entities[0]?.dependencyxml);
クエリを投げた結果、下記の結果が返ってきました(一部GUIDなどは省略しています)。
<Dependencies>
<Dependency componentType="Attribute">
<Attribute
attributeId="..."
attributeName="内部検証コード"
entityName="csl_client_script_enshu"
attributeType="String"
attributeLogicalName="csl_naibu_kensho_code"
/>
</Dependency>
</Dependencies>
XMLの内容から、どうやらDataverse側には依存関係が含まれている模様(この辺はChatGPT頼りです・・・)。
現在のフォームから取得できる列はどれなんだ?ということで、取得可能な列を調べてみました。
フォームから取得可能な列を調べてみた
function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
// 現在のフォームから取得可能な列を一覧表示
const attributes = formContext.data.entity.attributes.get();
console.table(
attributes.map(attribute => ({
logicalName: attribute.getName()
}))
);
}
この関数をフォームの OnLoad イベントに登録し、ブラウザの開発者ツール上で出力結果を確認してみました。
結果として、6つの列の論理名が返ってきましたが、残念ながら今回列依存に設定した csl_naibu_kensho_code は一覧に含まれていませんでした。
検証結果
ここまでの調査を踏まえて、一度フォーム上に当該列のコンポーネントを配置してみました。すると、getAttribute() で正常に列を取得することができました。
回避策
ということで、今回は従来手法の当該列のコンポーネントを非表示としてフォーム上に配置して公開するという手段を取ることで、正常に列の取得をすることができました。
まとめ
今回の検証では、javascript Webリソースに列依存関係を設定しても、フォームから対象列を取得できない事象に遭遇してしまいました。色々確認しましたが、最後まで原因がわからずだったため、従来手法のコントロールを配置→非表示にする手法で乗り切りました。
中々 Clietn API 難しい・・・


