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

如何在SharePoint 2013中用JavaScript通过邮箱填充人员或组字段

解决SharePoint 2013中用JavaScript通过邮箱设置人员字段的问题

你遇到的问题很典型——SharePoint的人员/组字段并不接受纯邮箱字符串作为输入,它需要的是符合特定格式的用户对象或者字段值结构,直接传邮箱自然会报“数据无效”的错误。下面给你两种可靠的解决方法:

方法一:使用SP.Web.EnsureUser获取用户对象(推荐)

这个方法可以通过邮箱、登录名等标识直接获取对应的SP.User对象,然后提取ID来构造人员字段需要的值。代码示例如下:

var siteUrl = _spPageContextInfo.siteAbsoluteUrl;
var clientContext = new SP.ClientContext(siteUrl);
var web = clientContext.get_web();

// 你的目标邮箱地址
var targetEmail = "mymanager@domain.com";
// 获取用户对象
var user = web.ensureUser(targetEmail);

clientContext.load(user);
clientContext.executeQueryAsync(
    function() {
        // 获取列表项(这里假设你已经获取到了oListItem,比如通过getItemById)
        var oListItem = // 你的列表项对象,比如 list.getItemById(itemId);
        
        // 构造人员字段需要的FieldUserValue对象
        var userFieldValue = new SP.FieldUserValue();
        userFieldValue.set_lookupId(user.get_id());
        
        // 设置字段值
        oListItem.set_item('MyFieldName', userFieldValue);
        oListItem.update();
        
        clientContext.executeQueryAsync(
            function() {
                console.log("用户已成功添加到人员字段");
            },
            function(sender, args) {
                console.error("更新列表项失败: " + args.get_message());
            }
        );
    },
    function(sender, args) {
        console.error("获取用户失败: " + args.get_message());
    }
);

方法二:通过用户配置服务获取用户信息构造字段值

如果需要更多用户属性(比如显示名称),可以用SP.UserProfiles.PeopleManager来获取,然后构造字段值:

var siteUrl = _spPageContextInfo.siteAbsoluteUrl;
var clientContext = new SP.ClientContext(siteUrl);
var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);

// 注意这里要传入带i:0#.f|membership|前缀的邮箱格式
var accountName = "i:0#.f|membership|mymanager@domain.com";
var userProperties = peopleManager.getPropertiesFor(accountName);

clientContext.load(userProperties);
clientContext.executeQueryAsync(
    function() {
        var oListItem = // 你的列表项对象
        var userId = userProperties.get_userProfileProperties()['UserID'];
        
        var userFieldValue = new SP.FieldUserValue();
        userFieldValue.set_lookupId(userId);
        
        oListItem.set_item('MyFieldName', userFieldValue);
        oListItem.update();
        
        clientContext.executeQueryAsync(
            function() {
                console.log("操作成功");
            },
            function(sender, args) {
                console.error("更新失败: " + args.get_message());
            }
        );
    },
    function(sender, args) {
        console.error("获取用户属性失败: " + args.get_message());
    }
);

关键注意点:

  • SharePoint JSOM是异步操作,必须通过executeQueryAsync来执行请求,不能同步调用。
  • 人员字段接受的格式要么是SP.FieldUserValue对象(包含LookupId),要么是类似{ 'LookupId': userId }的简单对象,最可靠的方式是用LookupId来关联用户。
  • 如果用户不存在于当前站点的用户信息列表中,ensureUser方法会自动添加该用户(需要对应权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:13