MartyD
MartyD

Reputation: 31

Google Scripts API call to directory.members failed with error: Resource Not Found: groupKey

Having trouble using AdminDirectory API. The samples at https://developers.google.com/apps-script/advanced/admin-sdk-directory all work. When I try to use other AdminDirectory.Group or AdminDirectory.Members function not in the examples, I get the Resource Not Found errors telling me the email of the group or the email of the member is not being found. In the example below I list all groups by calling the function listAllGroups(), it calls listGroupMembers(), which does also work. No error of Resource Not Found: is returned on the group or member email value passed.

In the example below if I just call directly listGroupMembers() passing a single Group email string, I get the error "Resource Not Found: grpEmail". SO for me listGroupMembers() only works if I call it from listAllGroups(). Very strange!! As I type this, it just seems I am geting the email value string wrong.

In further reading, I found the function AdminDirectory.Members.list() does not return the full list of member object values, but AdminDirectory.Members.get() does so if I try to modify the function listGroupMembers() to also include the function AdminDirectory.Members.get(), then I always get the Resource Not Found: error on the AdminDirectory.Members.get() function but not with AdminDirectory.Members.list(). I am getting the member.email[] value from AdminDirectory.Members.list() function so the values being passed to AdminDirectory.Members.get() should be correct.

The only thought I have is it is an issue with the domain string. In my environment, I have a subdomain defined. I was thinking that when using the AdminDirectory.Members.(remove|get|update) the domain is not correct, but haven't found any documentation referencing setting the domain string when calling AdminDirectory.Members.

var domains ['example.org', 'app.example.org'];
function listAllGroups() {
  var pageToken;
  var page;
  for (var x = 0; x < domains.length; x++){
  do {
    page = AdminDirectory.Groups.list({
      domain: domains[x],
      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);
    listGroupMembers(group.name,group.email);
  }
    } else {
      Logger.log('No groups found.');
    }
    pageToken = page.nextPageToken;
  } while (pageToken);
  }
}
function listGroupMembers(grpName, grpEmail) {
  var pageToken;
  var page;
  var allMembers = []
  do {
    page = AdminDirectory.Members.list(grpEmail,{
      includeDerivedMembership: true,
      maxResults: 100,
      pageToken: pageToken
    });
    var members = page.members;
    if (members) {
      for (var i = 0; i < members.length; i++) {
 //        var member = AdminDirectory.Members.get(grpEmail,members[i].email)
        var member = members[i];
        allMembers.push(member);
      }
    } else {
       Logger.log('No members found.');
    }
    pageToken = page.nextPageToken;
   } while (pageToken);
  return allMembers;
}

Upvotes: 0

Views: 1695

Answers (2)

MartyD
MartyD

Reputation: 31

Turns out the line "includeDerivedMembership: true," was adding derived members which are not valid in AdminDirectory.Members.get(). Once this was removed the Resource Not Found error went away.

function listGroupMembers(grpName, grpEmail) {
  var pageToken;
  var page;
  var allMembers = []
  do {
      page = AdminDirectory.Members.list(grpEmail,{
      //includeDerivedMembership: true,
      maxResults: 100,
      pageToken: pageToken
    });
    var members = page.members;
    if (members) {
      for (var i = 0; i < members.length; i++) {
        var memberResource = AdminDirectory.Members.get(grpEmail,members[i].email)
        allMembers.push(memberResource);
      }
    } else {
       Logger.log('No members found.');
    }
    pageToken = page.nextPageToken;
   } while (pageToken);
  return allMembers;
}

As a failsafe I added:

    try {
       var memberResource = AdminDirectory.Members.get(grpEmail,member.email); 
    } catch(err) {//incase there is an error
       var mem = AdminDirectory.Members.insert(member,grpEmail);
       memberResource = AdminDirectory.Members.get(grpEmail,mem.email); 
    }

Upvotes: 1

ziganotschka
ziganotschka

Reputation: 26796

directory.members failed with error: Resource Not Found: groupKey

is the error you will get if you call the function listGroupMembers with the wrong parameter or with the wrong number of parameters.

Scenario:

Within function listAllGroups() you call listGroupMembers(group.name,group.email), passing it two parameters (one of which, group.name, is not necessary).

Now, if you define a function function listGroupMembers(grpEmail) that expects only one parameter, but call it with two parameters - it will assume that the first parameter is group.email. Shall it not be the case - the function will fail with error Resource Not Found: groupKey.

Troubleshooting

Log group.email at the beginning of function listGroupMembers to understand which is the wrong parameter it receives.

Upvotes: 0

Related Questions