在Google-Apps-Script中使用Directory API,如何获取组内的组 [英] Using Directory API in Google-Apps-Script, how to get groups inside a group

查看:177
本文介绍了在Google-Apps-Script中使用Directory API,如何获取组内的组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我重写了这个脚本,因为 GroupsManager 已弃用,所以我的旧脚本将很快停止工作。



一切正常(尽管这个API很慢......)但我遇到的问题是一些团体不仅有用户,还包括其他团体......其中一些团体只有子团体(并且没有用户(说话的方式!)



我无法找到任何方法来解决这种情况,列表方法返回用户,它会忽略完全组内。



所以我的问题是:



有没有办法让群组在群组内?我是否缺少明显的东西?

是我用来在电子表格中列出所有成员的代码,1张/组,以便我可以人稍后更快更容易地使用这些数据。我使用背景颜色标记作为跟踪管理器来处理(相对)小批量操作和定时器触发器,使其工作直到完成。 (是的,我们的域中有很多组; - )

 函数listGroupMembers(){
var start = new Date()。getTime();
var ss = SpreadsheetApp.openById('1k-o4IVKEhW2zkk _________ f2rH4UUt3OAC8I0ZoM'); //设置你的SS ID(用定时器触发运行>需要用ID
打开var pageToken,page;
var count = 0;
var groupList = [];
do {
page = AdminDirectory.Groups.list({
domain:'xxxxx.be',
maxResults :100,
pageToken:pageToken
});
var gr = page.groups;
if(gr){
for(var i = 0; i< ; gr.length; i ++){
var group = gr [i];
count ++;
//Logger.log(group);
groupList.push([group。 ('没有找到组');
}
pageToken = page.nextPageToken;

while(pageToken);
try {
var GroupAddress = ss.getSheetByName('GroupAddress'); //如果GroupAddress表已经存在,打开
Logger。日志('使用现有工作表''+ GroupAddress.getName()+ );
}赶上(ERR){
Logger.log(创建片材 GroupAddress);
ss.deleteSheet(ss.getSheets()[0]);
var GroupAddress = ss.insertSheet('GroupAddress',0); //否则将它创建为第一张工作表
}
GroupAddress.getDataRange()。clearContent();
ss.getSheetByName('GroupAddress')。getRange(1,1,groupList.length,groupList [0] .length).setValues(groupList);

var groupNames = ss.getSheetByName(GroupAddress)。getDataRange()。getValues();
var groupDone = ss.getSheetByName(GroupAddress)。getDataRange()。getBackgrounds();
var progress; (b)如果(groupDone [n] [0]!='white'||(new Date().getTime()-start)/ 60> 5000) {//限制为5秒+ 1组
继续;
}
try {
var outputSheet = ss.insertSheet(groupNames [n] [0],Number(n)+1)
} catch(err){
var outputSheet = ss.getSheetByName(groupNames [n] [0]);
}
var group = GroupsApp.getGroupByEmail(groupNames [n] [0]);
//Logger.log('groupNames[n][0] ='+ groupNames [n] [0]);
尝试{
var users = group.getUsers();
var output = [];
for(var i in users){
var user = AdminDirectory.Users.get(users [i] .getEmail());
output.push([Number(i)+ 1,user.name.fullName,user.primaryEmail,user.aliases!= null?user.aliases:'',new Date(user.creationTime),user。 isAdmin,new Date(user.lastLoginTime)]);
}
ss.getSheetByName(GroupAddress)。getRange(Number(n)+1,1).setBackground('#fff2cc');
SpreadsheetApp.flush();如果(output.length> 0){
output.push(['durée:',parseInt((new Date()。getTime() - start)/ 60),'millisecondes',' , '', '', '']);
outputSheet.getRange(1,1,output.length,output [0] .length).setValues(output);
}
} catch(err){
continue}
}
groupDone = ss.getSheetByName(GroupAddress)。getDataRange()。getBackgrounds();
for(progress = groupDone.length-1; progress> = 0; progress - ){
if(groupDone [progress] [0]!='white'){break};
}
Logger.log(n +'='+ progress +'?');
if(n == progress){
MailApp.sendEmail(Session.getEffectiveUser()。getEmail(),'在GroupList中完成的所有工作','所有任务完成'+ new Date()。的toLocaleString());
var trig = ScriptApp.getProjectTriggers();
for(var t in trig){
try {
ScriptApp.deleteTrigger(trig [t]); (3000).create(); /(
} catch(e){}
}
} else {
ScriptApp.newTrigger('listGroupMembers')。 /等待3秒并继续
}
}






编辑



感谢Göran的回答,我有一个版本可以获得包括子组在内的所有组的所有成员。



为了符合我的要求,我改变了(非常)轻微的代码,并且还需要将每张表格中的单元格数量限制为我需要的数量,因为总数(1000 * 26个细胞/片)超过了200000个细胞的限制(我有超过100张)。

下面的完整代码适用于任何有兴趣的人(包括菜单和一些()Utils):

pre $ function onOpen(){
var menu = SpreadsheetApp.getUi()。createMenu(Utilitaires INSAS )
.addItem(reset colours,resetColors)
.addItem(create groupUser lists,listGroupMembers)
.addItem(delete all sheets,delsheets );
menu.addToUi();


函数listGroupMembers(){
var start = new Date()。getTime();
var ss = SpreadsheetApp.openById('1k-o4IVKEhW2zkkEu0gAvb92rQf2rH4UUt3OAC8I0ZoM'); //设置你的SS ID(用定时器触发器运行>需要用ID
打开var pageToken,page;
var count = 0;
var groupList = [];
do {
page = AdminDirectory.Groups.list({
domain:'insas.be',
maxResults :100,
pageToken:pageToken
});
var gr = page.groups;
if(gr){
for(var i = 0; i< ; gr.length; i ++){
var group = gr [i];
count ++;
//Logger.log(group);
groupList.push([group。 ('没有找到组');
}
pageToken = page.nextPageToken;

while(pageToken);
try {
var GroupAddress = ss.getSheetByName('GroupAddress'); //如果GroupAddress表已经存在,打开
Logger。日志('使用现有工作表''+ GroupAddress.getName()+ ''');
} catch(err){
Logger.log('create sheet'GroupAddress'');
ss.deleteSheet(ss.getSheets()[0]);
var GroupAddress = ss.insertSheet('GroupAddress',0); //否则将它创建为第一张工作表
}
GroupAddress.getDataRange()。clearContent();
ss.getSheetByName('GroupAddress')。getRange(1,1,groupList.length,groupList [0] .length).setValues(groupList);

var groupNames = ss.getSheetByName(GroupAddress)。getDataRange()。getValues();
var groupDone = ss.getSheetByName(GroupAddress)。getDataRange()。getBackgrounds();
var progress; (b)如果(groupDone [n] [0]!='white'||(new Date().getTime()-start)/ 60> 5000) {//限制为5秒+ 1组
继续;
}
Logger.log('groupNames [n] [0] ='+ groupNames [n] [0]);
try {
var outputSheet = ss.getSheetByName(groupNames [n] [0]);
Logger.log('sheet'+ outputSheet.getName()+'created');
} catch(err){
var outputSheet = ss.insertSheet(groupNames [n] [0],ss.getSheets()。length + 1);
}
尝试{
var users = getUsersInGroup(groupNames [n] [0]);
var output = [];
for(var i in users){
var user = users [i];
// Logger.log(user);
output.push([Number(i)+ 1,user.email,user.role,user.groupName]);
}
ss.getSheetByName(GroupAddress)。getRange(Number(n)+1,1).setBackground('#fff2cc');
SpreadsheetApp.flush();如果(output.length> 0){
output.push(['Ex.T ='+ parseInt((new Date()。getTime() - start)/ 60)+'mS' , '', '', '']);
outputSheet.getRange(1,1,output.length,output [0] .length).setValues(output);
outputSheet.deleteRows(output.length + 2,outputSheet.getMaxRows() - output.length-4);
outputSheet.deleteColumns(6,outputSheet.getMaxColumns() - 6);
}
} catch(err){
continue}
}
groupDone = ss.getSheetByName(GroupAddress)。getDataRange()。getBackgrounds();
for(progress = groupDone.length-1; progress> = 0; progress - ){
if(groupDone [progress] [0]!='white'){break};
}
Logger.log(n +'='+ progress +'?');
if(n == progress){
MailApp.sendEmail(Session.getEffectiveUser()。getEmail(),'在GroupList中完成的所有工作','所有任务完成'+ new Date()。的toLocaleString());
var trig = ScriptApp.getProjectTriggers();
for(var t in trig){
try {
ScriptApp.deleteTrigger(trig [t]); (10000).create(); /(
} catch(e){}
}
} else {
ScriptApp.newTrigger('listGroupMembers')。 / wait 3 secs and continue
}
}

function resetColors(){
var ss = SpreadsheetApp.getActive();
ss.getSheets()[0] .getDataRange()。setBackground(null);
}

函数getUsersInGroup(rootGroup){
var groupTreeUsers = [];
var groups = [];
groups.push(rootGroup); (group.length> 0){
var currentGroup = groups.pop();

while(groups.length> 0)
var groupName = AdminDirectory.Groups.get(currentGroup).name;
var groupMembers = getAllMembers_(currentGroup);

for(var i in groupMembers){
if(groupMembers [i] .type =='USER'){
var groupMember = groupMembers [i];
groupMember ['groupName'] = currentGroup;
groupTreeUsers.push(groupMember)
}
else if(groupMembers [i] .type =='GROUP'){
groups.push(groupMembers [i] .email)


$ b Logger.log('%s中有%s个用户成员(包括子组)',groupTreeUsers.length,rootGroup);
返回groupTreeUsers;
}

function getAllMembers_(group){
var memberPageToken,memberPage;
var members = [];
do {
memberPage = AdminDirectory.Members.list(group,{
maxResults:200,
pageToken:memberPageToken
});
var pageMembers = memberPage.members;
if(pageMembers){
for(var j = 0; j< pageMembers.length; j ++){
members.push(pageMembers [j]);
}
}
memberPageToken = memberPage.nextPageToken;
} while(memberPageToken);
退货会员;


函数delsheets(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var numSheets = ss.getNumSheets(); //检查电子表格中有多少张工作表
for(var pa = numSheets-1; pa> 0; pa - ){
if( ss.getSheets()[pa] .getSheetName()!='GroupAddress'){
ss.deleteSheet(ss.getSheets()[pa]); //删除最后一张开始的表单
Utilities.sleep(100);
}
}
SpreadsheetApp.flush();
}


解决方案

AdminDirectory MembersCollection可能是你



示例代码片段:

  var members = AdminDirectory .Members.list('testgroup@example.com')的成员。 
for(var i = 0; i< members.length; i ++){
var member = members [i];
switch(member.type){
case'USER':
Logger.log('%s是用户',member.email);
休息;
case'GROUP':
Logger.log('%s is a group',member.email);
休息;
默认值:
Logger.log('永远不会发生');
}

我的部分客户拥有包含群组的群组......组成群组任意深度的树。我使用下面的代码来获取所有用户成员:

$ p $ function walkTreeStack(){
var rootGroup ='testgroup@example.com';
var groupTreeUsers = [];
var groups = [];
groups.push(rootGroup); (group.length> 0){
var currentGroup = groups.pop();

while(groups.length> 0)
var groupName = AdminDirectory.Groups.get(currentGroup).name;
var groupMembers = getAllMembers_(currentGroup); (groupMembers){
if(groupMembers [i] .type =='USER'){
groupTreeUsers.push([groupName,groupMembers [i] .email])
}
else if(groupMembers [i] .type =='GROUP'){
groups.push(groupMembers [i] .email)
} $ b'b}
}

Logger.log('有%s个用户成员(包括子组)',groupTreeUsers.length,groupName);
}

function getAllMembers_(group){
var memberPageToken,memberPage;
var members = [];
do {
memberPage = AdminDirectory.Members.list(group,{
maxResults:200,
pageToken:memberPageToken
});
var pageMembers = memberPage.members;
if(pageMembers){
for(var j = 0; j< pageMembers.length; j ++){
members.push(pageMembers [j]);
}
}
memberPageToken = memberPage.nextPageToken;
} while(memberPageToken);
退货会员;
}

如果递归完成,它会稍微快一点,但是我怀疑脚本可能会因为内存限制,如果有大量的子组和用户成员:

  function getGroupTreeMembers(){
var rootGroup ='testgroup@example.com';
var groupTreeUsers = [];

walkTreeRecursive_(rootGroup,groupTreeUsers);

var groupName = AdminDirectory.Groups.get(rootGroup).name;
Logger.log('%s中有%s个用户成员(包括子组)',groupTreeUsers.length,groupName);


函数walkTreeRecursive_(rootGroup,groupTreeUsers){
var groupName = AdminDirectory.Groups.get(rootGroup).name;
var groupMembers = getAllMembers_(rootGroup);
var groups = []; (groupMembers,groupMembers [i] .email]){
if(groupMembers [i] .type =='USER'){
groupTreeUsers.push([groupName,groupMembers [i] .email])

else if(groupMembers [i] .type =='GROUP'){
groups.push(groupMembers [i] .email)
}
}
for(var i in groups){
walkTreeRecursive_(groups [i],groupTreeUsers);


欲了解更多信息,请访问:

b
$ b

https://开发人员.google.com / admin-sdk / directory / v1 / reference / members#resource

I'm working on a script that gets all goups in my domain and lists all users in these groups.

I rewrote this script because GroupsManager is deprecated so my old script will stop working soon.

All is working well (although this API is quite slow...) but the issue I have is that some groups have not only users but include also other groups... some of them have only subgroups (and no users (way of speaking !)

I can't find any way to catch that situation, the list method return users, it ignores completely groups inside.

So my question is :

Is there a way to get the groups inside a group ? Am I missing something obvious ?

Below and for info is the code I use to list all members in groups in a spreadsheet, 1 sheet / group so that I can manipulate these data faster and easier later on. I used background color flags as a track keeper to handle a (relatively) small batch operation and a timer trigger that make it work until it's done. (yes, we have a lot of groups in our domain ;-)

function listGroupMembers() {
  var start = new Date().getTime();
  var ss = SpreadsheetApp.openById('1k-o4IVKEhW2zkk_________f2rH4UUt3OAC8I0ZoM');// set your SS ID (runs with timer trigger > needs to open by ID
  var pageToken, page;
  var count=0;
  var groupList = [];
  do {
    page = AdminDirectory.Groups.list({
      domain: 'xxxxx.be',
      maxResults: 100,
      pageToken: pageToken
    });
    var gr = page.groups;
    if (gr) {
      for (var i = 0; i < gr.length; i++) {
        var group = gr[i];
        count++;
        //Logger.log(group);
        groupList.push([group.email,count])
      }
    } else {
      Logger.log('No group found.');
    }
    pageToken = page.nextPageToken;
  } 
  while (pageToken);
  try{
    var GroupAddress = ss.getSheetByName('GroupAddress');// if GroupAddress Sheet already exist, open it
    Logger.log('Use existing sheet "'+GroupAddress.getName()+'"');
  }catch(err){
    Logger.log('create sheet "GroupAddress"');
    ss.deleteSheet(ss.getSheets()[0]);
    var GroupAddress = ss.insertSheet('GroupAddress',0); //else create it as first sheet 
  }
  GroupAddress.getDataRange().clearContent();
  ss.getSheetByName('GroupAddress').getRange(1,1,groupList.length,groupList[0].length).setValues(groupList);

  var groupNames = ss.getSheetByName("GroupAddress").getDataRange().getValues();
  var groupDone = ss.getSheetByName("GroupAddress").getDataRange().getBackgrounds();
  var progress;
  for(var n in groupNames){
    if(groupDone[n][0] != 'white' || (new Date().getTime()-start)/60 > 5000){ // limit to 5 seconds + 1 group
      continue;
    }
    try{
      var outputSheet = ss.insertSheet(groupNames[n][0],Number(n)+1)
      }catch(err){
        var outputSheet = ss.getSheetByName(groupNames[n][0]);
      }
    var group = GroupsApp.getGroupByEmail(groupNames[n][0]);
    //Logger.log('groupNames[n][0] = '+groupNames[n][0]);
    try{
      var users = group.getUsers();
      var output = [];
      for (var i in users){ 
        var user = AdminDirectory.Users.get(users[i].getEmail());
        output.push([Number(i)+1,user.name.fullName, user.primaryEmail,user.aliases!=null?user.aliases:'',new Date(user.creationTime),user.isAdmin,new Date(user.lastLoginTime)]);
      }
      ss.getSheetByName("GroupAddress").getRange(Number(n)+1,1).setBackground('#fff2cc');
      SpreadsheetApp.flush();
      if(output.length>0){
        output.push(['durée :',parseInt((new Date().getTime()-start)/60),'millisecondes','','','','']);
        outputSheet.getRange(1,1,output.length,output[0].length).setValues(output);
      }
    }catch(err){
      continue}
  }
  groupDone = ss.getSheetByName("GroupAddress").getDataRange().getBackgrounds();
  for(progress = groupDone.length-1;progress>=0;progress--){
    if(groupDone[progress][0]!='white'){break};
  }
  Logger.log(n+'='+progress+'?');
  if(n==progress){
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(),'All jobs done in GroupList','All tasks completed on '+new Date().toLocaleString());
    var trig = ScriptApp.getProjectTriggers();
    for(var t in trig){
      try{
      ScriptApp.deleteTrigger(trig[t]);
      }catch(e){}
    }
  }else{
    ScriptApp.newTrigger('listGroupMembers').timeBased().after(3000).create();// wait 3 secs and continue
  }
}


EDIT

Thanks to Göran's answer I have a version that gets all members of all groups including subgroups.

I changed (very) slightly his code to fit my requirements and I also needed to limit the number of cells in each sheet to what I needed because the total (1000*26 cells/sheet) was exceeding the 200000 cells limit (I have more than 100 sheets).

Full code below for anybody who would be interested (including menu and a few utilities):

function onOpen() {
  var menu = SpreadsheetApp.getUi().createMenu("Utilitaires INSAS")
  .addItem("reset colors", "resetColors")
  .addItem("create groupUser lists", "listGroupMembers")
  .addItem("delete all sheets", "delsheets");
  menu.addToUi();
}

function listGroupMembers() {
  var start = new Date().getTime();
  var ss = SpreadsheetApp.openById('1k-o4IVKEhW2zkkEu0gAvb92rQf2rH4UUt3OAC8I0ZoM');// set your SS ID (runs with timer trigger > needs to open by ID
  var pageToken, page;
  var count=0;
  var groupList = [];
  do {
    page = AdminDirectory.Groups.list({
      domain: 'insas.be',
      maxResults: 100,
      pageToken: pageToken
    });
    var gr = page.groups;
    if (gr) {
      for (var i = 0; i < gr.length; i++) {
        var group = gr[i];
        count++;
        //Logger.log(group);
        groupList.push([group.email,count])
      }
    } else {
      Logger.log('No group found.');
    }
    pageToken = page.nextPageToken;
  } 
  while (pageToken);
  try{
    var GroupAddress = ss.getSheetByName('GroupAddress');// if GroupAddress Sheet already exist, open it
    Logger.log('Use existing sheet "'+GroupAddress.getName()+'"');
  }catch(err){
    Logger.log('create sheet "GroupAddress"');
    ss.deleteSheet(ss.getSheets()[0]);
    var GroupAddress = ss.insertSheet('GroupAddress',0); //else create it as first sheet 
  }
  GroupAddress.getDataRange().clearContent();
  ss.getSheetByName('GroupAddress').getRange(1,1,groupList.length,groupList[0].length).setValues(groupList);

  var groupNames = ss.getSheetByName("GroupAddress").getDataRange().getValues();
  var groupDone = ss.getSheetByName("GroupAddress").getDataRange().getBackgrounds();
  var progress;
  for(var n in groupNames){
    if(groupDone[n][0] != 'white' || (new Date().getTime()-start)/60 > 5000){ // limit to 5 seconds + 1 group
      continue;
    }
    Logger.log('groupNames[n][0] = '+groupNames[n][0]);
    try{
      var outputSheet = ss.getSheetByName(groupNames[n][0]);
      Logger.log('sheet '+outputSheet.getName()+' created');
      }catch(err){
        var outputSheet = ss.insertSheet(groupNames[n][0],ss.getSheets().length+1);
      }
    try{
      var users = getUsersInGroup(groupNames[n][0]);
      var output = [];
      for (var i in users){ 
        var user = users[i];
//        Logger.log(user);
        output.push([Number(i)+1,user.email,user.role,user.groupName]);
      }
      ss.getSheetByName("GroupAddress").getRange(Number(n)+1,1).setBackground('#fff2cc');
      SpreadsheetApp.flush();
      if(output.length>0){
        output.push(['Ex.T = '+parseInt((new Date().getTime()-start)/60)+' mS','','','']);
        outputSheet.getRange(1,1,output.length,output[0].length).setValues(output);
        outputSheet.deleteRows(output.length+2, outputSheet.getMaxRows()-output.length-4);
        outputSheet.deleteColumns(6, outputSheet.getMaxColumns()-6);
      }
    }catch(err){
      continue}
  }
  groupDone = ss.getSheetByName("GroupAddress").getDataRange().getBackgrounds();
  for(progress = groupDone.length-1;progress>=0;progress--){
    if(groupDone[progress][0]!='white'){break};
  }
  Logger.log(n+'='+progress+'?');
  if(n==progress){
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(),'All jobs done in GroupList','All tasks completed on '+new Date().toLocaleString());
    var trig = ScriptApp.getProjectTriggers();
    for(var t in trig){
      try{
      ScriptApp.deleteTrigger(trig[t]);
      }catch(e){}
    }
  }else{
    ScriptApp.newTrigger('listGroupMembers').timeBased().after(10000).create();// wait 3 secs and continue
  }
}

function resetColors(){
  var ss = SpreadsheetApp.getActive();
  ss.getSheets()[0].getDataRange().setBackground(null);
}

function getUsersInGroup(rootGroup) {
  var groupTreeUsers = [];
  var groups = [];
  groups.push(rootGroup);

  while (groups.length > 0) {
    var currentGroup = groups.pop();
    var groupName = AdminDirectory.Groups.get(currentGroup).name;
    var groupMembers = getAllMembers_(currentGroup);

    for (var i in groupMembers) {
      if (groupMembers[i].type == 'USER') {
        var groupMember = groupMembers[i];
        groupMember['groupName'] = currentGroup;
        groupTreeUsers.push(groupMember)
      }
      else if (groupMembers[i].type == 'GROUP') {
        groups.push(groupMembers[i].email)
      }
    }
  }
  Logger.log('There are %s user members in %s (including sub groups)', groupTreeUsers.length, rootGroup);
  return groupTreeUsers;
}

function getAllMembers_(group) {
  var memberPageToken, memberPage;
  var members = [];
  do {
    memberPage = AdminDirectory.Members.list(group, {
      maxResults: 200,
      pageToken: memberPageToken
    });
    var pageMembers = memberPage.members;
    if (pageMembers) {
      for (var j =0; j < pageMembers.length; j++) {
        members.push(pageMembers[j]);
      }
    }
    memberPageToken = memberPage.nextPageToken;
  } while (memberPageToken);
  return members;
}

function delsheets(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var numSheets = ss.getNumSheets();// check how many sheets in the spreadsheet
  for (var pa=numSheets-1;pa>0;pa--){ 
    if(ss.getSheets()[pa].getSheetName()!='GroupAddress'){
      ss.deleteSheet(ss.getSheets()[pa]); // delete sheets begining with the last one
      Utilities.sleep(100);
    }
  }
  SpreadsheetApp.flush();
} 

解决方案

AdminDirectory MembersCollection might be what you are looking for.

Example snippet:

var members = AdminDirectory.Members.list('testgroup@example.com').members;
for (var i = 0; i < members.length; i++) {
  var member = members[i];
  switch (member.type) {
    case 'USER':
      Logger.log('%s is a user', member.email);
      break;
    case 'GROUP':
      Logger.log('%s is a group', member.email);
      break;
    default:
      Logger.log('This will never happen');
  }

Some of my customers have groups containing groups contaning groups... forming a group tree with arbitrary depth. I use this code to get all user members in such a group tree:

function walkTreeStack() {
  var rootGroup = 'testgroup@example.com';
  var groupTreeUsers = [];
  var groups = [];
  groups.push(rootGroup);

  while (groups.length > 0) {
    var currentGroup = groups.pop();
    var groupName = AdminDirectory.Groups.get(currentGroup).name;
    var groupMembers = getAllMembers_(currentGroup);

    for (var i in groupMembers) {
      if (groupMembers[i].type == 'USER') {
        groupTreeUsers.push([groupName, groupMembers[i].email])
      }
      else if (groupMembers[i].type == 'GROUP') {
        groups.push(groupMembers[i].email)
      }
    }
  }

  Logger.log('There are %s user members in %s (including sub groups)', groupTreeUsers.length, groupName);
}

function getAllMembers_(group) {
  var memberPageToken, memberPage;
  var members = [];
  do {
    memberPage = AdminDirectory.Members.list(group, {
      maxResults: 200,
      pageToken: memberPageToken
    });
    var pageMembers = memberPage.members;
    if (pageMembers) {
      for (var j =0; j < pageMembers.length; j++) {
        members.push(pageMembers[j]);
      }
    }
    memberPageToken = memberPage.nextPageToken;
  } while (memberPageToken);
  return members;
}

It's slightly faster if it's done recursively but I suspect the script might crash due to memory constraints if there are a large number of sub groups and user members:

function getGroupTreeMembers() {
  var rootGroup = 'testgroup@example.com';
  var groupTreeUsers = [];

  walkTreeRecursive_(rootGroup, groupTreeUsers);

  var groupName = AdminDirectory.Groups.get(rootGroup).name;  
  Logger.log('There are %s user members in %s (including sub groups)', groupTreeUsers.length, groupName);
}

function walkTreeRecursive_(rootGroup, groupTreeUsers) {
  var groupName = AdminDirectory.Groups.get(rootGroup).name;
  var groupMembers = getAllMembers_(rootGroup);
  var groups = [];
  for (var i in groupMembers) {
    if (groupMembers[i].type == 'USER') {
      groupTreeUsers.push([groupName, groupMembers[i].email])
    }
    else if (groupMembers[i].type == 'GROUP') {
      groups.push(groupMembers[i].email)
    }
  }
  for (var i in groups) {
    walkTreeRecursive_(groups[i], groupTreeUsers);
  }
}

For more information please visit:

https://developers.google.com/admin-sdk/directory/v1/reference/members#resource

这篇关于在Google-Apps-Script中使用Directory API,如何获取组内的组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆