在Google脚本中,我需要查询许多同事的Google用户配置文件图片URL。
下面是单个用户的工作示例:
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人员:
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'我正在寻找一个作为输入的电子邮件地址列表的查询,例如:
[ '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+雇员的情况下,这是可行的。
工作代码:
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;
}发布于 2022-05-27 03:22:13
看起来,在Method: people.searchDirectoryPeople中,一次只能指定一个人。
另一个选项可以是People.People.getBatchGet(),它将需要一个额外的步骤,但提供有关您指定的人员列表的信息。请求如下所示:
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
发布于 2022-05-26 23:59:46
这个怎么样?
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;
}
}https://stackoverflow.com/questions/72398370
复制相似问题