копировать элементы списка из одного списка в другой в sharepoint

Как в Sharepoint можно скопировать элемент списка из одного списка в другой, например, скопировать из «Списка А» в «Список Б» (оба находятся в корне сайта)

Я хочу, чтобы это копирование происходило, когда новый элемент списка добавляется в «Список А»

Я попытался использовать метод CopyTo () объекта SPListItem внутри приемника событий ItemAdded, но не смог определить URL-адрес для копирования.


person raklos    schedule 02.07.2009    source источник
comment
См. Также stackoverflow.com/questions/4508211/   -  person SteveC    schedule 04.01.2011


Ответы (11)


На самом деле, как сказал Ларс, может быть сложно перемещать элементы, сохранять версии и исправлять информацию о пользователе. Я делал аналогичные вещи с этим раньше, поэтому, если вам нужны примеры кода, дайте мне знать через комментарий и могу предоставить вам некоторые рекомендации.

Метод CopyTo (если вы решите пойти с этим) нужен абсолютный Uri, например: http://host/site/web/list/filename.doc

Итак, если вы выполняете это в приемнике событий, вам необходимо объединить строку, содержащую необходимые элементы. Что-то вроде (обратите внимание, что это можно сделать и другими способами):

string dest= 
 siteCollection.Url + "/" + site.Name + list.Name + item.File.Name;
person Johan Leino    schedule 02.07.2009
comment
+1 за CopyTo. @raklos То же, что и ваш вопрос stackoverflow.com/questions/1059175 - person Alex Angas; 03.07.2009
comment
Мне никогда не удавалось заставить CopyTo работать для простых элементов списка. Он работает для библиотек документов, но не для списков, таких как сообщения в блогах, задачи и т. Д. - person Daniel; 17.08.2012
comment
Отлично. Но есть ли способ сделать этот документ приложением к списку? Я хочу скопировать вложения списка из одного элемента списка в другой. Является ли это возможным? - person Mihir; 24.04.2015

Вот код, который я использую. Передайте ему SPlistItem и имя целевого списка, как показано в Sharepoint (не URL-адрес). Единственное ограничение - оба списка должны находиться на одном сайте:

private SPListItem CopyItem(SPListItem sourceItem, string destinationListName) {
        //Copy sourceItem to destinationList
        SPList destinationList = sourceItem.Web.Lists[destinationListName];
        SPListItem targetItem = destinationList.Items.Add();
        foreach (SPField f in sourceItem.Fields) {
            //Copy all except attachments.
            if (!f.ReadOnlyField && f.InternalName != "Attachments"
                && null != sourceItem[f.InternalName])
            {
                targetItem[f.InternalName] = sourceItem[f.InternalName];
            }
        }
        //Copy attachments
        foreach (string fileName in sourceItem.Attachments) {
            SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
            byte[] imageData = file.OpenBinary();
            targetItem.Attachments.Add(fileName, imageData);
        }

        return targetItem;
    }
person Sylvain Perron    schedule 09.07.2010
comment
А как насчет версий предметов? - person Ievgen Naida; 11.10.2012
comment
@Sylvain Perron - это решение сработало для меня. Но как скопировать мета-содержимое исходного элемента, такое как созданное, измененное и т. Д.? - person Joseph Jojo John; 07.05.2020

Копирование и перемещение файлов, элементов и папок в SharePoint может быть сложной задачей, если вы хотите сохранить все метаданные, временные метки, информацию об авторе и историю версий. Взгляните на CopyMove для SharePoint - у него также есть API веб-службы.

person Lars Fastrup    schedule 02.07.2009
comment
Довольно интересно, что я столкнулся с ситуацией, когда мне теперь нужно написать службу перемещения, чтобы преодолеть ограничения CopyMove для Sharepoint;) как иронично. - person ; 21.01.2011

На рынке есть много инструментов для копирования элемента списка в другой список (точка, метавис и т. Д.), Но они довольно дороги, если вы планируете делать это только с одним списком.

Если вы можете делать это вручную, например, раз в неделю, обратите внимание на следующий инструмент: http://en.share-gate.com/sharepoint-tools/copy-move-sharepoint-list-items-with-metadata-and-version-history

person Sebastien    schedule 07.07.2011

Вот эквивалент Sylvian в PowerShell, который позволяет копировать между сайтами. Его код тоже можно изменить ...

param([string]$sourceWebUrl, [string]$sourceListName, [string]$destWebUrl, [string]$destListName)

$sourceWeb = get-spweb $sourceWebUrl;
$sourceList = $sourceWeb.Lists[$sourceListName];
$destWeb = get-spweb $destWebUrl;
$destList = $destWeb.Lists[$destListName];
$sourceList.Items |%{
$destItem = $destList.Items.Add();
$sourceItem = $_;
$sourceItem.Fields |%{
    $f = $_;
    if($f.ReadOnlyField -eq $false -and $f.InternalName -ne "Attachments" -and $sourceItem[$f.InternalName] -ne $null){
        $destItem[$f.InternalName] = $sourceItem[$f.InternalName];
    }
}
$destItem.Update();
}

Чтобы использовать, скопируйте и вставьте в файл copy-listitems.ps1 и запустите с помощью командной строки Sharpoint powerhsell ...

person Daniel    schedule 17.08.2012

Убедитесь, что вы вызываете метод CopyTo (url) для SPFile, а не для SPListItem. Например:

ItemUpdated(SPItemEventProperties properties)
{ 
  //...
  string url = properties.Web.Site.Url + "/" + properties.Web.Name + "Lists/ListName/" + properties.ListItem.File.Name;
  //properties.ListItem.File.MoveTo(url);
  properties.ListItem.File.CopyTo(url);
  //...
}
person Petr Spacek    schedule 23.01.2013

private void CopyAttachmentsToList(SPListItem srcItem, SPListItem tgtItem)
{
    try
    {
        //get source item attachments from the folder
        SPFolder srcAttachmentsFolder =
            srcItem.Web.Folders["Lists"].SubFolders[srcItem.ParentList.Title].SubFolders["Attachments"].SubFolders[srcItem.ID.ToString()];

        //Add items to the target item
        foreach (SPFile file in srcAttachmentsFolder.Files)
        {
            byte[] binFile = file.OpenBinary();
            tgtItem.Update();
            tgtItem.Attachments.AddNow(file.Name, binFile);
            tgtItem.Update();
        }
    }
    catch
    {
        //exception message goes here
    }
    finally
    {
        srcItem.Web.Dispose();
    }
}

Не забудьте добавить эту строку tgtItem.Update();, иначе вы получите ошибку.

person Sunny Sinha    schedule 07.01.2014

Значит, в списках одинаковые или похожие столбцы? В любом случае вы можете создать простой рабочий процесс, который запускается автоматически при создании элемента в «Списке А». Поскольку рассматриваемый рабочий процесс относительно прост, я бы рекомендовал использовать SharePoint Designer (который является бесплатным) для его создания, поскольку вы можете легко сопоставить столбцы из двух списков. Приведенное ниже описание должно помочь вам начать работу.

Создание рабочего процесса - SharePoint Designer

person UnhipGlint    schedule 02.07.2009

У меня такая же проблема.

Немного поэкспериментировав вместо

targetItem[f.InternalName] = sourceItem[f.InternalName];

Я использовал:

targetItem[childField.Title] = sourceItem[parentField.Title];

person hrezs    schedule 22.12.2011

Как скопировать поле и сохранить версии:

public static SPListItem CopyItem(SPListItem sourceItem, SPList destinationList)
            {
                SPListItem targetItem = destinationList.AddItem();

                //loop over the soureitem, restore it
                for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                {
                    //set the values into the archive 
                    foreach (SPField sourceField in sourceItem.Fields)
                    {
                        SPListItemVersion version = sourceItem.Versions[i];

                        if ((!sourceField.ReadOnlyField) && (sourceField.InternalName != "Attachments"))
                        {
                            SetFields(targetItem, sourceField, version);
                        }
                    }

                    //update the archive item and 
                    //loop over the the next version
                    targetItem.Update();
                }

                foreach (string fileName in sourceItem.Attachments)
                {
                    SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
                    targetItem.Attachments.Add(fileName, file.OpenBinary());
                }

                targetItem.SystemUpdate();
                return targetItem;
            }

            private static bool SetFields(SPListItem targetItem, SPField sourceField, SPListItemVersion version)
            {
                try
                {
                    targetItem[sourceField.InternalName] = version.ListItem[sourceField.InternalName];
                    return true;
                }
                catch (System.ArgumentException)//field not filled
                {
                    return false;
                }
                catch (SPException)//field not filled
                {
                    return false;
                }
            }
person Ievgen Naida    schedule 11.10.2012

Копирование элементов списка из одного списка или библиотеки SharePoint в другой список или библиотеку SharePoint с помощью кода на стороне сервера C #

// Itecollection - это набор данных из исходного списка

 public void CopyItemsFromOneListToAnotherList(SPListItemCollection itemCollection)
 {  
 using (SPSite site = new SPSite(siteUrl))
 {
  using (SPWeb web = site.OpenWeb())
  {
     //Get destination list/library
     //destListName - Destination list/library name
   SPList destList = web.Lists.TryGetList(destListName);

   foreach (SPListItem sourceItem in itemCollection)
   {
    //Add new Item to list
    SPListItem destItem = destList.Items.Add();

    foreach (SPField field in sourceItem.Fields)
    {
     if (!field.ReadOnlyField && !field.Hidden && field.InternalName != "Attachments")
     {
      if (destItem.Fields.ContainsField(field.InternalName))
      {
       //Copy item to  destination library
         destItem[field.InternalName] = sourceItem[field.InternalName];
      }
     }
    }
    //Update item in destination  library or list
    destItem.Update();
    Console.WriteLine("Copied " + sourceItem["ID"] + "to destination list/library");
   }
  }
 }

 }
person Anil Rathod    schedule 05.02.2016