首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个电子邮件地址的People.People.searchDirectoryPeople()查询

多个电子邮件地址的People.People.searchDirectoryPeople()查询
EN

Stack Overflow用户
提问于 2022-05-26 21:47:33
回答 2查看 206关注 0票数 0

在Google脚本中,我需要查询许多同事的Google用户配置文件图片URL。

下面是单个用户的工作示例:

代码语言:javascript
复制
searchDirectoryPeople('jimmy.neutron@example.com');

function searchDirectoryPeople(query) {
  const options = {
    query: query,
    readMask: 'photos,emailAddresses',
    sources: ['DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE']
  }
  const people = People.People.searchDirectoryPeople(options);
  if(people && people.people) {
    Logger.log('size: '+people.people.length);
    people.people.forEach(person => {
      let url = '';
      let email = '';
      if(person) {
        if(person.photos && person.photos[0]) {
          url = person.photos[0].url;
        }
        if(person.emailAddresses && person.emailAddresses.length) {
          person.emailAddresses.forEach(item => {
            if(item.metadata && item.metadata.sourcePrimary) {
              email = item.value;
            }
          });
        }
      }
      Logger.log('email: '+email+': '+url);
      //Logger.log('person: %s', JSON.stringify(person, null, 2));
    });
  } else {
    Logger.log('no people.people');
  }
}

我发现我可以查询所有的jimmy人员:

代码语言:javascript
复制
searchDirectoryPeople('jimmy');

我有所有员工的电子邮件地址。我可以逐一查看一大串1000+员工名单,但这是不切实际的。我正在寻找一个查询多个电子邮件地址的方法。https://developers.google.com/people/api/rest/v1/people/searchDirectoryPeople上的文档对于查询来说是神秘的。我试过很多类似的东西,但都没有用:

  • 'jimmy.neutron@example.com, carl.wheezer@example.com, cindy.vortex@example.com'
  • 'jimmy.neutron@example.com OR carl.wheezer@example.com OR cindy.vortex@example.com'

我正在寻找一个作为输入的电子邮件地址列表的查询,例如:

代码语言:javascript
复制
[ 'jimmy.neutron@example.com', 'carl.wheezer@example.com', 'cindy.vortex@example.com' ]

是否可以在OR中使用People.People.searchDirectoryPeople()查询?

更新2022-05-31

我试着循环浏览所有的电子邮件,要么进入配额限制,要么进入脚本运行时限制。

@Lorena的回答是正确的:首先使用People.People.listDirectoryPeople()获取所有电子邮件地址的资源名,然后使用People.People.getBatchGet()获取资源名的配置文件图片URL。前者限制每电话1000名雇员,后者限制为200名。在我们使用1k+电子邮件地址作为输入,以及由listDirectoryPeople()返回的20k+雇员的情况下,这是可行的。

工作代码:

代码语言:javascript
复制
const emails = [
  'jimmy.neutron@example.com',
  'carl.wheezer@example.com',
  'cindy.vortex@example.com'
];
let emailToUrl = getGoogleProfilePictureUrls(emails);
Logger.log('emailToUrl: %s', JSON.stringify(emailToUrl, null, 2));
// expected output:
// emailToUrl: {
//  "jimmy.neutron@example.com": "https://lh3.googleusercontent.com/a-/xxxx=s100",
//  "carl.wheezer@example.com": "https://lh3.googleusercontent.com/a-/xxxx=s100",
//  "cindy.vortex@example.com": "https://lh3.googleusercontent.com/a-/xxxx=s100"
// }

function getGoogleProfilePictureUrls(emails) {
  let options = {
    readMask: 'emailAddresses',
    sources: ['DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE'],
    pageSize: 1000
  }
  let run = 1;
  let resourceNameToEmails = {};
  let result = {};
  while(run === 1 || result.nextPageToken) {
    if(result.nextPageToken) {
      options.pageToken = result.nextPageToken;
    }
    result = People.People.listDirectoryPeople(options);
    Logger.log('request #' + (run++) + ', got '+result.people.length+' resource names');
    result.people.forEach(person => {
      if(person.emailAddresses) {
        person.emailAddresses.forEach(obj => {
          if(obj.metadata && obj.metadata.sourcePrimary) {
            let email = obj.value
            if(emails.indexOf(email) >= 0) {
              resourceNameToEmails[person.resourceName] = email;
            }
          }
        });
      }
    });
    Utilities.sleep(200);
  }
  run = 1;
  let emailToUrl = {};
  let resourceNames = Object.keys(resourceNameToEmails);
  let resourceNameBatch = resourceNames.splice(0, 200);
  while(resourceNameBatch.length) {
    options = {
      personFields: 'photos',
      resourceNames: resourceNameBatch,
      sources: [ 'READ_SOURCE_TYPE_PROFILE' ]
    };
    result = People.People.getBatchGet(options);
    if(result && result.responses) {
      Logger.log('request #' + (run++) + ', got '+result.responses.length+' urls');
      result.responses.forEach(person => {
        let primaryUrl = '';
        let url = '';
        if(person.person && person.person.photos) {
          person.person.photos.forEach(photo => {
            if(photo.metadata && photo.metadata.source && photo.metadata) {
              url = photo.url;
              if(photo.metadata.source.type === 'PROFILE' && photo.metadata.primary) {
                primaryUrl = url;
              }
            }
          });
        }
        let email = resourceNameToEmails[person.person.resourceName];
        emailToUrl[email] = primaryUrl || url;
      });
    }
    Utilities.sleep(200);
    resourceNameBatch = resourceNames.splice(0, 200);
  }
  return emailToUrl;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-27 03:22:13

看起来,在Method: people.searchDirectoryPeople中,一次只能指定一个人。

另一个选项可以是People.People.getBatchGet(),它将需要一个额外的步骤,但提供有关您指定的人员列表的信息。请求如下所示:

代码语言:javascript
复制
const options = {
    personFields: 'photos,emailAddresses',
    resourceNames: [
      'people/account_id',
      'people/account_id',
      'people/account_id'
    ],
    sources: [
      'READ_SOURCE_TYPE_PROFILE'
    ]
  }
  
  const people = People.People.getBatchGet(options);

您可以使用account_id获得用户的方法: people.listDirectoryPeople

票数 1
EN

Stack Overflow用户

发布于 2022-05-26 23:59:46

这个怎么样?

代码语言:javascript
复制
function searchDirectoryPeople(query) {
  const options = {
    query: query,
    readMask: 'photos,emailAddresses',
    sources: ['DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE']
  }
  const people = People.People.searchDirectoryPeople(options);
  if(people && people.people) {
    Logger.log('size: '+people.people.length);
    people.people.forEach(person => {
      let url = '';
      let email = '';
      if(person) {
        if(person.photos && person.photos[0]) {
          url = person.photos[0].url;
        }
        if(person.emailAddresses && person.emailAddresses.length) {
          person.emailAddresses.forEach(item => {
            if(item.metadata && item.metadata.sourcePrimary) {
              email = item.value;
            }
          });
        }
      }
      return {"imgurl":url,"email":email}
    });
  } 
}

function searchPlus(emailArray) {
  let oA = [];
  emailArray.forEach(e => {
    oA.push(searchDirectoryPeople(e))
  });
  if(oA && oA.length) {
    return oA;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72398370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档