如何在通过 google contact People API 创建联系人时将个人资料照片添加到联系人?

问题描述

更新/解决方

没有办法在通过 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)

这给出了错误信息

Error Message

更新 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)

输出:

enter image description here


(更新)

这是我尝试创建 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)
}