Einer unserer Kunden hatte die Anforderung an uns gestellt, dass User abhängig von der SharePoint Gruppe in der sie sich befinden, auf unterschiedliche Startseiten gelangen sollen. Nach kurzer Überlegung wie dies umgesetzt werden kann, kam ich zu folgender Lösung. Mittels JavaScript lese ich die Gruppen des aktuellen Users aus und wenn er in der erforderlichen Gruppe ist, wird er automatisch auf die entsprechende Startseite weitergeleitet. Dazu habe ich der Startseite einen Content-Editor Webpart mit folgendem Inhalt hinzugefügt:
[code lang=“js“]
function CheckIfCurrentUserMemberOfGroup(groupName, OnComplete) {
// ClientContext auslesen.
var currentContext = new SP.ClientContext.get_current();
var currentWeb = currentContext.get_web();
// Aktuellen User laden.
var currentUser = currentContext.get_web().get_currentUser();
currentContext.load(currentUser);
// Alle Gruppen laden.
var allGroups = currentWeb.get_siteGroups();
currentContext.load(allGroups);
// Benötigte Gruppe laden.
var group = allGroups.getByName(groupName);
currentContext.load(group);
// Alle User in dieser Gruppe laden.
var groupUsers = group.get_users();
currentContext.load(groupUsers);
currentContext.executeQueryAsync(OnSuccess,OnFailure);
function OnSuccess(sender, args) {
var userInGroup = false;
var groupUserEnumerator = groupUsers.getEnumerator();
while (groupUserEnumerator.moveNext()) {
var groupUser = groupUserEnumerator.get_current();
// Wenn die ID des aktuellen Users mit der ID des Users
// aus der Gruppe übereinstimmt
if (groupUser.get_id() == currentUser.get_id()) {
userInGroup = true;
break;
}
}
OnComplete(userInGroup);
}
function OnFailure(sender, args) {
OnComplete(false);
}
}
[/code]
Verwendung:
[code lang=“js“]
function CheckIfCurrentUserHasContribPerms()
{
CheckIfCurrentUserMemberOfGroup("Smarter", function (isCurrentUserInGroup) {
if(isCurrentUserInGroup)
{
// Der aktuelle User ist in der Gruppe [Smarter]!
window.location.replace("https://smartersolutions.at")
}
});
}
ExecuteOrDelayUntilScriptLoaded(CheckIfCurrentUserHasContribPerms, ‚SP.js‘);
[/code]
Mittels diesem Webpart wird überprüft, ob der aktuell angemeldete User Mitglied der Gruppe „Smarter“ ist. Sofern dies der Fall ist, wird er automatisch zu „https://www.smarterbusiness.at“ weitergeleitet. Wenn der aktuelle User kein Mitglied dieser Gruppe ist, passiert nichts. Folglich bleibt er auf der aktuellen Seite.
Durch diesen smarten JavaScript-Code kann der User nicht nur weitergeleitet werden, sondern je nach Gruppe in der sich der User befindet, auch beliebige Aktionen durchführen. Dies funktioniert jedoch nur in SharePoint 2013 oder höher, da es die Funktion SP.GroupCollection.getByName in SharePoint 2010 noch nicht gibt.
Bei Fragen oder Anregungen verfasst einen Kommentar zu diesem Blog oder schreibt mir eine E-Mail.
Happy Coding!
Liebe Grüße, Stefan
Hallo Stefan,
ich habe in einer Sharepoint Liste die Spalte Antragsteller als Person/Gruppe definiert.
Nun will ich erreichen, das der aktuell angemeldete Benutzer automatisch in diesem Feld steht. Weil es gibt ca. 50 User. Und es soll ein Urlaubsantrag werden bzw, ist es schon. Jedoch muss der Antragsteller immer umständlich seinen Namen nachschlagen.
Funktioniert das mit JSON Spaltenformatierung??
Funktioniert das?
Hallo Swen!
Wenn die Personen den Antrag (sprich das Listenelement) erstellen, könnt ihr doch einfach die Spalte „Erstellt von“ („Author“) verwenden!
Bezüglich der JSON Spaltenformatierung, diese ist nur dazu gedacht, in der Spalte vorhandene Daten zu formatieren, sprich anders darzustellen als SharePoint das im Standard machen würde!
Falls ihr die Userdaten unbedingt in der Spalte „Antragssteller“ haben wollt, da vielleicht in Sonderfällen einmal die Sekretärin einen Urlaubsantrag für ihren Chef stellt, dann wäre je nach SharePoint Technologie die ihr verwendet die Möglichkeit über:
Ich hoffe ich konnte dir weiterhelfen, wenn du noch Infos brauchst einfach schreiben!
LG Josef
Hallo Josef,
danke für Deine Antwort.
Das funktioniert leider nicht. Die Spalte „erstellt von“ ist ja bei Erstellung noch nicht gefüllt.
Deshalb wird auch nicht der gewünschte Benutzer eingeblendet.
Ich denke das funktioniert nur, wenn man den aktuellen angemeldeten Benutzer abfragt. Aber wie das geht weiß ich nicht. Muss man das in Java programieren? Und wie fügt man das Java Script dann ein (Sharepoint Designer…????)
Grüße
Hallo Swen,
nachstehender JS-Code sollte dir weiterhelfen! Diesen am besten einfach in einen Skript-Editor WebPart kopieren und fertig!
[code language=“js“ htmlscript=“true“]
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function () {
// Warten bis SP.JS geladen ist
ExecuteOrDelayUntilScriptLoaded(SetCurrentUsernameToPeoplePicker, "sp.js");
});
function SetCurrentUsernameToPeoplePicker() {
// ClientContext und Web holen
var ctx = new SP.ClientContext.get_current();
this.website = ctx.get_web();
// Aktuellen User auslesen und laden
this.currentUser = website.get_currentUser();
ctx.load(currentUser);
ctx.executeQueryAsync(Function.createDelegate(this, this.onSucceess),
Function.createDelegate(this, this.onFail));
}
function onSucceess(sender, args) {
var loginName = currentUser.get_loginName();
var form = $("table[class=’ms-formtable‘]");
// get(0) um den User in das erste PeoplePicker-Feld einzutragen
// get(1) um den User in das zweite PeoplePicker-Feld einzutragen
// …
var userField = form.find("input[id$=’ClientPeoplePicker_EditorInput‘]").get(0);
var peoplepicker = SPClientPeoplePicker.PickerObjectFromSubElement(userField);
peoplepicker.AddUserKeys(loginName);
}
function onFail(sender, args) {
// Fehler beim Auslesen des aktuellen Users
alert(‚request failed ‚ + args.get_message() + ‚\n‘ + args.get_stackTrace());
}
</script>
[/code]
Hallo Josef,
vielen Dank.
Das Problem ist nur, wenn eine Person das Listenelement erstellt, dann funktioniert das mit „erstellt von“ nicht.
Es ist doch auch nur ein Nachschlagefeld für „Person/Gruppe“
Wenn eine Person ein neues Element erstellt, dann müßte doch abgefragt werden, wer gerade angemeldet ist.
Dieser angemeldete Nutzer soll dann automatisch vorgeblendet werden im Feld „Antragsteller“
Danke Stefan, für Deine Hilfe !!!
Guten Tag
Ich bin sehr neu in Sharepoint und noch etwas ungeübt.
Ich bräuchte allerdings die oben beschriebene Möglichkeit, da unsere Firma drei unterschiedliche Standorte hat und jeder einer anderen Gruppe zugewiesen ist. Sie sollten alle auf eine unterschiedliche Seite verwiesen werden.
Bei mir schlägt der oben aufgeführte Code immer an. Gibt es da etwas einfacheres oder ein Code der ohne vorarbeit einfach eingebettet werden kann?
Danke bereits im Voraus!
Hallo Lukas,
nachstehender JS-Code sollte dir weiterhelfen!
[code language=“js“]
CheckIfCurrentUserMemberOfGroup("Gruppe1", function (isCurrentUserInGroup) {
if(isCurrentUserInGroup)
{
// Der aktuelle User ist in der Gruppe [Gruppe1]!
window.location.replace("https://smartersolutions.at"😉
}
else
{
CheckIfCurrentUserMemberOfGroup("Gruppe2", function (isCurrentUserInGroup) {
if(isCurrentUserInGroup)
{
// Der aktuelle User ist in der Gruppe [Gruppe2]!
window.location.replace("https://smartersolutions.at"😉
}
});
}
});
[/code]
Super danke für die Antwort Stefan.
Ich habe jetzt das Problem das CheckIfCurrentUserMemberOfGroup nicht akzepriert wird.
Ich arbeite mit SharePoint2016 und habe das JQery 4.3.1.min
Was hat das zur Folge?
Hallo Lukas,
Du musst natürlich auch die Zeilen von oben in denen die Funktion definiert wird auf deiner Seite einbinden!
Und bei CheckIfCurrentUserHasContribPerms musst du die Zeilen 3-9 mit denen von mir austauschen!
Lg
Hallo Stefan
Dann hätte ich folgenden Code stimmt das oder muss ich noch was ersetzten?
(außer „meineGruppeEins“,“meine GruppeZwei“,“seite_1″,“seite_2″)
LG
function CheckIfCurrentUserMemberOfGroup(groupName, OnComplete) {
// ClientContext auslesen.
var currentContext = new SP.ClientContext.get_current();
var currentWeb = currentContext.get_web();
// Aktuellen User laden.
var currentUser = currentContext.get_web().get_currentUser();
currentContext.load(currentUser);
// Alle Gruppen laden.
var allGroups = currentWeb.get_siteGroups();
currentContext.load(allGroups);
// Benötigte Gruppe laden.
var group = allGroups.getByName(groupName);
currentContext.load(group);
// Alle User in dieser Gruppe laden.
var groupUsers = group.get_users();
currentContext.load(groupUsers);
currentContext.executeQueryAsync(OnSuccess,OnFailure);
function OnSuccess(sender, args) {
var userInGroup = false;
var groupUserEnumerator = groupUsers.getEnumerator();
while (groupUserEnumerator.moveNext()) {
var groupUser = groupUserEnumerator.get_current();
// Wenn die ID des aktuellen Users mit der ID des Users
// aus der Gruppe übereinstimmt
if (groupUser.get_id() == currentUser.get_id()) {
userInGroup = true;
break;
}
}
OnComplete(userInGroup);
}
function OnFailure(sender, args) {
OnComplete(false);
}
}
function CheckIfCurrentUserHasContribPerms()
{
CheckIfCurrentUserMemberOfGroup(„meineGruppeEins“, function (isCurrentUserInGroup) {
if(isCurrentUserInGroup)
{
// Der aktuelle User ist in der Gruppe [Gruppe1]!
window.location.replace(„seite_1“)
}
else
{
CheckIfCurrentUserMemberOfGroup(„meineGruppeZwei“, function (isCurrentUserInGroup) {
if(isCurrentUserInGroup)
{
// Der aktuelle User ist in der Gruppe [Gruppe2]!
window.location.replace(„seite_2“)
}
});
}
});
}
ExecuteOrDelayUntilScriptLoaded(CheckIfCurrentUserHasContribPerms, ‚SP.js‘);
Schaut gut aus! Sollte so passen!