javascript Google人员API搜索联系人()的格式?

7cwmlq89  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(135)

我正在按照Google的要求从Contacts API过渡到People API。我很惊讶网上没有示例,但我现在可以创建、删除和修改/更新(感谢@Tanaike回复Omar F. here:Cannot update contactusgin People api using Google Apps Script)联系人,可以通过迭代People. People. Connections. List()进行删除和修改,最多可获得100个结果(来自此处的应用程序脚本示例:https://developers.google.com/people/quickstart/apps-script)。
但是我有大约12,000个联系人,需要使用(我假设)People.People.searchContacts(),我还没有找到任何应用程序脚本的例子,文档都是Java的,我不知道如何翻译成应用程序脚本:

...

// 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云端硬盘查询参数样式,因为此页面的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的示例来说明
1.搜索查询类似于和

  1. readMask是什么样子的。
    我知道searchResponse.results只是一个人的数组,从那里应该没问题。
    谢谢你,我希望这不是太华夫饼干(困惑非程序员为我们的小丈夫和妻子的业务)。

编辑:快到了

根据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个结果,在检索了半打左右。
P.P.S.建议/要求对缓存进行"预热",我假设下面的更新脚本可以完成这一操作,结果没有任何差异:

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}`);
  }
}

2uluyalo

2uluyalo1#

答案:

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

更多信息:

People API搜索查询不支持Drive语法,如“contains”关键字。来自文档(强调我自己的):
query请求的纯文本查询。***该查询用于匹配人员字段的前缀短语。***例如,姓名为“foo name”的人员匹配“f”、“fo”、“foo”、“foo n”、“nam”等查询,但不匹配“oo n”。
readMask可以采用以下任意值(从此处开始),以逗号分隔:

  • 地址
  • 年龄范围
  • 传记
  • 生日
  • 日历URL
  • 客户端数据
  • 封面照片
  • 电子邮件地址
  • 事件
  • 外部ID
  • 性别
  • 即时客户端
  • 利益
  • 地区
  • 地点
  • 会员资格
  • 元数据
  • 杂项关键字
  • 人名
  • 绰号
  • 职业
  • 组织
  • 电话号码
  • 照片
  • 关系
  • 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);
  })
}
jei2mxaa

jei2mxaa2#

将pageSize属性添加到searchContacts参数。以下示例使用另一个资源,但显示了pageSize的用法(对于许多Google API都是相同的

function run() {
  var response;
  var options = {
    pageSize:10,
    personFields: 'names'
  };
  var callback = People.People.Connections.list
  do{
    response = callback('people/me',options)
  response.connections.forEach(connection => console.log(connection.names ? connection.names[0].displayName : ''));
  options.pageToken = response.nextPageToken
  } while(options.pageToken)
}

相关

rsaldnfx

rsaldnfx3#

你没有看到所有结果的原因是搜索是在一些谷歌缓存上完成的,所以,刷新它,根据文档:https://developers.google.com/people/api/rest/v1/people/searchContacts
你必须首先发送一个“预热”请求,等待几秒钟,然后发送你的请求,是的,我知道这很奇怪,但文档是这么说的...
重要提示:在搜索之前,客户端应发送包含空查询的预热请求以更新该高速缓存。请参阅https://developers.google.com/people/v1/contacts#search_the_users_contacts
您还可以在这里看到它是如何完成的(请参见Java选项卡):https://developers.google.com/people/v1/contacts#search_the_users_contacts
更正:如果你是通过电话号码搜索,只要知道有一个错误的谷歌API看到这个线程-搜索联系人与电话号码查询是坏的谷歌说,错误被修复和验证,但它不是至少在我写这个更正。
变通办法:我只是把电话号码也作为昵称字段之一,所以搜索工作,因为这是正在搜索的字段之一

相关问题