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

求助:使用JSOM+REST API获取当前用户自定义用户配置文件属性失败

排查并修复SharePoint REST获取用户自定义配置文件属性的问题

我来帮你排查并修复这个问题哈!从你给出的代码片段来看,主要问题是代码不完整,加上自定义用户属性的获取方式可能没找对,另外还有几个容易忽略的细节需要注意。

先确认几个前提条件

  • 确保页面已经加载了jQuery(SharePoint默认页面不一定自带,需要手动引入)
  • 确认当前用户拥有读取自身用户配置文件的权限
  • 搞清楚自定义属性的内部名称(不是显示名称,比如显示名是"Employee Cost Center",内部名可能是EmployeeCostCenter,无空格)

修复后的完整代码

<!-- 先引入jQuery,如果页面已经加载过可以去掉这行 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    // 调用REST API获取当前用户的配置文件属性
    $.ajax({
        url: _spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetMyProperties",
        method: "GET",
        headers: {
            "Accept": "application/json;odata=verbose"
        },
        success: function(data) {
            try {
                // 获取用户基础信息
                var displayName = data.d.DisplayName;
                var accountName = data.d.AccountName;
                
                // 遍历属性数组,查找自定义的"Employee Cost Center"
                var costCenter = "";
                var userProperties = data.d.UserProfileProperties.results;
                for(let i = 0; i < userProperties.length; i++) {
                    // 这里要填属性的内部名称,不是显示名称!
                    if(userProperties[i].Key === "EmployeeCostCenter") {
                        costCenter = userProperties[i].Value;
                        break;
                    }
                }
                
                // 将结果展示到页面上(假设页面有个id为userInfo的容器)
                $("#userInfo").html(`
                    <p>用户名: ${displayName}</p>
                    <p>账号: ${accountName}</p>
                    <p>员工成本中心: ${costCenter || "未设置"}</p>
                `);
            } catch(err) {
                console.error("处理用户属性时出错:", err);
                $("#userInfo").text("加载用户信息失败,请查看控制台日志");
            }
        },
        error: function(xhr, status, error) {
            console.error("API请求失败:", error);
            console.log("响应详情:", xhr.responseText);
            $("#userInfo").text("获取用户信息失败,请查看控制台日志");
        }
    });
});
</script>

<!-- 页面上用于展示信息的容器 -->
<div id="userInfo"></div>

关键修复点说明

  1. 补全代码逻辑:你原代码在var properties = data.d...处截断了,自定义属性需要遍历UserProfileProperties.results数组才能找到,不能直接通过data.d.xxx访问
  2. 区分属性内部名称:自定义属性的Key是后台存储的内部名称,和显示名称不一定一致,需要在SharePoint管理中心的用户属性设置里确认
  3. 添加错误处理:原代码没有错误回调,遇到权限不足、API地址错误等问题时无法排查,新增的error和try-catch能帮你快速定位问题
  4. 确保DOM加载完成:用$(document).ready()保证代码在页面元素加载完成后执行,避免找不到展示容器

不用jQuery的原生JS版本(可选)

如果不想依赖jQuery,也可以用原生Fetch API实现:

document.addEventListener("DOMContentLoaded", function() {
    fetch(_spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetMyProperties", {
        method: "GET",
        headers: {
            "Accept": "application/json;odata=verbose"
        }
    })
    .then(response => {
        if(!response.ok) throw new Error(`请求失败: ${response.status}`);
        return response.json();
    })
    .then(data => {
        var displayName = data.d.DisplayName;
        var accountName = data.d.AccountName;
        var costCenter = "";
        var userProperties = data.d.UserProfileProperties.results;
        for(let i = 0; i < userProperties.length; i++) {
            if(userProperties[i].Key === "EmployeeCostCenter") {
                costCenter = userProperties[i].Value;
                break;
            }
        }
        document.getElementById("userInfo").innerHTML = `
            <p>用户名: ${displayName}</p>
            <p>账号: ${accountName}</p>
            <p>员工成本中心: ${costCenter || "未设置"}</p>
        `;
    })
    .catch(err => {
        console.error("出错:", err);
        document.getElementById("userInfo").textContent = "加载用户信息失败,请查看控制台日志";
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:43:24