Power Apps模型驱动应用JS代码无法自动填充AAD用户邮箱字段求助
Power Apps模型驱动应用:Lookup字段选择后自动填充邮箱无响应问题排查
我开发了一款企业内广泛使用的自定义Power Apps模型驱动应用,用于合同工作流与数据库管理。应用主表单以自由文本输入字段和Choice列为主,现在要把部分输入同事姓名的字段改成关联AAD User表的Lookup列,实现选择Lookup字段里的同事后,自动填充其邮箱到指定字段(无需保存记录)。
我写了对应的JS代码并添加为Web资源关联到表单,但选择Lookup字段后邮箱字段没有任何内容填充。代码如下:
function populateEmailAddress() { var lookupField = Xrm.Page.getAttribute("crc1e_peoplepickertest"); var emailAddressField = Xrm.Page.getAttribute("crc1e_ppemail"); if (lookupField.getValue() != null) { var lookupValue = lookupField.getValue()[0]; var lookupId = lookupValue.id; var lookupType = lookupValue.entityType; if (lookupType === "systemuser") { var req = new XMLHttpRequest(); req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/systemusers(" + lookupId + ")?$select=internalemailaddress", false); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.setRequestHeader("Prefer", "odata.include-annotations=\"*\""); req.onreadystatechange = function () { if (this.readyState === 4) { req.onreadystatechange = null; if (this.status === 200) { var result = JSON.parse(this.response); emailAddressField.setValue(result["internalemailaddress"]); } else { Xrm.Utility.alertDialog(this.statusText); } } }; req.send(); } } } lookupField.addOnChange(populateEmailAddress);
多方咨询包括微软在内的渠道仍无法解决,不确定是否需要添加表单事件处理程序。已测试代码,预期邮箱字段会自动填充,但无任何反应,请问是否需要事件处理程序?
核心结论:必须添加表单事件处理程序
你当前代码里通过lookupField.addOnChange(populateEmailAddress)绑定事件的方式不适用于Power Apps模型驱动应用的表单生命周期,这种写法是旧版客户端脚本的错误用法,正确解决步骤如下:
在表单编辑器中配置事件处理程序
- 打开目标实体的表单编辑器,找到Lookup字段
crc1e_peoplepickertest - 切换到「事件」选项卡,在「On Change」事件下点击「添加」
- 选择你上传的JS Web资源,指定函数名称为
populateEmailAddress - 勾选「启用」选项,保存并发布表单
- 打开目标实体的表单编辑器,找到Lookup字段
代码优化调整
- 移除代码末尾的
lookupField.addOnChange(populateEmailAddress),表单加载时DOM元素未完全初始化,直接调用会导致lookupField为null - 替换弃用的
Xrm.Page为新版formContext,将其作为参数传入函数:function populateEmailAddress(executionContext) { var formContext = executionContext.getFormContext(); var lookupField = formContext.getAttribute("crc1e_peoplepickertest"); var emailAddressField = formContext.getAttribute("crc1e_ppemail"); // 后续逻辑保持不变 } - 将同步请求改为异步(把
req.open第三个参数从false改为true),避免阻塞UI - 检查字段逻辑名称的大小写匹配(Power Apps逻辑名称区分大小写)
- 确认当前用户有读取
systemuser表internalemailaddress字段的权限
- 移除代码末尾的
调试验证步骤
- 打开浏览器开发者工具(F12)的「控制台」标签,查看是否有报错信息
- 在函数开头添加
console.log("函数已触发"),验证事件是否正常调用 - 复制请求URL到浏览器地址栏直接访问,确认能返回正确的邮箱数据
内容的提问来源于stack exchange,提问作者Kosenurm
相关产品推荐
相关产品推荐

