Я бы не стал использовать функцию ContactsApp.getContact([email])
- по какой-то причине поиск контактов в Google Apps Script по электронной почте мучительно медленный. Поскольку похоже, что у вас есть несколько контактов, которые вы просматриваете в любой момент времени, я бы рекомендовал вам использовать то же самое - вместо поиска адреса электронной почты с помощью скрипта Google Apps (это занимает около 16-20 секунд НА КАЖДЫЙ КОНТАКТ )
Используя следующую функцию, вы сможете создать один большой JSON объект для всех ваших контактов с их адресами электронной почты в качестве ключа, чтобы вы могли быстро проверить, присутствует ли адрес электронной почты в ваших контактах. (это занимает около 11 секунд для около 5000 контактов:
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;
}
Используя объект электронной почты json, вы можете сравнивать каждый из своих контактов НАМНОГО быстрее - он создаст это примерно за 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)
}
}
}
У меня нет вашей таблицы данных, чтобы проверить это на ошибки, но это должно значительно ускорить вашу работу. Сообщите мне, если он выдает какие-либо ошибки, или, если вы можете дать мне образец листа, я мог бы его протестировать.
Наконец, я полагаю, что это не список клиентов, который вы постоянно обновляете, поэтому я бы снимите их с этого листа и переместите в другое место, хотя для остановки этой функции потребуется значительное количество контактов в списке.