You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模型驱动应用的表单生命周期,这种写法是旧版客户端脚本的错误用法,正确解决步骤如下:

  1. 在表单编辑器中配置事件处理程序

    • 打开目标实体的表单编辑器,找到Lookup字段crc1e_peoplepickertest
    • 切换到「事件」选项卡,在「On Change」事件下点击「添加」
    • 选择你上传的JS Web资源,指定函数名称为populateEmailAddress
    • 勾选「启用」选项,保存并发布表单
  2. 代码优化调整

    • 移除代码末尾的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字段的权限
  3. 调试验证步骤

    • 打开浏览器开发者工具(F12)的「控制台」标签,查看是否有报错信息
    • 在函数开头添加console.log("函数已触发"),验证事件是否正常调用
    • 复制请求URL到浏览器地址栏直接访问,确认能返回正确的邮箱数据

内容的提问来源于stack exchange,提问作者Kosenurm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:50:26