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.




Script optimieren

Geprüfte Antwort Dieser Beitrag hat 3 Antworten

Ohne Rang
142 Beiträge
Andman erstellt 25 Apr. 2016 09:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo!

Hab hier zwei Scripts, die mir etwas Kopfschmerzen bereiten. Sie funktionieren, aber evtl. könnten sie etwas optimiert werden. Im Endeffekt geht es um das Generieren von Worddokumenten, da hängt auch noch mehr dran. Ist aber eine kompliziertere Geschichte. Speziell geht es mir um diese zwei Scripts (Powershell und JavaScript). Vielleicht hat ja jemand Verbesserungsvorschläge, was die Syntax angeht.

Script Nr. 1

$sourceWebURL = "[[=Context.Site.Url]][[=Context.WebUrl]]"
$sourceListName = "SerienbriefeTemp"
$spSourceWeb = Get-SPWeb $sourceWebURL
$spSourceList = $spSourceWeb.Lists[$sourceListName]
$spQuery = New-Object Microsoft.SharePoint.SPQuery
$caml = '<OrderBy><FieldRef Name="Created" Ascending="True"/></OrderBy>'
$spQuery.Query = $caml
$listItems = $spSourceList.getItems($spQuery)
foreach($item in $listItems)
{
   $latestItem = $item
}
$latestItem | ForEach-Object {
    $Kontakte = $_['Kontakte']
    $Author = $_['Author']
    $Title = $_['Title']
}
$Author = $Author.Substring($Author.IndexOf('#') + 1);
$fullName = $author;
$names = $fullName.Split(',')
$FirstName = $names[1].Trim()
$LastName = $names[0]
$author = $FirstName + " " + $LastName
$contactId = @()
$contactId = $Kontakte.LookupId
$contactListName = "Kontakte"
$spContactList = $spSourceWeb.Lists[$contactListName]
$spContactItems = $spContactList.Items
$spContactItems | ForEach-Object {
    foreach ($id in $contactId) {
            if($_['ID'] -eq $id){
               $_['TempName'] = $author
               $_['TempTitle'] = $Title
               $_.Update()             
            }
    } 
}
$spSourceWeb.Dispose()

Script Nr. 2

JavaScript: function modalClosed(result, args) {
        if (result === SP.UI.DialogResult.OK) {

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', createListItem(args));
 }
   }

JavaScript: var options = {
title: "Brief erstellen",
url: '[[=Context.Site.Url]]/crm/contacts/Lists/Serienbriefe/newform.aspx?contactids=' +[[ID]]+'&activityid=6',
dialogReturnValueCallback: modalClosed
        };
SP.UI.ModalDialog.showModalDialog( options );

JavaScript: function createListItem(args) {
   
    var clientContext = new SP.ClientContext.get_current();

    var oList = clientContext.get_web().get_lists().getByTitle('SerienbriefeTemp');
       
    var itemCreateInfo = new SP.ListItemCreationInformation();
    this.oListItem = oList.addItem(itemCreateInfo);
   
    var vorlageLU = new SP.FieldLookupValue();

    vorlageLU.set_lookupId(parseInt(args[1]));
   
    if(args[2])
    {
    var projectLU = new SP.FieldLookupValue();
    projectLU.set_lookupId(parseInt(args[2]));
    oListItem.set_item('Projekt', projectLU);
    }

    oListItem.set_item('Title', args[0]);
    oListItem.set_item('Vorlage', vorlageLU);
   
    oListItem.set_item('Kontakte', [[ID]]);

       
    oListItem.update();

    clientContext.load(oListItem);
       
    clientContext.executeQueryAsync(Function.createDelegate(this, onQuerySucceeded(args)), Function.createDelegate(this, onQueryFailed));
}

JavaScript: function onQuerySucceeded(args) {

    //alert('Item created: ' + oListItem.get_id());
    setTimeout(function(){
    window.open('[[=Context.Site.Url]]/crm/contacts/MailMerge/' + args[0] +' - [[=UPGREAT.SPExtensions.ItemHandling.Folders.FolderHandler.MakeValidFolderName([[=Context.User.Name]])]].docx');
    }, 7000);
}

JavaScript: function onQueryFailed(sender, args) {

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2016 10:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was soll das denn jetzt? Wir sind doch keine Code Reviewer. Aber weil Du's bist...

[quote user="Andman"]$listItems = $spSourceList.getItems($spQuery)
foreach($item in $listItems)
{
   $latestItem = $item
}[/quote]

Du holst Dir alle Elemente, brauchst aber nur eines? Dann gib der Query noch ein RowLimit=1 und Du bekommst auch nur ein Element.

[quote user="Andman"]$latestItem | ForEach-Object {[/quote]

Wozu das foreach, es ist doch nur ein Element? Kannst Du einfach weglassen.

 (Irgendwie funktioniert die Zitieren-Funktion nicht mehr, deshalb weiter ohne)

Das Feld Author liefert Dir ein SPFieldUserValue, das wiederum ein Property User hat. Das liefert Dir alles zum User, also den Login, die ID, die Mailadresse usw. und Du mußt nicht mit komplizierten Stringoperationen herumbasteln.

Dann holst Du Dir alle Elemente aus der Kontaktliste, obwohl Du nur eines mit einer bestimmten ID brauchst. Das bekommst Du viel einfacher mit der GetItemById() Methode der Liste.

Im JavaSCript finde ich nur ein unnützes "new" bei SP.ClientContext.get_current(). Warum new, wenn Du Dir doch das fertige Objekt Current holst?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
142 Beiträge
Andman Als Antwort am 25 Apr. 2016 10:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja sorry. :( Hatte hier schon den ein oder anderen Codeschnipsel gesehen, deshalb dachte ich, ich frag mal.

Danke dir aber für deine Anmerkungen. Werde ich gleich ausbessern!

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2016 10:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

War auch gar nicht böse gemeint. Und ich hab's mir ja sogar angeschaut. Immerhin können andere aus den Anmerkungen ja auch lernen.

Viele Grüße
Andi
af @ evocom de
Blog