【问题标题】:How to filter SharePoint list items by Created by in Microsoft Graph?如何在 Microsoft Graph 中按创建者筛选 SharePoint 列表项?
【发布时间】:2020-05-19 20:54:15
【问题描述】:

我正在尝试通过 Microsoft Graph 从 SharePoint 获取列表项的集合,我想按 CreatedBy 进行过滤。 请求:https://graph.microsoft.com/v1.0/sites/{siteid}/lists/TeamRequests/items

返回:

{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('{url}')/lists('TeamRequests')/items",
"value": [
    {
        "@odata.etag": "\"56ad787e-bd69-464a-b5da-dd953e40d7c4,13\"",
        "createdDateTime": "2018-02-26T08:34:26Z",
        "eTag": "\"56ad787e-bd69-464a-b5da-dd953e40d7c4,13\"",
        "id": "11",
        "lastModifiedDateTime": "2018-03-22T13:20:03Z",
        "webUrl": "{url}/Lists/TeamRequests/11_.000",
        "createdBy": {
            "user": {
                "email": "{email}",
                "id": "9c9cbb67-c049-4a2d-845d-6c5ca2300041",
                "displayName": "{Name}"
            }
        },
        "lastModifiedBy": {
            "user": {
                "email": "{email}",
                "id": "9c9cbb67-c049-4a2d-845d-6c5ca2300041",
                "displayName": "{Name}"
            }
        },
        "parentReference": {},
        "contentType": {
            "id": "0x01005F15F8133495554D834FF82F187AD0630002133A9CCDE4494D8CB2206D7D6453D6"
        }
    },

现在我想过滤这个对 createdBy 的请求,可以是 Id、displayName 或电子邮件地址。我尝试了?$filter=createdBy/user/email eq '{email}' 和类似的 id 或 displayName 请求。他们都回来了

{
    "error": {
        "code": "generalException",
        "message": "An unspecified error has occurred.",
        "innerError": {
            "request-id": "492e3bde-05fe-4484-a475-435ff0aa70b6",
            "date": "2018-07-23T07:41:46"
        }
    }
}

那么如何实现这个过滤器呢?它甚至支持吗?

【问题讨论】:

    标签: sharepoint microsoft-graph-api


    【解决方案1】:

    尽管这听起来像是一个简单的查询,但我还没有想出比以下解决方案更简单的方法:

    似乎不支持按用户字段过滤,除非提供 user id 的情况,这就是解决方案包含两个步骤的原因:

    1) 首先,我们需要通过Email 确定用户Id,为此可以使用以下查询:

    https://graph.microsoft.com/v1.0/sites/root/lists('User Information List')/items?expand=fields(select=Id,Email)
    

    *其中User Information List系统列表存储用户属性,包括Id和Email属性*

    2) 一旦用户Id 被解析,就可以应用按用户ID过滤项目的最终查询:

    https://graph.microsoft.com/v1.0/sites/{site-id}/lists('list-name')/items?filter=fields/<user-field-name>LookupId eq '<user-id>'  
    

    在哪里

    &lt;user-field-name&gt;LookupId 是一个在用户字段之外暴露的字段,如果是 Created 字段,名称应该是 AuthorLookupId

    例子:

    https://graph.microsoft.com/v1.0/sites/root/lists('TeamRequests')/items?filter=fields/AuthorLookupId eq '10'
    

    注意

    在某些情况下会返回以下错误 Field '' 不能在 filter 或 orderby 中引用,因为它没有被索引。 提供“首选:HonorNonIndexedQueriesWarningMayFailRandomly” 标头允许这样做,但请注意此类查询可能会失败 大型列表。

    在这种情况下,需要应用以下请求标头:

    首选:HonorNonIndexedQueriesWarningMayFailRandomly

    【讨论】:

      【解决方案2】:

      当我尝试访问用户信息列表列表时。未找到列表有错误。

      因此,在我的情况下,首先我根据状态值过滤列表数据,下一步获取登录的用户显示名称并根据显示名称过滤列表项。

      我正在使用@pnp/graph

      使用状态过滤器过滤列表数据

      let resultsList = await listItemsQuery.filter("fields/RequestStatus eq 'Approval Pending'").expand("fields").get<MicrosoftGraph.ListItem[]>();
      

      获取登录的个人资料:

      const profileQueryEndPoint = new GraphQueryableCollection(graph.me, "/");
      

      从上面的结果中选择 displayName 属性

      let profileData : User = await profileQueryEndPoint.select("displayName").get <User>(); 
      console.log('displayName : '  + profileData['displayName']);
      

      通过 profileData['displayName'] 过滤带有 createdby 字段的 ListItems

      let filterUserCreatedRequests: MicrosoftGraph.ListItem[] = resultsList.filter(ListItem => ListItem["createdBy"].user.displayName === profileData['displayName']);
      

      显示过滤结果

      console.log('filterUserCreatedRequests : ' + JSON.stringify(filterUserCreatedRequests));
      

      我将提供所有步骤供您参考。但是上面的代码可以简化更多。

      希望这可以帮助某人:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 2018-11-28
        • 2022-11-09
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多