【问题标题】:Appscript/Javascript format for Google People API searchContacts()?Google People API 搜索联系人()的应用脚本/Javascript 格式?
【发布时间】: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 以显示什么

  1. 搜索查询看起来像和
  2. 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}`);
  }
}

【问题讨论】:

    标签: javascript google-apps-script google-people-api


    【解决方案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 的跟进。我可能要到本周末才开始处理这个问题,如果发现进一步的问题,我会在这里报告。
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    相关资源
    最近更新 更多