Het gebruik van groups binnen Google is niet enkel voor het versturen van mails (group mails) maar wordt overal gebruikt waar rechten worden toegekend aan drives, calendar's etc en vormen daardoor een essentieel onderdeel van de admin aanpak.
Het toevoegen van de AdminDirectory API in GAS is noodzakelijk alsook het bekomen van voldoende toegangsrechten(admin) om deze functies te kunnen gebuiken
Met deze helper functie kan je alle groups binnen een domain bekomen. Een groep wordt gekenmerkt door zijn email adres, waardoor je een object bekomt met twee properties:
Group_name
Group_email
/**
* Lists all the groups in the domain.
* @param {string} domainname
* @retun {object} groups as object of 2 arrays, name and email
*/
function ListAllGroups_(domainname) {
var pageToken;
var page;
var groupslist = {}
if (!groupslist.Group_name) { groupslist.Group_name = [] }
if (!groupslist.Group_email) { groupslist.Group_email = [] }
let idx = 0
do {
page = AdminDirectory.Groups.list({
domain: domainname,
maxResults: 100,
pageToken: pageToken
});
var groups = page.groups;
if (groups) {
for (var i = 0; i < groups.length; i++) {
var group = groups[i];
//Logger.log('%s (%s)', group.name, group.email);
groupslist.Group_name[idx] = group.name
groupslist.Group_email[idx] = group.email
idx = idx + 1;
}
} else {
Logger.log('No groups found.');
}
pageToken = page.nextPageToken;
} while (pageToken);
return groupslist
}
Deze functie geeft je een lijst van de groepen waartoe een specifieke gebruiker behoort.
/**
* List membership groups for specific user
* @param {string} useradx email
* @param {string} domainname
* @return {array} groups array of arrays(GroupID & GroupName)
*/
function ListGroupsMembership_(useradx, domainname) {
let list = []
let groupslist = ListAllGroups_(domainname);
for (i = 0; i < groupslist.Group_email.length; i++) {
let result = AdminDirectory.Members.hasMember(groupslist.Group_email[i], useradx)
if (!result.isMember) {
//Logger.log(`No member`);
} else {
list.push([groupslist.Group_email[i], groupslist.Group_name[i]])
}
}
return list
}
Deze functie geeft je een lijst van gebruikers binnen een groep met hun rol.
Iedere gebruiker heeft een ID
/**
* List all members and role of a group
* @param {string} groupadx
* @return {object} object of arrays(groupid, memberid,role)
*/
function ListMembersOfGroup_(groupid) {
let members = {}
if (!members.email) { members.email = [] }
if (!members.role) { members.role = [] }
let obj = AdminDirectory.Members.list(groupid)
for (i = 0; i < obj.members.length; i++) {
members.email[i] = obj.members[i].email
members.role[i] = obj.members[i].role
} return members
}
Omdat het manueel updaten van groups kan door de manager van iedere groep en we daardoor snel het overzicht verliezen, kan er een map gemaakt worden van users en groups waartoe je behoren.
De volgende helper applicatie maakt deze map, zodat een admin een overzicht bewaart en kan controleren.
/**
* Groups/user map with role as matrix value
* @param{string} domain
* @return {object} object of arrays (one per group)
*/
function MapGroupsUsersrole_(domainname) {
let obj = {}
if (!obj.user) { obj.user = [] }
if (!obj.useradx) { obj.useradx = [] }
let Groupslist = ListAllGroups_(domainname)
let Users = GetAllUsersInOrg()
// create properties in object
for (let i = 0; i < Groupslist.Group_email.length; i++) {
if (!obj[Groupslist.Group_name[i]]) { obj[Groupslist.Group_name[i]] = [] }
}
// Create users per row"(first column and second column)
for (let i = 0; i < Users.length; i++) {
obj.user[i] = Users[i]["Employee ID"]
obj.useradx[i] = Users[i]["Email Address [Required]"]
}
for (let i = 0; i < Groupslist.Group_email.length; i++) {
let members_g = ListMembersOfGroup_(Groupslist.Group_email[i])
let groupID = Groupslist.Group_name[i]
let t = 0
let UIDX = obj.useradx.indexOf(members_g.email[t])
for (let r = 0; r < Users.length; r++) {
if (r == UIDX) {
obj[groupID][r] = members_g.role[t]
t++
if (t < members_g.email.length) {
UIDX = obj.useradx.indexOf(members_g.email[t])
} else {
UIDX = -1
}
} else {
obj[groupID][r] = ""
}
//Logger.log(`Group=${obj[groupID][r]} r=${r} i=${i}`)
}
}
return obj
}
Met deze helperfunctie kan je een gebruiker toevoegen aan een bepaalde groep en/of zijn rol aanpassen.
Het aanpassen gebeurt door eerst de user te verwijderen en hem nadien met de nieuwe rol terug toe te voegen.
/**
* Add member to group, if exist replace with new settings
* @param {string} groupadx email
* @param {string} useradx email
* @param {string} roleuser MEMBER|MANAGER
* @return {object} member
*
*/
function AddGroupMember_(groupadx, useradx, roleuser) {
var userEmail = useradx;
var groupEmail = groupadx;
var member = {
email: userEmail,
role: roleuser
};
//result is object with property isMember: bool
let result = AdminDirectory.Members.hasMember(groupEmail, userEmail)
if (!result.isMember) {
AdminDirectory.Members.insert(member, groupEmail);
} else {
AdminDirectory.Members.remove(groupEmail, userEmail);
AdminDirectory.Members.insert(member, groupEmail);
}
//Logger.log('User %s added as a member of group %s.', userEmail, groupEmail);
return member
}