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