Не удается сохранить основные метаданные документа (кем созданы, изменены) при импорте документов в библиотеку документов SharePoint

В настоящее время я создаю инструмент для перехода с системы управления документами на использование SharePoint Online. Основная проблема, с которой я сталкиваюсь, - это сохранить подробные сведения об авторах документов и времени создания. Я проверил кучу кода в Интернете, но ни с одним из них мне не удалось добиться успеха. Вот подходы, которые я использовал

  1. SharePoint Rest API
  2. Microsoft Graph API
  3. CSOM (с использованием консольного приложения)

Вот код, который у меня есть в CSOM, но я все еще не могу обновить поле Автор

li["Title"] = "Update from CSOM";
li["Created"] = DateTime.Now.AddYears(-5);
li["Author"] = author.Id;
li.UpdateOverwriteVersion();
clientContext.ExecuteQuery();

Есть идеи, как это сделать, или есть ли другой подход для достижения моей цели?


person Joseph Wahba    schedule 16.04.2020    source источник
comment
Привет, если опубликованные ответы решают ваш вопрос, отметьте его как ответ, нажав галочку. Это поможет другим найти ответы на свои вопросы.   -  person Brian T. Jackett MSFT    schedule 26.05.2020


Ответы (2)


Код работает, когда я тестировал в своей среде.

using (ClientContext context = new ClientContext("https://xxx.sharepoint.com/sites/lee"))
            {
                string s = "password";
                SecureString passWord = new SecureString();
                foreach (var c in s)
                    passWord.AppendChar(c);
                context.Credentials = new SharePointOnlineCredentials("[email protected]", passWord);

                var author = context.Web.EnsureUser("[email protected]");
                context.Load(author);
                context.ExecuteQuery();
                var _List = context.Web.Lists.GetByTitle("List1");
                var li = _List.GetItemById(1);

                li["Title"] = "Update from CSOM";
                li["Created"] = DateTime.Now.AddYears(-5);
                li["Author"] = author.Id;
                li.UpdateOverwriteVersion();
                context.ExecuteQuery();

            }
person Lee_MSFT    schedule 17.04.2020
comment
Оказывается, этот код отлично работает для любой библиотеки документов, кроме библиотеки документов деталей, созданной на сайте, довольно странно, но я тестировал его на других сайтах с теми же результатами, и я получил те же результаты. - person Joseph Wahba; 22.06.2020

Вам нужно будет обновить поля Автор и Редактор одновременно, чтобы обновить поле CreatedBy. Если вы хотите обновить дополнительные поля одновременно, вы можете. Использование SystemUpdate () не обновляет дату изменения, тогда как Update () обновляет дату изменения. См. Сокращенный образец ниже.

FieldUserValue userValue = new FieldUserValue();
User newUser = cc.Web.EnsureUser("[email protected]");
cc.Load(newUser);
cc.ExecuteQuery();
userValue.LookupId = newUser.Id;

item["Author"] = userValue;
item["Editor"] = userValue;

item.SystemUpdate();
cc.ExecuteQuery();
person Brian T. Jackett MSFT    schedule 11.05.2020
comment
См. Здесь аналогичный пример, предназначенный для SP2016: https://sharepoint.stackexchange.com/questions/256991/how-to-update-author-created-by-field-in-sharepoint-2016-using-csom-programati - person Brian T. Jackett MSFT; 11.05.2020