使用带有人员字段的 MS Graph API 将新项目发布到 SharePoint 列表

POSTing a new item to a SharePoint list using the MS Graph API with a People field

我已经使用来自 SharePoint Online 的 Microsoft Graph 设置了一个使用数据的 React Web 应用程序,运行良好。我可以读取和写入 SP 列表,但我找不到任何关于如何构建数据以写入 'People/Group' 字段的文档。

查询包含这些字段的列表会得到 "ManagerLookupId": "12",其中 Manager 是人员选取器字段名称。我可以使用扩展查询字符串解析 "12"。我不知道如何使用来自 Microsoft Graph

/v1.0/beta 端点写入它

将此对象发布到相关端点有效(用于单行文本、选择等)。

{
  "fields": {
    "Title": "a",
    "Category": "b",
    "Description": "c"
  }
}

但如果我要在人员选择器字段中添加,我不知道如何构建该数据。我试过电子邮件地址和 GUID,两者都不起作用。查看 SP 本机如何执行此操作,它似乎在为人员选择器字段提交时提交此值(已替换实际值)-

{
  "Key": "i:0#.f|membership|EMAIL",
  "DisplayText": "NAME",
  "IsResolved": true,
  "Description": "EMAIL",
  "EntityType": "User",
  "EntityData": {
    "IsAltSecIdPresent": "False",
    "Title": "POSITION",
    "Email": "EMAIL",
    "MobilePhone": "",
    "ObjectId": "GUID",
    "Department": ""
  },
  "MultipleMatches": [],
  "ProviderName": "Tenant",
  "ProviderDisplayName": "Tenant"
}

复制此也无法更新列表中的人员字段。

我无法在 MS Graph API 站点上找到任何文档或在他们的 Github 上找到类似的先前问题,因此非常感谢任何帮助!

我的测试demo,User是people字段允许多个用户。

{
  "fields": {
    "Title": "test",
    "UserLookupId@odata.type": "Collection(Edm.Int32)",
    "UserLookupId":[10,23]
  }
}

对于一个用户。

{
  "fields": {
    "Title": "test",
    "UserLookupId@odata.type": "Edm.Int32",
    "UserLookupId":23
  }
}

您可以在 FieldValueSet 的文档中找到 一些 相关信息:

Lookup fields (like Author above) are not returned by default. Instead, the server returns a 'LookupId' field (like AuthorLookupId above) referencing the listItem targeted in the lookup. The name of the 'LookupId' field is the original field name followed by LookupId.

在幕后,这是 SharePoint 如何跟踪用户的 side-effect。作为历史的产物,SharePoint 维护着它自己的用户数据库。虽然在某个时间点 SP 管理员与这些用户有很多接触,但今天它是一个完全自动化的过程。它只是在第一次看到经过身份验证的 AAD 用户时创建一个新的 SPUser 记录。这些用户记录有自己的 id 属性。这是一个常见的 INT 而不是 GUID(在您的示例中,他们的 id12)。

更新 ListItem 时,您需要使用 SharePoint 的 id。您可以将其作为单个值或数组传递:

{
  "fields": {
     "ManagerLookupId": 12
  }
}

{
  "fields": {
     "ManagerLookupId": [10,11,12]
  }
}

问题出在此处,无法从 Microsoft Graph 获取此 SharePoint 用户 id。显然,这使得 create/update a ListItem 变得非常具有挑战性。要解决这个问题,您可以使用旧的 SharePoint REST API's ensureUser 端点:

http://<sitecollection>/<site>/_api/web/ensureUser(logonName)

请记住,您还需要 SharePoint 的令牌才能调用此 API。如果您使用的是 AAD v1 终结点,这通常只是使用您的 SharePoint 资源 (https://{tenant}.sharepoint.com) 刷新您的令牌以进行此调用,然后刷新回 Graph 资源 (https://graph.microsoft.com) 的问题你的其他电话。