检查谷歌联系人下是否存在联系人"ContactsApp.getContact"



我对脚本一无所知,所以请记住这一点。:-(我希望我的脚本从谷歌表单中读取,并检查该联系人是否存在于谷歌联系人下,如果不创建联系人。联系人通过电子邮件进行检查;客户";。我无法获取if语句来确认联系人是否存在。如果我删除了用于检查联系人的If,它将为每个条目创建联系人,所以我认为该部分很好,但我需要修复如何检查联系人是否已经存在,这样它就不会创建重复的条目。

function addClinet() {
var ss = SpreadsheetApp.openById('XXXX');
var sheetNew = ss.getSheetByName('NewClient'); 
var Avals = sheetNew.getRange('B1:B').getValues();
var lastRow = Avals.filter(String).length;
for (var i = 2 ; i <= lastRow; i++){
var nameID = sheetNew.getRange(i, 2).getValue();
var emailID = sheetNew.getRange(i, 8).getValue();
var mobID = sheetNew.getRange(i, 9).getValue(); 
var firstName = nameID.split(' ').slice(0, -1).join(' ');
var lastName = nameID.split(' ').slice(-1).join(' ');
var regex = new RegExp (/^w/);
var firstChar = regex.exec(mobID);
var contacts = ContactsApp.getContact(emailID);
if (contacts == null){
if (firstChar == 8){
var mobID = 'xxx' + mobID;
}
var contact = ContactsApp.createContact(firstName,lastName, emailID);
var contacts = ContactsApp.getContact(emailID);
contact.addPhone(ContactsApp.Field.WORK_PHONE, mobID);
var group = ContactsApp.getContactGroup("Clients");
group.addContact(contact);
}
}
}

Thx

我不会使用ContactsApp.getContact([email])函数——不管出于什么原因,谷歌应用程序脚本通过电子邮件搜索联系人的速度非常慢。由于听起来你在任何给定的时间都有很多联系人在排序,我建议你使用相同的方法——而不是通过谷歌应用程序脚本搜索电子邮件地址(每次联系人大约需要16-20秒(

使用以下功能,您将能够为所有联系人创建一个大型JSON对象,并将其电子邮件地址作为密钥,这样您就可以快速测试联系人中是否存在电子邮件地址(对于大约5000个联系人,这大约需要11秒:

function emailsasJSON() {

var emailjson = {}
var myContacts = ContactsApp.getContactGroup('Clients').getContacts();
for (var i = 0; i < myContacts.length; i++) {
var emails = myContacts[i].getEmails();
var phonesobj = myContacts[i].getPhones();
var phones = {}
for (var j = 0; j < phonesobj.length; j++) {
phones[phonesobj[j].getPhoneNumber().replace(/[_)(s.-]/g,'')] = 1;
}
for (var j = 0; j < emails.length; j++) {
emailjson[emails[j].getAddress().toLowerCase()] = {id: myContacts[i].getId(), phones:  phones};

}
}
Logger.log(JSON.stringify(emailjson))
return emailjson;
}

使用emailjson对象,您可以更快地比较您的每个联系人——它将在大约10秒内创建它——我们稍后将使用它。

其次,我会清理你的代码中的一些内容——在我看来,你有一张表,上面的名字在B列,电子邮件在H列,手机号码在I列。

您不应该每个单元格单独收集所有这些值(需要很长时间(,而应该将整个数据集收集为一个数组,然后以这种方式进行处理:

function addClinet() {
var ss = SpreadsheetApp.openById('XXXX');
var sheetNew = ss.getSheetByName('NewClient'); 
var clientsgroup = ContactsApp.getContactGroup('Clients')
//this is where we will insert the function from above to get the emailjson obj
var emailjson = emailsasJSON()
var contactarray = sheetNew.getDataRange().getValues();
for (var i = 1 ; i < contactarray.length; i++){
var name = contactarray[i][1]
var email = contactarray[i][7]
var phone = contactarray[i][8]

if(emailjson[email.toLowerCase()].id) { //check if email exists
if(!emailjson[email.toLowerCase()]['phones'][phone.replace(/[_)(s.-]/g,'')]) { //if email exists but phone doesn't, add phone

ContactsApp.getContactById(emailjson[email.toLowerCase()].id).addPhone(ContactsApp.Field.MOBILE_PHONE, phone)
emailjson[email.toLowerCase()]['phones'][phone.replace(/[_)(s.-]/g,'')] = 1; //add it to the emailjson object in case there are more iterations of this contact in the sheet
} 
} else { //add new contact if it doesn't exist

var newcontact = ContactsApp.createContact(name.split(' ')[0],name.split(' ')[1], email)
newcontact.addPhone(ContactsApp.Field.MOBILE_PHONE, phone)
emailjson[email.toLowerCase()]['id'] = newcontact.getId();
emailjson[email.toLowerCase()]['phones'][phone.toString().replace(/[_)(s.-]/g,'')] = 1;
clientsgroup.addContact(newcontact)
}
}
}

我没有你的数据表来进行错误检查,但这应该会大大加快你的功能。如果它有任何错误,请告诉我,或者,如果你能给我一张示例表,我可以测试它

最后,我想这不是一个你不断更新的客户列表,所以我会把它们从这张表中删除,然后转移到其他地方,尽管列表上的大量联系人会让这个功能陷入困境。

最新更新