如何判断 Google 日历 API 与会者是否是群组电子邮件?
How to tell if Google Calendar API attendee is a group email?
Google 日历 API 可以轻松判断 "attendee" 是否实际上是资源:
https://developers.google.com/google-apps/calendar/v3/reference/events#resource
但是,我如何判断 "attendee" 是否真的是一个团体,而不是一个人。 IE。 engineers@company.com vs john@company.com
日历 API v3 目前无法做到这一点。
截至 2019 年 12 月,Google 日历 API 仍然无法做到这一点,但如果您是 G Suite 域管理员并且可以访问 G Suite Admin SDK Directory API.
这是一个使用 Admin SDK Directory Service in Google Apps Script.
的示例函数
您向 getGSuiteAddressType()
发送了一个电子邮件地址字符串,它 return 是一个具有以下地址类型的对象:
user
userAlias
group
groupAlias
null
(如果在 G Suite 域中找不到该地址)
它还有以下额外功能,可能对 G Suite 开发人员来说很方便:
- 如果地址是 userAlias 或 groupAlias,它还将 return 作为其别名的地址。
- 如果地址是用户或 userAlias,它还会 return 用户的上次登录时间(如果他们以前从未登录过,则为 null)
- 如果地址是群组或群组别名,它将return群组成员的电子邮件地址数组。
这使用 Google Apps 脚本,但 API 可以使用 this page 的快速入门边栏部分中列出的任何语言访问。
function getGSuiteAddressTypeTest() {
getGSuiteAddressType('group@domain.com'); // returns addressType "group"
getGSuiteAddressType('group.alias@domain.com'); // returns addressType "groupAlias"
}
function getGSuiteAddressType(email) {
email = email.toLowerCase();
var data = {
email: email,
addressType: null,
aliasOf: null,
lastLoginTime: null
};
// check user and aliases
try {
var user = AdminDirectory.Users.get(email);
data.addressType = 'user';
for (var i = 0; i < user.aliases.length; i++) {
var alias = user.aliases[i].toLowerCase();
if (email === alias) {
data.addressType = 'userAlias';
data.aliasOf = user.primaryEmail;
}
}
} catch (e) {}
if (data.addressType) {
var lastLoginTimestamp = user.lastLoginTime; // this outputs an ISO 8601 string that can be used to create a new date object
if (lastLoginTimestamp === '1970-01-01T00:00:00.000Z') {
Logger.log('the user has never logged in');
} else {
data.lastLoginTime = new Date(lastLoginTimestamp);
}
return data;
}
try {
var group = AdminDirectory.Groups.get(email);
data.addressType = 'group';
if (group.aliases) {
for (var i = 0; i < group.aliases.length; i++) {
if (email === group.aliases[i].toLowerCase()) {
data.addressType = 'groupAlias';
data.aliasOf = group.email;
}
}
}
data.members = [];
var groupMembers = getMembersOfGroup(email);
for (var i = 0; i < groupMembers.length; i++) {
data.members.push(groupMembers[i].email);
}
} catch (e) {}
return data;
}
function getMembersOfGroup(groupEmail) {
var pageToken, page;
var members = [];
do {
try {
page = AdminDirectory.Members.list(groupEmail, {
pageToken: pageToken
});
if (page.members) {
members = members.concat(page.members);
}
pageToken = page.nextPageToken;
} catch (e) {}
} while (pageToken);
return members;
}
Google 日历 API 可以轻松判断 "attendee" 是否实际上是资源:
https://developers.google.com/google-apps/calendar/v3/reference/events#resource
但是,我如何判断 "attendee" 是否真的是一个团体,而不是一个人。 IE。 engineers@company.com vs john@company.com
日历 API v3 目前无法做到这一点。
截至 2019 年 12 月,Google 日历 API 仍然无法做到这一点,但如果您是 G Suite 域管理员并且可以访问 G Suite Admin SDK Directory API.
这是一个使用 Admin SDK Directory Service in Google Apps Script.
的示例函数您向 getGSuiteAddressType()
发送了一个电子邮件地址字符串,它 return 是一个具有以下地址类型的对象:
user
userAlias
group
groupAlias
null
(如果在 G Suite 域中找不到该地址)
它还有以下额外功能,可能对 G Suite 开发人员来说很方便:
- 如果地址是 userAlias 或 groupAlias,它还将 return 作为其别名的地址。
- 如果地址是用户或 userAlias,它还会 return 用户的上次登录时间(如果他们以前从未登录过,则为 null)
- 如果地址是群组或群组别名,它将return群组成员的电子邮件地址数组。
这使用 Google Apps 脚本,但 API 可以使用 this page 的快速入门边栏部分中列出的任何语言访问。
function getGSuiteAddressTypeTest() {
getGSuiteAddressType('group@domain.com'); // returns addressType "group"
getGSuiteAddressType('group.alias@domain.com'); // returns addressType "groupAlias"
}
function getGSuiteAddressType(email) {
email = email.toLowerCase();
var data = {
email: email,
addressType: null,
aliasOf: null,
lastLoginTime: null
};
// check user and aliases
try {
var user = AdminDirectory.Users.get(email);
data.addressType = 'user';
for (var i = 0; i < user.aliases.length; i++) {
var alias = user.aliases[i].toLowerCase();
if (email === alias) {
data.addressType = 'userAlias';
data.aliasOf = user.primaryEmail;
}
}
} catch (e) {}
if (data.addressType) {
var lastLoginTimestamp = user.lastLoginTime; // this outputs an ISO 8601 string that can be used to create a new date object
if (lastLoginTimestamp === '1970-01-01T00:00:00.000Z') {
Logger.log('the user has never logged in');
} else {
data.lastLoginTime = new Date(lastLoginTimestamp);
}
return data;
}
try {
var group = AdminDirectory.Groups.get(email);
data.addressType = 'group';
if (group.aliases) {
for (var i = 0; i < group.aliases.length; i++) {
if (email === group.aliases[i].toLowerCase()) {
data.addressType = 'groupAlias';
data.aliasOf = group.email;
}
}
}
data.members = [];
var groupMembers = getMembersOfGroup(email);
for (var i = 0; i < groupMembers.length; i++) {
data.members.push(groupMembers[i].email);
}
} catch (e) {}
return data;
}
function getMembersOfGroup(groupEmail) {
var pageToken, page;
var members = [];
do {
try {
page = AdminDirectory.Members.list(groupEmail, {
pageToken: pageToken
});
if (page.members) {
members = members.concat(page.members);
}
pageToken = page.nextPageToken;
} catch (e) {}
} while (pageToken);
return members;
}