问题描述
我正在尝试从Gsuite目录添加用户,作为该目录中所有用户的联系人。
var credential = GetCredentialForUser(User.PrimaryEmail);
// Create Drive API service.
var peopleService = new PeopleServiceService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential
});
PeopleResource.ListDirectoryPeopleRequest peopleRequest =
peopleService.People.ListDirectoryPeople();
peopleRequest.ReadMask = "names,emailAddresses,addresses,phoneNumbers";
peopleRequest.Sources = PeopleResource.ListDirectoryPeopleRequest.SourcesEnum.DIRECTORYSOURCETYPEDOMAINPROFILE;
peopleRequest.PageSize = 1000;
//peopleRequest.SortOrder = (PeopleResource.ConnectionsResource.ListRequest.SortOrderEnum)1;
var res = peopleRequest.Execute();
var list = peopleService.ContactGroups.List().Execute();
//var directoryPeople = peopleService.People.ListDirectoryPeople().Execute();
var person = res.People.FirstOrDefault();
foreach (var label in list.ContactGroups)
{
Console.WriteLine(label.ResourceName);
}
var all = list.ContactGroups.Where(s => s.Name== "myContacts").FirstOrDefault();
var members = peopleService.ContactGroups.Members.Modify(new ModifyContactGroupMembersRequest() { ResourceNamesToAdd = new List<string> { person.ResourceName },ResourceNamesToRemove = new List<string> { } },all.ResourceName).Execute();
我收到例外情况
{"Google.Apis.Requests.RequestError\r\nResource name \"people/XXXYYYY\" is not a valid contact person resource. [400]\r\nErrors [\r\n\tMessage[Resource name \"people/XXXYYYY\" is not a valid contact person resource.] Location[ - ] Reason[badRequest] Domain[global]\r\n]\r\n"}
这是否意味着我们不能使用目录中的人api作为联系人来添加用户,如果是,批量处理的最佳方法是什么?清除所有联系人并从目录添加新用户?
解决方法
问题是您正在尝试将个人资料添加到联系人组。您只能将联系人添加到联系人组。因此,您应该只使用个人资料电子邮件创建联系人。
,这是我设置批量请求以创建联系人的功能。
将所有目录联系人转换为 Person,然后使用 BatchRequest 将其发送。 最后执行批处理请求以创建联系人。
确保在 Person 中包含主要电子邮件地址。请注意,我检查了 ClientData - 这是我存储我的应用名称和 AD 的用户唯一 ID 以跟踪我的应用添加的内容的位置。
public Person CreateContact(BatchRequests batchRequest,Person contact,List<string> errors)
{
if (contact.EmailAddresses == null ||
contact.EmailAddresses.Count == 0 ||
!contact.EmailAddresses.Any(e => e.Metadata.Primary == true))
throw new Exception("Primary Email Address Not Found.");
try
{
if (!batchRequest.BatchCreateContactsRequest.Contacts.Any(c => c.ContactPerson.ClientData == contact.ClientData))
{
ContactToCreate contactToCreate = new ContactToCreate();
contactToCreate.ContactPerson = contact;
batchRequest.BatchCreateContactsRequest.Contacts.Add(contactToCreate);
}
}
catch (Exception ex)
{
// CurrentPersonEmail is the user's email whose contacts are being modified.
errors.Add($"Error;{CurrentPersonEmail};{ex.Message}. StackTrace:{ex.StackTrace}");
}
return contact;
}
一旦您准备好所有联系人 - 然后执行请求(这不是完整的代码,但我希望您知道如何调用它):
BatchCreateContactsResponse batchCreateContactsResponse = PeopleService.People.BatchCreateContacts(BatchCreateContactsRequest).Execute();