我正在按照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.搜索查询类似于和
- 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}`);
}
}
3条答案
按热度按时间2uluyalo1#
答案:
readMask
值必须连接为逗号分隔的字符串。*更多信息:
People API搜索查询不支持Drive语法,如“contains”关键字。来自文档(强调我自己的):
query
请求的纯文本查询。***该查询用于匹配人员字段的前缀短语。***例如,姓名为“foo name”的人员匹配“f”、“fo”、“foo”、“foo n”、“nam”等查询,但不匹配“oo n”。readMask
可以采用以下任意值(从此处开始),以逗号分隔:代码示例:
完整的JavaScript请求示例如下所示:
jei2mxaa2#
将pageSize属性添加到searchContacts参数。以下示例使用另一个资源,但显示了pageSize的用法(对于许多Google API都是相同的
相关
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看到这个线程-搜索联系人与电话号码查询是坏的谷歌说,错误被修复和验证,但它不是至少在我写这个更正。
变通办法:我只是把电话号码也作为昵称字段之一,所以搜索工作,因为这是正在搜索的字段之一