问题描述
更新/解决方案
没有办法在通过 People API 创建联系人时将照片添加到人物对象。但是,您可以在使用 People.People.updateContactPhoto 后直接更新照片。 updateContactPhoto 限制为每位用户每分钟 60 次查询。如果您的脚本需要更新超过 60 张联系人照片,那么您需要在代码中添加延迟,以便不达到查询限制
问题:
我正在从一组数据中创建一个大的联系人列表,包括每个联系人的联系人照片。当我通过 people.createContact 创建联系人时,如果我有照片字段,它会指出“person.photos 是只读字段”。我如何创建带有个人资料照片链接的联系人?
示例代码
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)
}