web-dev-qa-db-fra.com

copier des éléments de liste d'une liste à une autre dans SharePoint

Dans Sharepoint, comment copier un élément de la liste d’une liste à une autreeg copier de "Liste A" vers "Liste B"

Je souhaite que cette copie se produise lorsqu'un nouvel élément de liste est ajouté à la "Liste A"

J'ai essayé d'utiliser la méthode CopyTo () d'un SPListItem dans le récepteur d'événements ItemAdded mais je n'ai pas pu déterminer l'URL vers laquelle copier.

15
raklos

En effet, comme l'a dit Lars, il peut être difficile de déplacer des éléments, de conserver les versions et de corriger les informations utilisateur. J'ai déjà fait des choses similaires avec cela auparavant, donc si vous avez besoin d'exemples de code, faites-le moi savoir au travers d'un commentaire et pourrez vous guider.

La méthode CopyTo (si vous décidez d'y aller) nécessite un Uri absolu tel que: http: //Host/site/web/list/nom_fichier.doc

Ainsi, si vous effectuez cette opération dans un récepteur d'événements, vous devez concaténer une chaîne contenant les éléments nécessaires. Quelque chose comme (notez que cela peut être fait de différentes manières):

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

Voici le code que j'utilise. Transmettez-lui un SPlistItem et le nom de la liste de destination telle que vue dans Sharepoint (pas l'URL) La seule restriction est que les deux listes doivent figurer sur le même site:

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

Il existe de nombreux outils sur le marché pour copier un élément de liste dans une autre liste (avepoint, metavis, etc.), mais ils sont assez coûteux si vous envisagez de le faire sur une seule liste.

Si vous pouvez le faire manuellement une fois par semaine, par exemple, utilisez l'outil suivant: http://en.share-gate.com/sharepoint-tools/copy-move-sharepoint-list-items-with-metadata- and-version-history

1
Sebastien

Copier et déplacer des fichiers, des éléments et des dossiers dans SharePoint peut s'avérer difficile si vous souhaitez conserver toutes les métadonnées, les horodatages, les informations sur l'auteur et l'historique des versions. Jetez un oeil sur CopyMove for SharePoint - il dispose également d’une API de service Web.

1
Lars Fastrup

Assurez-vous d'appeler la méthode CopyTo (url) sur SPFile et non sur SPListItem . Par exemple:

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

N'oubliez pas d'ajouter cette ligne, tgtItem.Update();, sinon vous obtiendrez une erreur.

1
Sunny Sinha

J'ai eu le même problème.

Après avoir essayé un peu au lieu de

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

J'ai utilisé:

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

0
hrezs

Copier des éléments de liste d'une liste ou d'une bibliothèque SharePoint vers une autre liste ou bibliothèque SharePoint à l'aide du code côté serveur c #

// Itecollection est une collection de données de la liste source

 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

Comment copier un champ et sauvegarder des versions: 

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

Voici un équivalent de Sylvian de PowerShell qui permet une copie intersite. Son code pourrait être modifié de la même façon ...

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

Pour utiliser, copier et coller dans un fichier copy-listitems.ps1 et exécuter à l'aide de la ligne de commande Sharpoint powerhsell ...

0
Daniel

Ainsi, les listes ont exactement les mêmes colonnes ou des colonnes similaires? Dans les deux cas, vous pouvez créer un flux de travail simple qui s'exécute automatiquement lorsqu'un élément est créé dans "Liste A". Le flux de travail en question étant relativement simple, je vous recommande d'utiliser SharePoint Designer (qui est gratuit) pour le créer, car vous pouvez facilement faire correspondre les colonnes des deux listes. Le parcours ci-dessous devrait pouvoir vous aider à démarrer.

Créer un flux de travail - SharePoint Designer

0
UnhipGlint