SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Probleme bei Excel-Import per PowerShell

Unbeantwortet Dieser Beitrag hat 3 Antworten

Ohne Rang
8 Beiträge
GuentherWilkens erstellt 10 Juni 2013 10:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Guten Morgen,

ich habe ein kleines Problem mit den Daten die ich per Power-Shell in eine Liste importiere.

Ich habe für unsere Firma ein kleines Ticket-System erstellt. Für diese Ticket-System habe ich die Kundendaten aus dem Warenwirtschaftssystem als Excel-Datei ausgelesen und per einfachen PowerShell Script in eine Sharepoint-Liste eingelesen.

Diese Kundendaten möchte ich nun dazu verwenden um im Ticket-System die Tickets bestimmten Kunden zuzuweisen.

Dies funktioniert auch soweit. Wenn ich nun allerdings den Import neu ausführe (Aufgrund von Kundenänderungen oder Neukunden) wird die Kundenliste komplett geleert und wieder neu gefüllt. Dadurch verlieren die Tickets auch den Kundennamen, den ich im Ticket mit einem "Nachschlage"-Feld hinterlegt habe. Ich gehe mal davon aus, dass die "ID"s nach dem leeren nun andere sind als vorher und die Verbindung zwischen Ticket <-> Kunden nicht mehr passt.

Gibt es vielleicht eine einfache Lösung für diese Problem?

Hier das PowerShell-Script:

 

Get-Content C:\Import\adressen.txt | Set-Content -Encoding utf8 C:\Import\adressen_utf8.txt

$contents = Import-CSV ‘C:\Import\adressen_utf8.txt' -header("Kundennummer", "Anrede", "Vorname", "Nachname", "Name2", "Straße","Land", "PLZ", "Ort", "Briefanrede", "Telefon", "EMail" ) -Delimiter ";"

$webURL = “http://fh-p-ap”

$web = Get-SPWeb -Identity $webURL

$listName = "Kunden"

$list= $web.Lists["$listName"] 

$caml=""

$query=New-Object Microsoft.SharePoint.SPQuery

$query.ViewAttributes = "Scope='Recursive'"

$query.Query=$caml

$items=$list.GetItems($query)

Write-Host $items.Count 

$items | % { $list.GetItemById($_.Id).Delete() }

foreach ($row in $contents )

{

   $item = $list.Items.Add();

    $item["Kundennummer"] = $row.Kundennummer

    $item["Anrede"] = $row.Anrede

    $item["Vorname"] = $row.Vorname

    $item["Nachname"] = $row.Nachname

    $item["Name2"] = $row.Name2

    $item["Straße"] = $row.Straße

    $item["Land"] = $row.Land

    $item["PLZ"] = $row.PLZ

    $item["Ort"] = $row.Ort

    $item["Briefanrede"] = $row.Briefanrede

    $item["Telefon"] = $row.Telefon

    $item["EMail"] = $row.EMail

    $item.Update()

}

$web.Dispose()

 

 

Vielen Dank schonmal im Vorraus.

Alle Antworten

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 10 Juni 2013 10:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Verzichte auf das Löschen der Elemente bei jedem neuen Lauf. SharePoint merkt sich, welches die letzte vergebene ID für Elemente einer Liste ist. Wenn Du alle Elemente löscht, ändert sich daran nichts (weil ja ggf. Elemente aus dem Papierkorb wiederhergestellt werden könnten). Die ID selbst wird für Nachschlagefelder herangezogen, d.h., die ID ist die eigentliche Referenz.

Baue den Import so um, dass Du für jedes Element aus der Datei prüfst, ob es bereits ein zugehöriges Element gibt. Dafür brauchst Du sinnvollerweise einen eindeutichen Bezeichner, der in Deiner Export-Datei steht. Wenn es bereits ein Element in der SharePoint-Liste gibt, dann führe die notwendigen Veränderungen durch und speichere das per SPListItem.Update(). Ansonsten füge ein neues Element in die Liste ein, wie Du es ja bereits machst.

Beste Grüße

Olaf

Ohne Rang
8 Beiträge
GuentherWilkens Als Antwort am 11 Juni 2013 09:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank für den Tipp.

Habe es jetzt so gelöst:

 

Get-Content C:\Import\adressen.txt | Set-Content -Encoding utf8 C:\Import\adressen_utf8.txt

$contents = Import-CSV ‘C:\Import\adressen_utf8.txt' -header("Kundennummer", "Anrede", "Vorname", "Nachname", "Name2", "Straße","Land", "PLZ", "Ort", "Briefanrede", "Telefon", "EMail" ) -Delimiter ";"

 

$webURL = “http://fh-p-ap”

$web = Get-SPWeb -Identity $webURL

$listName = "Kunden"

$list= $web.Lists["$listName"] 

 

foreach ($row in $contents )

{

                #Check for existing item

                $item = $list.Items | Where { $_["Kundennummer"] -eq $row.Kundennummer } 

 

                If ($item -ne $null) { 

                               $item["Kundennummer"] = $row.Kundennummer

                               $item["Anrede"] = $row.Anrede

                               $item["Vorname"] = $row.Vorname

                               $item["Nachname"] = $row.Nachname

                               $item["Name2"] = $row.Name2

                               $item["Straße"] = $row.Straße

                               $item["Land"] = $row.Land

                               $item["PLZ"] = $row.PLZ

                               $item["Ort"] = $row.Ort

                               $item["Briefanrede"] = $row.Briefanrede

                               $item["Telefon"] = $row.Telefon

                               $item["EMail"] = $row.EMail

                               $item.Update()

                } 

                Else { 

                               $itemnew = $list.Items.Add();

                               $itemnew["Kundennummer"] = $row.Kundennummer

                               $itemnew["Anrede"] = $row.Anrede

                               $itemnew["Vorname"] = $row.Vorname

                               $itemnew["Nachname"] = $row.Nachname

                               $itemnew["Name2"] = $row.Name2

                               $itemnew["Straße"] = $row.Straße

                               $itemnew["Land"] = $row.Land

                               $itemnew["PLZ"] = $row.PLZ

                               $itemnew["Ort"] = $row.Ort

                               $itemnew["Briefanrede"] = $row.Briefanrede

                               $itemnew["Telefon"] = $row.Telefon

                               $itemnew["EMail"] = $row.EMail

                               $itemnew.Update()

                }              

}

Write-Host -ForegroundColor green "List Updated Successfully"

$web.Dispose()

Ohne Rang
391 Beiträge
Frank Daske Als Antwort am 10 Juni 2013 10:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Guenther,

wenn man häufiger solche Aktualisierungen von SharePoint Listen mit externen Daten durchzuführen hat, gibt es auch fertige Tools, die genau das leisten. Dabei werden dann nahezu beliebige Datenquellen unterstützt.

http://www.layer2.de/en/community/FAQs/cloud-connector/Pages/Office-365-Integration-Excel-files-to-cloud.aspx

Das Problem beim Skript ist, dass man ja auch noch die Inhalte vergleichen muss, um nur geänderte Daten zu aktualisieren. Ansonsten werden ggf. Benachrichtigungen oder Workflows ausgelöst.

Grüße, Frank