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

Dynamics 365中无需父实体GUID,用JS自动填充自定义实体

解决Dynamics 365中根据关联实体自动填充表单字段的问题

我明白你刚接触客户端脚本,翻遍了谷歌和社区还是卡在动态获取Agent GUID、自动填充数据这两步。结合你已经写好的静态代码,我帮你调整成完全适配需求的动态版本,一步步解决问题:

步骤1:绑定字段触发事件

先打开cts_cases的表单设计器,找到关联cts_agent的那个Agent ID字段(假设字段逻辑名称是cts_agentid),给它添加一个OnChange事件,指定调用我们的填充函数populateAgentDetails。

步骤2:编写动态填充的完整脚本

下面是修改后的代码,关键改动我都标出来了:

function populateAgentDetails(executionContext) {
    // 获取表单上下文(推荐用这个替代旧版Xrm.Page,兼容新版环境)
    var formContext = executionContext.getFormContext();
    var agentLookup = formContext.getAttribute("cts_agentid").getValue();
    
    // 先判断是否选中了Agent记录
    if (agentLookup && agentLookup.length > 0) {
        // 动态提取Agent的GUID,注意去掉前后大括号(Web API要求格式)
        var agentId = agentLookup[0].id.replace(/[{}]/g, "");
        var clientUrl = Xrm.Page.context.getClientUrl();
        
        var req = new XMLHttpRequest();
        // 替换静态GUID为动态获取的agentId
        req.open("GET", clientUrl + "/api/data/v9.1/cts_agents(" + agentId + ")?$select=cts_addressline1,cts_addressline2,cts_addressline3,cts_city,cts_country,cts_email,cts_fax,cts_mobilenumber,cts_name,cts_phonenumber,cts_state,cts_zipcode", true);
        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);
                    
                    // 把Agent数据逐个填充到cts_cases的对应字段
                    formContext.getAttribute("cts_addressline1").setValue(result["cts_addressline1"]);
                    formContext.getAttribute("cts_addressline2").setValue(result["cts_addressline2"]);
                    formContext.getAttribute("cts_addressline3").setValue(result["cts_addressline3"]);
                    formContext.getAttribute("cts_city").setValue(result["cts_city"]);
                    formContext.getAttribute("cts_country").setValue(result["cts_country"]);
                    formContext.getAttribute("cts_email").setValue(result["cts_email"]);
                    formContext.getAttribute("cts_fax").setValue(result["cts_fax"]);
                    formContext.getAttribute("cts_mobilenumber").setValue(result["cts_mobilenumber"]);
                    formContext.getAttribute("cts_name").setValue(result["cts_name"]);
                    formContext.getAttribute("cts_phonenumber").setValue(result["cts_phonenumber"]);
                    formContext.getAttribute("cts_state").setValue(result["cts_state"]);
                    formContext.getAttribute("cts_zipcode").setValue(result["cts_zipcode"]);
                } else {
                    Xrm.Utility.alertDialog(this.statusText);
                }
            }
        };
        req.send();
    } else {
        // 如果用户清空了Agent选择,同步清空所有填充的只读字段
        formContext.getAttribute("cts_addressline1").setValue(null);
        formContext.getAttribute("cts_addressline2").setValue(null);
        formContext.getAttribute("cts_addressline3").setValue(null);
        formContext.getAttribute("cts_city").setValue(null);
        formContext.getAttribute("cts_country").setValue(null);
        formContext.getAttribute("cts_email").setValue(null);
        formContext.getAttribute("cts_fax").setValue(null);
        formContext.getAttribute("cts_mobilenumber").setValue(null);
        formContext.getAttribute("cts_name").setValue(null);
        formContext.getAttribute("cts_phonenumber").setValue(null);
        formContext.getAttribute("cts_state").setValue(null);
        formContext.getAttribute("cts_zipcode").setValue(null);
    }
}

关键细节说明

  • 动态获取GUID:通过agentLookup[0].id拿到选中Agent的ID,用replace(/[{}]/g, "")去掉前后大括号,这是Web API请求的格式要求。
  • 表单上下文:用executionContext.getFormContext()是官方推荐的写法,比直接用Xrm.Page更适配新版Dataverse环境。
  • 自动填充逻辑:拿到返回的JSON数据后,通过formContext.getAttribute("字段逻辑名").setValue(值)把数据写入对应字段,完全自动化。
  • 清空处理:当用户取消选择Agent时,自动清空所有只读字段,避免残留无效数据。

额外注意事项

  • 确保代码里的字段/实体逻辑名称和你的实际环境一致,比如cts_agentid如果你的字段名不同,要替换成真实名称。
  • 提前在表单设计器里把需要填充的字段设置为只读,防止用户手动修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:08:14