如何在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
相关产品推荐
相关产品推荐

