Google Apps 脚本 - 联系人 - 查询多个字符串
Google Apps Script - Contacts - Query on multiple strings
我正在编写一个脚本来删除和重新添加大约 100 个联系人。我有 12 个不同的 ContactsApp.getContactsByEmailAddress
搜索条件,启动者知道 运行 需要 30 多秒。有什么方法可以让我只 运行 一次并搜索我的所有条件吗?我找过其他人尝试做同样的事情但没有成功。
下面是我的函数的搜索之一(重复 12 次,将各种搜索词传递给 ContactsApp.getContactsByEmailAddress
)。我添加了 try-catch
块,因为脚本在各种删除循环中似乎无缘无故地抛出错误。
非常感谢任何和所有建议。
var apa = ContactsApp.getContactsByEmailAddress('apa.')
try{
for (var i in apa) {
apa[i].deleteContact()
}
} catch(e){
Logger.log(e)
}
使用 Contacts Service,您只能使用一个搜索条件。因此,搜索多个模式的唯一方法是使用每个搜索参数调用一次该方法。值得庆幸的是,您可以使用标准编程实践来最大程度地减少重复代码的数量:
function getContactsWithEmails(emailSearchCriteria) {
if (!emailSearchCriteria || !emailSearchCriteria.length)
throw new Error("No search inputs given");
// Collect the results of each search into a single Array.
const matches = [];
emailSearchCriteria.forEach(function (email) {
var results = ContactsApp.getContactsByEmailAddress(email);
if (results.length)
Array.prototype.push.apply(matches, results);
else
console.log({message: "No results for search query '" + email + "'", query: email, resultsSoFar: matches});
});
return matches;
}
function deleteContacts(arrayOfContacts) {
if (!arrayOfContacts || !arrayOfContacts.length)
throw new Error("No contacts to delete");
arrayOfContacts.forEach(function (contact) {
ContactsApp.deleteContact(contact);
});
}
// Our function that uses the above helper methods to do what we want.
function doSomething() {
// Define all email searches to be performed.
const emailFragmentsToSearchWith = [
"email1",
...
"emailN"
];
const matchingContacts = getContactsWithEmails(emailFragmentsToSearchWith);
if (matchingContacts.length) {
/** do something with the contacts that matched the search.
* someMethodThatSavesContacts(matchingContacts);
* someMethodThatModifiesContacts(matchingContacts);
* deleteContacts(matchingContacts);
* ...
*/
}
/** do other stuff that doesn't need those contacts. */
}
Google Calendar v3 GData API,如 this SO question, does support multiple query parameters 中所述。但是,没有与此 API 的简单集成 - 您将需要编写适当的 URL 请求并使用 UrlFetchApp
.
执行它们
除了 Google 联系人 API,您还可以使用 Google People REST API, specifically the people.connections#list
端点。
这两个 API 都要求您将 Apps 脚本项目与启用了相应 API 的 Google 云项目相关联,并且可能需要您手动设置您的 Apps 脚本项目在其清单文件中需要的范围,以及为您向 API 端点发出的关联 HTTP 请求提供 OAuth2 授权。
参考资料
我正在编写一个脚本来删除和重新添加大约 100 个联系人。我有 12 个不同的 ContactsApp.getContactsByEmailAddress
搜索条件,启动者知道 运行 需要 30 多秒。有什么方法可以让我只 运行 一次并搜索我的所有条件吗?我找过其他人尝试做同样的事情但没有成功。
下面是我的函数的搜索之一(重复 12 次,将各种搜索词传递给 ContactsApp.getContactsByEmailAddress
)。我添加了 try-catch
块,因为脚本在各种删除循环中似乎无缘无故地抛出错误。
非常感谢任何和所有建议。
var apa = ContactsApp.getContactsByEmailAddress('apa.')
try{
for (var i in apa) {
apa[i].deleteContact()
}
} catch(e){
Logger.log(e)
}
使用 Contacts Service,您只能使用一个搜索条件。因此,搜索多个模式的唯一方法是使用每个搜索参数调用一次该方法。值得庆幸的是,您可以使用标准编程实践来最大程度地减少重复代码的数量:
function getContactsWithEmails(emailSearchCriteria) {
if (!emailSearchCriteria || !emailSearchCriteria.length)
throw new Error("No search inputs given");
// Collect the results of each search into a single Array.
const matches = [];
emailSearchCriteria.forEach(function (email) {
var results = ContactsApp.getContactsByEmailAddress(email);
if (results.length)
Array.prototype.push.apply(matches, results);
else
console.log({message: "No results for search query '" + email + "'", query: email, resultsSoFar: matches});
});
return matches;
}
function deleteContacts(arrayOfContacts) {
if (!arrayOfContacts || !arrayOfContacts.length)
throw new Error("No contacts to delete");
arrayOfContacts.forEach(function (contact) {
ContactsApp.deleteContact(contact);
});
}
// Our function that uses the above helper methods to do what we want.
function doSomething() {
// Define all email searches to be performed.
const emailFragmentsToSearchWith = [
"email1",
...
"emailN"
];
const matchingContacts = getContactsWithEmails(emailFragmentsToSearchWith);
if (matchingContacts.length) {
/** do something with the contacts that matched the search.
* someMethodThatSavesContacts(matchingContacts);
* someMethodThatModifiesContacts(matchingContacts);
* deleteContacts(matchingContacts);
* ...
*/
}
/** do other stuff that doesn't need those contacts. */
}
Google Calendar v3 GData API,如 this SO question, does support multiple query parameters 中所述。但是,没有与此 API 的简单集成 - 您将需要编写适当的 URL 请求并使用 UrlFetchApp
.
除了 Google 联系人 API,您还可以使用 Google People REST API, specifically the people.connections#list
端点。
这两个 API 都要求您将 Apps 脚本项目与启用了相应 API 的 Google 云项目相关联,并且可能需要您手动设置您的 Apps 脚本项目在其清单文件中需要的范围,以及为您向 API 端点发出的关联 HTTP 请求提供 OAuth2 授权。
参考资料