Google Apps 脚本 Google 人员 API 从联系人组获取联系人

Google Apps Script Google People API get contacts from contact group

我有一个脚本(使用 Google Apps 脚本),它使用联系人 API 从联系人组中提取电子邮件,然后向联系人组发送电子邮件。正在尝试转换为 PeopleAPI,但似乎无法复制该功能。这是相关的脚本示例,其中包含有效的 ContactsAPI 代码但被注释掉了:

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;
};

我确信我在这里遗漏了一些非常简单的东西来让人们API到return一组联系人,我可以从中获取电子邮件地址,这样我就可以填充驱动权限和电子邮件至:field.

因为我没有找到任何直接获取它们的方法,所以我确实使用了 People.People.Connections.list 并过滤了数据,直到我收到了电子邮件。这应该是您的代码的样子。

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);
}

行为:

  • 获取你手下的所有人脉
  • 获取他们所有的会员资格
  • 检查他们的会员资源名称是否与您想要的相同。 (他们可以属于多个会员)
  • 循环那个人的所有邮件(他们可以有多个邮件),然后推入一个数组。
  • 将该数组推入包含属于资源名称的所有人的所有电子邮件的最终数组。

输出:

  • 记录了 ContactsAppPeople API 结果,下面显示它们是相同的。

资源:

这里有一个更有效的方法来做你想做的事:

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);
    }
  }));

第一次调用获取组的所有成员(resourcesNames AKA contactIds) 第二次调用获取所有成员的电子邮件地址。

然后我们只从响应中获取电子邮件的实际值(通过映射)