Google People API 搜索联系人()的应用脚本/Javascript 格式?

Posted

技术标签:

【中文标题】Google People API 搜索联系人()的应用脚本/Javascript 格式?【英文标题】:Appscript/Javascript format for Google People API searchContacts()? 【发布时间】:2021-11-11 02:45:49 【问题描述】:

我正在按照 Google 的要求从 Contacts API 过渡到 People API。我对网上缺少示例感到非常惊讶,但我现在可以创建、删除和修改/更新(感谢@Tanaike 对 Omar F 的回复:Cannot update contactusgin People api using Google Apps Script)一个联系人,通过迭代删除和修改通过 People.People.Connections.List(),最多 100 个结果(来自此处的 Appscript 示例:https://developers.google.com/people/quickstart/apps-script)。

但我有大约 12,000 个联系人,需要使用(我假设)People.People.searchContacts()。我还没有找到任何 Appscript 示例,文档都是 Java 的,我不知道如何翻译成 Appscript:

...

// Send search request
SearchResponse response = peopleService.people().searchContacts()
    .setQuery("query")
    .setReadMask("names,emailAddresses")
    .execute();

或同样没用的“协议”(对我来说 - 我试过了!):

...
// Send search request after several seconds
GET /v1/people:searchContacts?query=query&readMask=names,emailAddresses HTTP/1.1
Host: people.googleapis.com

我迄今为止最好的猜测是使用 Google Drive Query Parameter 样式,因为此页面中的 People API 链接 (https://developers.google.com/people/v1/query-parameters) 似乎没有帮助:

let searchResp = People.People.searchContacts(
    "phoneNumbers contains 5632",
     readMask: "names,phoneNumbers,addresses,emailAddresses" 
  );

let personBob = searchResp.results.find(p =>
    p.names[0].displayName.includes("Bob Q22222")
  );

因此,在花费了令人尴尬的时间到达这一点之后,我认输了,希望有人可以举例说明通过 People.People.searchContacts() 获取 searchResponse 以显示什么

    搜索查询看起来像和 readMask 是什么样的。

我知道 searchResponse.results 只是一个 People 数组,从那里应该没问题。

谢谢你,我希望这不是太荒谬(对于我们的小夫妻生意感到困惑的非程序员)。 ~


编辑:差不多了

根据 Rafi 的回复修改,这适用于表单附加的 Appscript 文件,这是我想要的它没有检索所有结果,请参见下文):

function run() 
  let query = "Q12755";
  let found = People.People.searchContacts(
    "query": query,
    "readMask": "names,addresses,emailAddresses,phoneNumbers"
  );

  if (found.results) 
    for (i = 0; i < found.results.length; i++) 
      let thisResult = found.results[i];
      Logger.log(`Result $i: $thisResult.person.names[0].displayName`);
    
   else 
    Logger.log(`No results for $query`);
  

...但是,它并没有获取所有结果。

“Q12755”查询的测试函数和结果:

该字符串在 Google 通讯录中有两个结果:

我手机上的两个结果相同:

知道为什么不是所有结果都被检索到了吗?我已经测试了几个查询,但始终没有找到结果。所有(我相信)测试的联系人都是通过 Appscript 脚本通过已弃用的联系人 API 创建的。

附:我可能会补充一点,它只检索一个结果不是问题。在其他“应该”有 20 个结果的情况下,in 已检索到大约 6 个。

附言建议/要求对缓存进行“预热”,我假设下面的更新脚本可以做到这一点。结果没有区别:

function run() 
  let blankQueryForWarmUp = "";
  let found = People.People.searchContacts(
    "query": blankQueryForWarmUp,
    "readMask": "names,addresses,emailAddresses,phoneNumbers"
  );

  Utilities.sleep(5000);

  let query = "Q12755";
  found = People.People.searchContacts(
    "query": query,
    "readMask": "names,addresses,emailAddresses,phoneNumbers"
  );

  if (found.results) 
    for (i = 0; i < found.results.length; i++) 
      let thisResult = found.results[i];
      Logger.log(`Result $i: $thisResult.person.names[0].displayName`);
    
   else 
    Logger.log(`No results for $query`);
  

【问题讨论】:

【参考方案1】:

答案:

People API 搜索查询仅支持联系人姓名中的部分字符串匹配。 readMask 值必须连接为逗号分隔的字符串。

更多信息:

People API 搜索查询不支持 Drive 语法,例如“包含”关键字。来自documentation(强调我自己的):

query 请求的纯文本查询。 该查询用于匹配人的字段的前缀短语。例如,名称为“foo name”的人匹配诸如“f”、“fo”之类的查询"、"foo"、"foo n"、"nam" 等,但不是 "oo n"。

readMask 可以采用以下任何值 (taken from here),以逗号分隔:

地址 年龄范围 传记 生日 日历网址 客户端数据 封面照片 电子邮件地址 事件 externalIds 性别 imClients 兴趣 语言环境 位置 会员资格 元数据 杂项关键字 名字 昵称 职业 组织 电话号码 照片 关系 sip地址 技能 网址 用户定义

代码示例:

完整的 javascript 请求示例如下所示:

function run() 
  return gapi.client.people.people.searchContacts(
    "query": "Rafa Guillermo",
    "readMask": "names,emailAddresses,phoneNumbers"
  ).then(function(response) 
    console.log("Response", response)
  , function(err)  
    console.error(err);
  )

【讨论】:

非常感谢拉菲。它只是附加到 Google 表格的 Appscript 脚本,因此我已对其进行了修改以在该上下文中工作,但它并未检索所有结果。我已经用细节更新了这个问题。有什么想法吗? 条目是两个不同的联系人还是同一个联系人保存了两次? 您好 Rafa,他们是两个不同的联系人,共享相同的报价单号(在名称中)和地址,是房产的所有者和租户。 说实话我无法重现这个。联系人中的哪些字段已填写? 衷心感谢 Rafa 的跟进。我可能要到本周末才开始处理这个问题,如果发现进一步的问题,我会在这里报告。

以上是关于Google People API 搜索联系人()的应用脚本/Javascript 格式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Scripts 从 Google People API 获取 google 联系人电子邮件目录中的电子邮件列表

使用 google people api 获取群组的联系人

使用 Google People API (Java) 检索有关联系人的信息

将Google People API与服务帐户配合使用

Google People API中Person对象的空引用异常[重复]

我可以在 Google People API 和 Task API 中创建扩展属性吗?