Что действительно возвращает конечная точка Sharepoint Document Location?

Я пытаюсь получить информацию о записной книжке OneNote, которая связана с учетными записями CRM моей организации. Для каждой учетной записи создана книга OneNote, к которой можно получить доступ внутри CRM.

Насколько я понимаю, я могу использовать конечную точку SharePointDocumentLocation (находится здесь: https://docs.microsoft.com/en-us/dynamics365/customer-engagement/web-api/sharepointdocumentlocation?view=dynamics-ce-odata-9), чтобы получить местоположение конкретного файла, если я прошу указать тип местоположения равным 1.

Однако SharePointDocumentLocationId и SiteCollectionId, похоже, ни на что не указывают на сайтах моей компании. Должен ли я получать свои данные где-нибудь еще?

Я начал поиск в структуре SharePoint моей компании, чтобы увидеть, могу ли я получить какие-либо подсказки относительно того, где могут находиться эти документы. Мой первоначальный запрос почтальона (удаление сайтов с корневого сайта) не показывает сайт, на котором размещены наши документы CRM (sites / crmdocs). В конце концов мне удалось найти, где это хранилось, но попытка получить записные книжки OneNote, хранящиеся там, выдает ошибку, поскольку у нас там более 20 000 записных книжек, поэтому я не могу получить их все. Насколько мне известно, я могу получить записные книжки, если у меня есть конкретный идентификатор, который мне нужен.

Получив информацию о CRM, я пытаюсь отправить такой запрос:

https://graph.microsoft.com/v1.0/sites/ { myCompanyUrl}, {siteCollectionId}, {sharepointDocumentLocationId} / onenote / notebooks /

SiteCollectionId и SharePointDocumentLocationId взяты из моего запроса CRM SharePointDocumentLocation.

Я получаю следующее сообщение об ошибке:

The requested site was not found. Please check that the site is still accessible.

person Thomas    schedule 09.04.2019    source источник
comment
Пожалуйста, дайте мне знать, помог ли вам мой ответ или могу ли я помочь вам в дальнейшем   -  person André Cavaca    schedule 11.04.2019


Ответы (1)


Предполагая, что ваша среда использует нестандартную иерархию расположения сайта sharepoint и документа sharepoint, вы можете получить доступ к файлам One Note, используя следующую структуру ссылок:

[SharePointAbsoluteUrl]/[EntityLogicalName]/[RelativeUrl]_[RegardingObjectId]/[RelativeUrl]
  1. Как получить [SharePointAbsoluteUrl]:

Запроса sharepointdocumentlocations на самом деле недостаточно, потому что Dynamics 365 хранит эту информацию в другом объекте, называемом sharepointsite. Вот как его можно получить:

        var query = new QueryExpression("sharepointsite")
        {
            ColumnSet = new ColumnSet("absoluteurl")
        };
        query.Criteria.AddCondition("IsDefault", ConditionOperator.Equal, true);
        var entityCollection = _service.RetrieveMultiple(query);

        var absoluteUrl = entityCollection[0].Attributes["absoluteurl"];

В веб-API это эквивалентно:

GET https://[Your Org]/api/data/v9.0/sharepointsites?$select=absoluteurl&$filter=isdefault%20eq%20true

Может быть только сайт sharepoint по умолчанию, поэтому этот запрос вернет одну запись.

  1. Как получить оставшиеся детали:

Выборка для sharepointdocumentlocations, у которых есть тип расположения, предназначенный для интеграции One Note:

        var query = new QueryExpression("sharepointdocumentlocation")
        {
            ColumnSet = new ColumnSet("regardingobjectid", "relativeurl")
        };
        query.Criteria.AddCondition("locationtype", ConditionOperator.Equal, 1);

        var entityCollection = _service.RetrieveMultiple(query);

В веб-API это эквивалентно следующему запросу получения, не забудьте добавить Prefer: odata.include-annotations = "*" в заголовки HTTP-запроса, чтобы получить поле lookuplogicalname. :

GET https://[Your Org]/api/data/v9.0/sharepointdocumentlocations?$select=relativeurl,_regardingobjectid_value&$filter=locationtype%20eq%201

Этот запрос может возвращать множество записей, я использовал только первую в приведенных ниже примерах для объяснения.

[EntityLogicalName] будет вашим ((EntityReference)entityCollection[0].Attributes["regardingobjectid"]).LogicalName;. В Web Api будет вашим значением value._regardingobjectid_value@Microsoft.Dynamics.CRM.lookuplogicalname.

[RelativeUrl] будет вашим entityCollection[0].Attributes["relativeurl"]; В Web Api будет ваше значение value.relativeurl.

[RegardingObjectId] можно получить с помощью этого выражения ((EntityReference)entityCollection[0].Attributes["regardingobjectid"]).Id.ToString().Replace("-", "").ToUpper();. В веб-API идентификатором будет ваше _regardingobjectid_value значение, и вам нужно удалить тире и преобразовать его в верхний регистр на любом языке, на котором вы выполняете запрос.

У вас должен получиться такой URL-адрес: .sharepoint.com / account / A Datum Fabrication_A56B3F4B1BE7E6118101E0071B6AF231 / A Datum Fabrication

person André Cavaca    schedule 10.04.2019
comment
Спасибо за ваш ответ! Используете ли вы C # для этого запроса, и если да, то какую библиотеку вы используете? Изначально я использовал NodeJS для выполнения этого запроса, и я получил обратно aboutObjectId, но не могу извлечь из него LogicalName. - person Thomas; 12.04.2019
comment
Кроме того, насколько я понимаю, это даст мне URL-адрес записной книжки OneNote, но я считаю, что для получения его данных мне нужно будет использовать Microsoft Graph API, который имеет определенный формат для получения данных OneNote. Есть ли способ извлечь данные OneNote, как только я получу этот URL-адрес? - person Thomas; 12.04.2019
comment
Я решил по крайней мере первый комментарий, мне нужно было включить Prefer: odata.include-annotations = * в заголовок моего запроса. Однако я все еще не знаю, как использовать эту информацию для получения записной книжки OneNote с помощью api графика. - person Thomas; 12.04.2019
comment
Код @Thomas C # использует библиотеку Microsoft.Xrm.Sdk. Я обновил свой ответ вызовами веб-API, чтобы его мог использовать любой, кто не в мире .NET. Обязателен ли Graph API? Разве вы не можете просто сделать REST-запрос к Sharepoint прямо в узле JS? - person André Cavaca; 12.04.2019
comment
Я бы хотел, чтобы это было ненужным, но я не уверен, смогу ли я за пределами этого. Если я отправлю запрос на ссылку после ее создания, я получаю ошибку 403 запрещено, вероятно, потому, что я не вошел в свою организацию из моего кода. Однако я не знаю, как войти в свою учетную запись Microsoft с помощью кода. Я полагаю, что мне нужен токен на предъявителя, но не знаю, как мне его получить. - person Thomas; 12.04.2019