如何在通过 google contact People API 创建联系人时将个人资料照片添加到联系人?
How to add a profile photo to a contact as you create it via google contact People API?
Update/Solution
在通过人脉创建联系人时无法将照片添加到人物对象 API。但是您可以在使用 People.People.updateContactPhoto 后直接更新照片。 updateContactPhoto 限制每个用户每分钟 60 次查询。如果您的脚本需要更新超过 60 张联系人照片,那么您需要在代码中添加延迟,以免达到查询限制
问题:
我正在根据一组数据创建大量联系人列表,包括每个联系人的联系人照片。当我通过 people.createContact 创建联系人时,如果我有照片字段,它会显示“person.photos 是一个只读字段。”我怎样才能创建带有个人资料照片的联系人 link?
示例代码
const contact = {names:..., addresses:..., emailAddressess:..., phoneNumbers:...,
photos: {"url":..., "primary": true}
}
People.People.createContact(contact)
这给出了错误信息
更新 1:
目前这就是我正在做的并且它有效。现在的主要问题是我不想使用 Utilities.Sleep 函数。我循环了这个函数数百次,加起来很快。如果我在第 40 次或第 50 次联系时没有使用睡眠,它会抛出“遇到内部错误”。每次出错的联系人都不一样,因此错误与特定的人无关。我的假设是错误来自 运行 太多请求太快了,但是我怎么能 运行 不强迫它休眠呢?
function importPerson(person){
const photoData = encodePhotoData(person.photos[0].url)
delete person.photos
const newContact = People.People.createContact(person)
People.People.updateContactPhoto({
photoBytes: photoData,
},newContact.resourceName)
//This stops it from throwing an error
Utilities.sleep(1000)
}
您需要使用 people.updateContactPhoto 来更新联系人。您需要将照片的 url 转换为 base64 编码字符串中的原始照片字节。
示例代码:
var resource = {
names: [
{
givenName: "Sample1"
}
],
emailAddresses: [
{
value: "sample1@example.com"
}
]
};
//create contact
var response = People.People.createContact(resource);
//Get raw photo bytes in base64-encoded string
var url = "https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg"
var photoBlob = UrlFetchApp.fetch(url);
var base64EncodedBytes = Utilities.base64Encode(photoBlob.getBlob().getBytes());
var photoResource = {
photoBytes: base64EncodedBytes
}
//update photo
People.People.updateContactPhoto(photoResource,response.resourceName)
输出:
(更新)
这是我尝试创建 100 个联系人的示例代码:
function testContact(){
for(var i=0;i<100;i++){
var resource = {
names: [
{
givenName: "Sample1"
}
],
emailAddresses: [
{
value: "sample1@example.com"
}
],
photos:[
{
url: "https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg"
}
]
};
Logger.log(i);
importPerson(resource);
}
}
function importPerson(person){
const photoData = encodePhotoData(person.photos[0].url)
delete person.photos
const newContact = People.People.createContact(person)
People.People.updateContactPhoto({
photoBytes: photoData,
},newContact.resourceName)
//This stops it from throwing an error
//Utilities.sleep(1000)
}
Update/Solution
在通过人脉创建联系人时无法将照片添加到人物对象 API。但是您可以在使用 People.People.updateContactPhoto 后直接更新照片。 updateContactPhoto 限制每个用户每分钟 60 次查询。如果您的脚本需要更新超过 60 张联系人照片,那么您需要在代码中添加延迟,以免达到查询限制
问题:
我正在根据一组数据创建大量联系人列表,包括每个联系人的联系人照片。当我通过 people.createContact 创建联系人时,如果我有照片字段,它会显示“person.photos 是一个只读字段。”我怎样才能创建带有个人资料照片的联系人 link?
示例代码
const contact = {names:..., addresses:..., emailAddressess:..., phoneNumbers:...,
photos: {"url":..., "primary": true}
}
People.People.createContact(contact)
这给出了错误信息
更新 1: 目前这就是我正在做的并且它有效。现在的主要问题是我不想使用 Utilities.Sleep 函数。我循环了这个函数数百次,加起来很快。如果我在第 40 次或第 50 次联系时没有使用睡眠,它会抛出“遇到内部错误”。每次出错的联系人都不一样,因此错误与特定的人无关。我的假设是错误来自 运行 太多请求太快了,但是我怎么能 运行 不强迫它休眠呢?
function importPerson(person){
const photoData = encodePhotoData(person.photos[0].url)
delete person.photos
const newContact = People.People.createContact(person)
People.People.updateContactPhoto({
photoBytes: photoData,
},newContact.resourceName)
//This stops it from throwing an error
Utilities.sleep(1000)
}
您需要使用 people.updateContactPhoto 来更新联系人。您需要将照片的 url 转换为 base64 编码字符串中的原始照片字节。
示例代码:
var resource = {
names: [
{
givenName: "Sample1"
}
],
emailAddresses: [
{
value: "sample1@example.com"
}
]
};
//create contact
var response = People.People.createContact(resource);
//Get raw photo bytes in base64-encoded string
var url = "https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg"
var photoBlob = UrlFetchApp.fetch(url);
var base64EncodedBytes = Utilities.base64Encode(photoBlob.getBlob().getBytes());
var photoResource = {
photoBytes: base64EncodedBytes
}
//update photo
People.People.updateContactPhoto(photoResource,response.resourceName)
输出:
(更新)
这是我尝试创建 100 个联系人的示例代码:
function testContact(){
for(var i=0;i<100;i++){
var resource = {
names: [
{
givenName: "Sample1"
}
],
emailAddresses: [
{
value: "sample1@example.com"
}
],
photos:[
{
url: "https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg"
}
]
};
Logger.log(i);
importPerson(resource);
}
}
function importPerson(person){
const photoData = encodePhotoData(person.photos[0].url)
delete person.photos
const newContact = People.People.createContact(person)
People.People.updateContactPhoto({
photoBytes: photoData,
},newContact.resourceName)
//This stops it from throwing an error
//Utilities.sleep(1000)
}