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.




Standardspaltenwerte mit JSOM oder REST setzen

Dieser Beitrag hat 34 Antworten

Ohne Rang
116 Beiträge
Dennis94 erstellt 15 Mai 2017 12:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Zusammen,

Ich versuche momenten die Standardspaltenwerte von Ordnern zu setzen. Mit CSOM war das mittels der MetaDataDefaults Klasse relativ einfach möglich. Jetzt muss ich das jedoch mit JSOM oder eben der REST API machen und da habe ich noch keine Lösung. Gibt es die MetaDataDefaults in JSOM? Und falls nicht weiß jemand wie man sons die Standartspaltenwerte setzen kann?

Vielen Dank schonmal für eure Hilfe!

Gruß Dennis

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Mai 2017 14:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ein fertiges Objekt gibt es dafür nicht, aber die Werte werden im PropertyBag des RootFolders gespeichert und es ist gar nicht so schwierig. Speichere einfach mal ein paar Werte manuell über den Browser und schaue es Dir an.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 16 Mai 2017 08:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

ich verstehe noch nicht genau, wie mir das beim automatischen Anlegen helfen kann. Vielleicht habe ich mein Problem auch schlecht beschrieben. Also ich möchte quasi direkt, wenn ich einen Ordner per JSOM anlege, diesem direkt Standardwerte mitgeben.

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 16 Mai 2017 09:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann musst du quasi direkt, nachdem du den Ordner via JSOM angelegt hast, via JSOM die Eigenschaft im Property Bag vom Root Folder der Liste schreiben. So, wie Andi es schon angedeutet hat.

Grüße

Olaf

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 16 Mai 2017 09:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Achso, ok. Dann lege ich ja auf der "obersten" Ebene (also der Bibliothek) die Standardwerte ab. Ich würde das gleiche aber gerne eine Ebene darunter direkt auf dem Ordner machen, weil wenn ich die Standardwerte auf der obersten Ebene ändere, werden nach unten auch verändert.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Mai 2017 09:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich kann nur wiederholen: lege einige Standardwerte manuell im Browser fest und schaue Dir an, wie das abgelegt wird. Egal in welcher Ebene man das macht, es wird immer im Property Bag des Root-Folders gespeichert.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 16 Mai 2017 10:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ah, ich glaube ich weiß jetzt was du meinst :)

Wenn ich also von z.B. "Ordner1" die Standardwerte ändere, wird das in Root-Folder/Ordner1 (Quelle des Standardwerts) hinterlegt? Wie ich im Code darauf zugreife ist mir aber schleierhaft. In den Root-Folder komme ich ja problemlos mit  list.get_fields().getByInternalNameOrTitle(name) und dort dann mit .set_defaultValue(wert). Aber wie weise ich das dem Unterordner zu? SP-Folder hat keine get_fields() - Methode.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Mai 2017 10:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie oben schon geschrieben, gibt es kein Objekt dafür, d.h. Du mußt direkt über die REST-API gehen. Den genauen Weg kann ich Dir aber nicht auswendig sagen. Sinngemäß web/lists/getbytitle('Name der Liste')/rootfolder/properties

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 16 Mai 2017 11:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, dann gucke ich mal in dieser Richtung.

Schonmal Vielen Dank für eure Hilfe und Geduld :)

Ich hätte noch eine Frage in einem anderen Zusammenhang. Und zwar versuche ich beim Dateiupload die Metadaten für das Dokument mitzugeben. Das funktioniert auch soweit eigentlich ganz gut. Ich habe nur an einer Stelle ein Problem:

Eines der Felder ist ein Vwewaltetes Metadara-Feld. Ich finde die GUID usw. also auch da alles top, aber wenn ich termMatches einlade (dort ist der entsprechende Term gespeichert, termMatches ist also eine TermCollection), dann bekomme beim nächsten Zugriff auf termMatches die Fehlermeldung, dass termMatches nicht initialisiert ist. Setze ich jedoch ein alert() zwischen Einladen und nächstem Zugriff, funktioniert es einwandfrei.

An sich ist das nicht soo schlimm, aber es ist leicht nervig, dass jedesmal ein zusätzliches Popupfenster aufploppt.

Gibt es da eine elegantere Lösung? Ich habe schonmal nach setTimeout geguckt, um die Funktion "schlafen" zu lassen, aber egal wie ich das benutze, es kommen immer Fehlermeldungen.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Mai 2017 11:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie alles werden auch die Terms asynchron geladen. Durch den alert bekommst Du einfach nur genug Zeit, damit dieser asynchrone Vorgang abgeschlossen werden kann. Mit setTimeout würdest Du dasselbe erreichen. Viel besser ist aber, einfach die zugehörende success-Methode zu verwenden.

ClientContext.executeQueryAsync nimmt zwei Parameter entgegen: der erste ist der success-Callback und der zweite für den Fehlerfall.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 16 Mai 2017 11:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe das mal so probiert. termMatches wird zugewießen und für die success-Callback Funktion habe ich dann entsprechend die Funktion für den nächsten Zugriff angegeben (dort hole ich mir die termId des Terms). Ich bekomme die Fehlermeldung termMatches is not defined :(

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 17 Mai 2017 11:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich konnte das Problem jetzt lösen. Ich hatte die Funktionen zu sehr ineinander geschachtelt, darum bekam ich den Fehler. Nachdem ich das geändert hatte, hat Andis Lösung funktioniert, nochmal Danke :)

Da ich diesesScript aus anderen Anwendungen heraus nutzen möchte (also außerhalb von SharePoint online) würde ich dies gerne Testweise in einer einfachen Html-Seite versuchen. Ich habe dabei das Problem, dass ich die sp.js Datei nicht richtig referenziere ( ich bekomme den Fehler SP is not defined beim ersten Code mit SharePoint Funktionalität). Wo genau ist diese Javascript Datei abgelegt bzw. wie referenziere ich richtig auf sie?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 17 Mai 2017 12:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da werden Dir noch mehr SharePoint-eigene Dateien wie die sp.runtime.js fehlen. Wenn Du das außerhalb von SharePoint benutzen möchtest, solltest Du das JavaScript Object Model vergessen und direkt auf die REST-API losgehen. Und Du hast natürlich das Authentifizierungsproblem...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 17 Mai 2017 12:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, dann probiere ich das mal so. Danke :)

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 17 Mai 2017 12:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie kann ich das Authentifizierungsproblem denn lösen? Ich habe schon einige Artikel gelesen die in Richtung Authorization: "Bearer" + accessToken gehen, aber ich weiß nicht wo ich den accessToken herbekomme. Tritt das Problem denn auch auf, wenn ich das Script aus Office 365 heraus ausführe?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 17 Mai 2017 13:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe ganz übersehen, daß wir hier von O365 reden. Da ist es etwas einfacher, aber immer noch weite entfernt von wirklich einfach: http://stackoverflow.com/questions/15850037/remotely-accessing-sharepoint-2013-using-rest-on-office-365-from-javascript

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 18 Mai 2017 11:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe noch eine Frage zur REST API: Ich versuche einen Ordner anzulegen. Bei folgendem Code bekomme ich aber die Fehlermeldung "Bad Request"

$.ajax({
        url : _spPageContextInfo.webAbsoluteUrl + "/_api/web/folders",
        type: "POST",
        data: JSON.stringify({ "_metadata" : { "type" : "SP.Folder" }, "ServerRelativeUrl" : "Firmen/FirmaNeu"}),
        headers: {
            "accept": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val(),
            "content-type": "application/json;odata=verbose"
        },
        success: function () {
            alert("Erfolgreich");
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert(errorThrown);
        }
    });

Hat jemand eine Idee, was ich falsch mache?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Mai 2017 12:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich nehme an, daß "Firmen/FirmaNeu" nicht serverrelativ ist.

Übrigens kannst Du Dir das sparen und sogar auf data komplett verzichten, wenn Du als URL sowas verwendest:
_api/web/Folders/Add('Firmen/FirmaNeu')

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 18 Mai 2017 12:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank für deine Hilfe! :) Mit  _api/web/Folders/Add('Firmen/FirmaNeu') hat es jetzt geklappt

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 18 Mai 2017 13:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Weißt du vielleicht auch, ob man mit der REST api Verwaltete Metadaten Felder mit Werten belegen kann? Ich habe es so probiert:

var call = jQuery.ajax({
            url: _spPageContextInfo.webAbsoluteUrl +
                "/_api/Web/Lists/getByTitle('Firmen')/Items(" +
                item.Id + ")",
            type: "POST",
            data: JSON.stringify({
                { "Firma" : { "__metadata" : { "type" : "SP.Taxonomy.TaxonomyFieldValue"}, "Label" : "Afotek", "TermGuid" : "2c84e29e-0f6a-4ab0-956b-42f740706d30", "WssId" : -1 } }
                }),
          
            headers: {
                Accept: "application/json;odata=verbose",
                "Content-Type": "application/json;odata=verbose",
                "X-RequestDigest": jQuery("#__REQUESTDIGEST").val(),
                "IF-MATCH": item.__metadata.etag,
                "X-Http-Method": "MERGE"
            }
        });

Das funktioniert jedoch nicht ( item wird beim Funktionsaufruf mitgegeben).

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Mai 2017 13:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das kann ich Dir leider nicht sagen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 18 Mai 2017 14:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Schade, aber trotzdem Vielen Dank für die vielen hilfreichen Tipps :)

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 18 Mai 2017 15:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ein Problem hätte ich dann noch :D

Folgenden Code habe ich aus einem MSDN Beispiel um einen Ordnernamen zu ändern:

function rename()
{
    var call = jQuery.ajax({
        url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/GetFolderByServerRelativeUrl('/sites/Testumgebung/doc/Firmen/Firma1')",
        type: "POST",
        data: JSON.stringify({
            "__metadata": { "type": "SP.Folder" }, "Firmenname": "CHANGED_VIA_REST"
            }),
        headers: {
            Accept: "application/json; odata=verbose",
            "X-RequestDigest": $("#_REQUESTDIGEST").val(),
            "If-Match": "*",
            "X-HTTP-Method": "MERGE",
            "Content-Type": "application/json; odata=verbose"
            },
        success: function(){
            alert("Erfolgreich");
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert(errorThrown);
        }
    });
}

Ich erhalte die Fehlermeldung forbidden, verstehe aber nicht warum es verboten ist, da ja wie gesagt Microsoft es selbst so als Standard vorgibt.

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 24 Mai 2017 11:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Ich habe ganz übersehen, daß wir hier von O365 reden. Da ist es etwas einfacher, aber immer noch weite entfernt von wirklich einfach: http://stackoverflow.com/questions/15850037/remotely-accessing-sharepoint-2013-using-rest-on-office-365-from-javascript

[/quote]

Nach einigen Tagen recherche, bekomme ich nun die entsprechenden Tokens, um meine REST Anfragen zu authorisieren. Die REST Anfragen klappen auch soweit (innerhalb von SharePoint). Jetzt habe ich versucht das gleiche Szenario von CRM aus durchzuführen. Auch hier bekomme ich die Tokens zur Authentifizierung, aber beim Ausführen der Querys bekomme ich die Fehlermeldung "Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://drimalski.sharepoint.com/sites/Testungebung/doc/_api/web. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)"

Weiß hierfür jemand Rat?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Mai 2017 12:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Oh Mist, das CORS-Problem hatte ich ganz vergessen. Stichworte dafür sind SharePoint Cross Domain Library und SP.RequestExecutor.js

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 24 Mai 2017 15:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe mir das mal angeguckt. Scheint an sich die Lösung zu sein. Das Problem ist, dass ich ja aus CRM heraus agiere und dort die SharePoint-Bibliotheken nicht habe. Wenn ich also SP.RequestExecutor.js einbinde, bekomme ich die Fehlermeldung SP not defined. Binde ich dafür SP.Runtime.js ein, bekomme ich den Fehler Type not defined :/ gibt es nur diese Lösung für Cross Domain Zugriffe?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Mai 2017 16:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du müßtest da tatsächlich noch einige js-Dateien mehr einbinden (am besten direkt aus SharePoint).

Ich bin nicht ganz auf dem Laufenden, glaube aber daß man die Authentifizierung auch selbst lösen kann (in O365). Google doch mal nach ADAL.js

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 24 Mai 2017 16:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ADAL.js benutze ich ja ;) ich hole mir damit ein token ( über Azure AD usw.) ,das klappt. Wenn ich dann versuche in CRM das Script auszuführen um (erstmal testweise) ein paar Informationen über die SharePoint Sammlung auszulesen, erhalte ich die Cross Domain Fehlermeldung. Habe da auch in den letzten Stunden in Richtung JSONP und $.support.cors = true gegoogelt, noch aber keine Lösung dafür gefunden

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Mai 2017 17:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, bin wohl etwas verwirrt. Eine Lösung habe ich Dir aber leider nicht :-(

Ich baue sowas i.d.R. ein bißchen komplizierter mit einer eigenen Web-API dazwischen. Die greift auf die Systeme zu und kann von außen per JS, aber auch von allen möglichen (Mobile-)Apps angesprochen werden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 29 Mai 2017 16:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da das alles nicht so wirklich hinhaut wegen dem Cross Domain Problem:

Wäre es denn möglich Dokumente lokal per Javascript zu SharePoint hochzuladen? Da kommt es zu den gleichen Authentifizierungsproblemen etc. oder? :/

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Mai 2017 16:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da hast Du dasselbe Problem mit cross-site scripting

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 31 Mai 2017 08:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich versuche jetzt nochmal den Dateiupload mit der HttpWebRequest Klasse zu lösen. Ich denke die Authentifizierung klappt, aber ich bekomme bei der Anfrage die Fehlermeldung (400) Bad Request. Die Anfrage sieht so aus:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.Accept = "application/json; odata=verbose; charset=utf-8";
request.ContentType = "application/json; odata=verbose; charset=utf-8";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
request.AllowAutoRedirect = false;
request.Headers.Add("X-RequestDigest", digest);
request.ContentLength = requestContent.Length;

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); --> Hier kommt die Fehlermeldung
Die uri ist https://mysharepoint.sharepoint.com/sites/MySite_api/web/folders/add('Ordner/Unterordner') (nicht wundern, testweise probiere ich erstmal einen Ordner zu erzeugen)

Mit ziemlich den gleichen Werten konnte ich eine GET Anfrage erfolgreich absenden und habe die Inhalte einer Liste ausgelesen.
Der POST funktioniert jedoch nicht. Ich vermute, das es an den Headern liegt, aber ich weiß nicht genau woran (die URL müsste passen, da sie an
anderer Stelle auch so funktioniert hat).
Falls jemandem etwas auffällt, wäre ich sehr dankbar
Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Mai 2017 08:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn die URI wirklich stimmt, fehlt ein Schrägstrich zwischen MySite und _api

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 31 Mai 2017 08:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Oh, ja natürlich, der ist auch da ;)

Ja, die uri müsste eigentlich stimmen. Innerhalb von SharePoint kann ich mit dieser uri Ordner erzeugen. Ich brauche es halt in CRM, um das von dort aus zu machen :/

Ohne Rang
116 Beiträge
Dennis94 Als Antwort am 31 Mai 2017 09:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Habe das Problem grade lösen können. Ich weiß zwar nicht ganz genau, warum es jetzt geht, aber naja :D

Trotzdem nochmal danke Andi für deine Unterstützung bei all meinen Fragen :)