Проверьте, существует ли контакт в контактах Google с помощью "ContactsApp.getContact" - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в написании сценариев, так что имейте это в виду. :-) Я хочу, чтобы мой скрипт читал из таблицы Google и проверял, существует ли этот контакт в контактах Google, а если не создать его. Контакты проверяются по электронной почте и имеют ярлык «Клиент». Я не могу получить оператор 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);
   }
 }
}

Спасибо

1 Ответ

0 голосов
/ 06 августа 2020

Я бы не стал использовать функцию 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)
     }
  }
}

У меня нет вашей таблицы данных, чтобы проверить это на ошибки, но это должно значительно ускорить вашу работу. Сообщите мне, если он выдает какие-либо ошибки, или, если вы можете дать мне образец листа, я мог бы его протестировать.

Наконец, я полагаю, что это не список клиентов, который вы постоянно обновляете, поэтому я бы снимите их с этого листа и переместите в другое место, хотя для остановки этой функции потребуется значительное количество контактов в списке.

...