web-dev-qa-db-de.com

kopieren Sie Listenelemente in Sharepoint von einer Liste in eine andere

Wie können Sie in Sharepoint einen Listeneintrag von einer Liste in eine andere Liste Kopieren, z. B. von "Liste A" nach "Liste B" (beide befinden sich am Stamm der Site)

Ich möchte, dass dieses Kopieren erfolgt, wenn ein neues Listenelement zu "Liste A" hinzugefügt wird.

Ich habe versucht, die CopyTo () - Methode eines SPListItem im ItemAdded-Ereignisempfänger zu verwenden, konnte jedoch die zu kopierende URL nicht herausfinden.

15
raklos

In der Tat, wie Lars gesagt hat, kann es schwierig sein, Elemente zu verschieben, Versionen zu behalten und Benutzerinformationen zu korrigieren. Ich habe ähnliche Dinge mit dem zuvor gemacht. Wenn Sie also Codebeispiele benötigen, lassen Sie es mich durch einen Kommentar wissen und können Ihnen einige Anleitungen geben.

Die CopyTo -Methode (falls Sie sich dazu entscheiden) benötigt einen absoluten Uri wie: http: //Host/site/web/list/filename.doc

Wenn Sie dies in einem Ereignisempfänger durchführen, müssen Sie einen String zusammenstellen, der die erforderlichen Elemente enthält. Etwas wie (Beachten Sie, dass dies auch auf andere Weise möglich ist):

string dest= 
 siteCollection.Url + "/" + site.Name + list.Name + item.File.Name;
5
Johan Leino

Hier ist der Code, den ich verwende. Übergeben Sie ein SPlistItem und den Namen der Zielliste, wie in Sharepoint angegeben (nicht die URL). Die einzige Einschränkung ist, dass sich beide Listen auf derselben Site befinden müssen:

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;
    }
17
Sylvain Perron

Es gibt viele Tools auf dem Markt, um ein Listenelement in eine andere Liste zu kopieren (avepoint, metavis usw.), aber sie sind ziemlich teuer, wenn Sie dies nur auf einer Liste planen.

Wenn Sie dies einmal pro Woche manuell tun können, schauen Sie sich folgendes Tool an: http://de.share-gate.com/sharepoint-tools/copy-move-sharepoint-list-items-with-metadata- and-version-history

1
Sebastien

Das Kopieren und Verschieben von Dateien, Elementen und Ordnern in SharePoint kann schwierig sein, wenn Sie alle Metadaten, Zeitstempel, Autoreninformationen und den Versionsverlauf beibehalten möchten. Schauen Sie sich ein CopyMove für SharePoint an - es verfügt auch über eine Web-Service-API.

1
Lars Fastrup

Stellen Sie sicher, dass Sie die CopyTo (url) -Methode für SPFile und nicht für SPListItem. Aufrufen. Beispiel:

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);
  //...
}
1
Petr Špaček
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();
    }
}

Vergessen Sie nicht, diese Zeile tgtItem.Update(); hinzuzufügen, andernfalls erhalten Sie einen Fehler.

1
Sunny Sinha

Ich hatte das gleiche Problem.

Nach etwas experimentieren statt

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

Ich benutzte:

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

0
hrezs

Kopieren von Listenelementen aus einer SharePoint-Liste oder -Bibliothek in eine andere SharePoint-Liste oder -Bibliothek mithilfe von C # Server-Seitencode

// Itecollection ist eine Sammlung von Daten aus der Quellliste

 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");
   }
  }
 }

 }
0
Anil Rathod

So kopieren Sie ein Feld und speichern Sie Versionen: 

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;
                }
            }
0
Ievgen Naida

Hier ist ein Powershell-Äquivalent von Sylvian, das das Kopieren von Seiten ermöglicht. Sein Code könnte auf ähnliche Weise geändert werden ...

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();
}

Kopieren Sie die Datei copy-listitems.ps1 und fügen Sie sie mit einer Sharpoint-Powerhsell-Befehlszeile ein.

0
Daniel

Also haben die Listen die gleichen oder ähnliche Spalten? In beiden Fällen können Sie einen einfachen Workflow erstellen, der automatisch ausgeführt wird, wenn ein Element in "Liste A" erstellt wird. Da der fragliche Workflow relativ einfach ist, empfehle ich die Verwendung von SharePoint Designer (der kostenlos ist), da Sie die Spalten aus den beiden Listen problemlos zuordnen können. Der Durchgang unten sollte Ihnen den Einstieg erleichtern.

Einen Workflow erstellen - SharePoint Designer

0
UnhipGlint