Trevor Fulk
Trevor Fulk

Reputation: 13

Google Apps Script Google People API get contacts from contact group

I have a script (using Google Apps Script) that uses the Contacts API to pull the emails from a contactgroup, then sends an email to the group of contacts. Attempting to convert to the PeopleAPI and cannot seem to replicate the functionality. Here's the relevant script sample with the working ContactsAPI code included but commented out:

function sharereport() {
//var CGroup = ContactsApp.getContactGroup('group_name');
//var Dist = CGroup.getContacts();
var CGroup = People.ContactGroups.get('contactGroups/498ba6e40f63a476') 
var Dist = People.People.getBatchGet('CGroup','people.email_addresses');

. . .

 for (var i = 0; i < Dist.length; i++) {
 var nextemail = Dist[i].getEmails();
 var usethisemail = nextemail[0].getAddress();
 Drive.Permissions.insert(
   // @ts-ignore
   {
     'role': 'writer',
     'type': 'user',
     'value': usethisemail,
   },
   MyID,
   {
     'sendNotificationEmails': 'false',
   });
 MailString = MailString + ',' + usethisemail;
};

I'm sure I'm missing something really simple here to get the PeopleAPI to return an array of contacts that I can get the email addresses out of so I can populate the drive permissions and email to: field.

Upvotes: 1

Views: 3352

Answers (2)

marmor
marmor

Reputation: 28169

Here's a more efficient way of doing what you want:

var group = People.ContactGroups.get('contactGroups/50e3b0650db163cc', {
    maxMembers: 25000
  });
  Logger.log("group: " + group);

  var group_contacts = People.People.getBatchGet({
    resourceNames: group.memberResourceNames,
    personFields: "emailAddresses"
  });
  
  Logger.log("emails: " + group_contacts.responses.map(x => {
    var emailObjects = x.person.emailAddresses;
    if (emailObjects != null) {
      return emailObjects.map(eo => eo.value);
    }
  }));

First call gets all the group's members (resourcesNames AKA contactIds) Second call gets all the members' email-addresses.

Then we just get the actual value of the email from the response (via map)

Upvotes: 1

NightEye
NightEye

Reputation: 11184

Since I did not found any methods getting them directly, I did use People.People.Connections.list and filtered the data till I get the emails. This should what your code will look like.

function sharereport() {
  var CGroup = ContactsApp.getContactGroup('label1');
  var Emails = CGroup.getContacts().map(function (contact) {
    return contact.getEmailAddresses();
  });
  // Show emails of people belonging to the group label1
  Logger.log(Emails);

  var PGroup = People.People.Connections.list('people/me', {
    personFields: 'emailAddresses,memberships'
  });
  // resource name of label1
  var resourceName = 'contactGroups/7086c0fa8e7b006b';
  var Emails2 = [];
  PGroup.connections.forEach(function (person) {
    person.memberships.forEach(function (membership) {
      if (resourceName == membership.contactGroupMembership.contactGroupResourceName) {
        var addresses = [];
        person.emailAddresses.forEach(function (emailAddress){
          // people can have multiple email addresses, add them all
          addresses.push(emailAddress.value);
        });
        Emails2.push(addresses);
      }
    });
  });
  Logger.log(Emails2);
}

Behavior:

  • get all the people connections under you.
  • get all their memberships
  • check if their memberships resource name is equal to the one you want. (they can belong to multiple memberships)
  • loop all emails of that certain person (they can have multiple emails), then push into one array.
  • push that array into final array containing all emails of all people belonging to the resource name.

Output:

  • Logged both ContactsApp and People API results, below shows that they were the same.

output

Resources:

Upvotes: 2

Related Questions