lundi 23 avril 2012

Google Spreadsheet script Class Contacts

2 commentaires
Je ne vais pas détailler toute la classe Contact mais donner quelques astuces qui m'ont manquées quand j'ai voulu l'utiliser. Cela s'adresse à des personnes comme moi qui savent faire des scripts mais ne sont pas des purs développeur.
La class Contacts permet à partir d'un Google Script de récupérer, ajouter et modifier des données dans ses contacts google.

Trouver des ressources
Il faut faire ses recherches en Anglais sur Google car il y a beaucoup plus d'informations dans cette langue qu'en Français.
Dans les tutoriaux il y a un exemple qui montre l'utilisation de la class contacts() mais il utilise des fonctions non maintenues, pas top. Cf. Créer site football
Vous pouvez aussi tenter dans la galerie des scripts et voir si une personne a publié un script sur ce que vous avez besoin. Ne cherchez pas une fonction mais plutôt un besoin. Exemple pour les contacts rechercher "retrieve contacts information" plus générique.

Récupérer le téléphone d'un contact
En premier il faut aller chercher le contact on peut faire cela de plusieurs manière, par nom, par prénom, par email, etc...
Si on veut récupérer les contacts d'un groupe.
Il y a la fonction getContactsByGroup(group ) Cette fonction accepte en entrée un ContactGroup et renvoie en sortie un élément Contact[].
En fait on ne peut pas directement mettre le nom du groupe dans cette fonction on doit passer par getContactGroup(name), celle ci accepte une string en entrée et renvoie en sortie un ContactGroup (ce dont on a besoin).
Ca fait donc
var LeGroupe =  getContactGroup("Mon Groupe");
var contacts =  getContactsByGroup(LeGroupe);

Maintenant pour récupérer un téléphone par exemple le téléphone mobile, il faut aller chercher l'information dans l'élément contacts.
Ce qu'il faut faire :
var phone = contacts[i].getPhones(ContactsApp.Field.MOBILE_PHONE);
var mobile = phone[0].getPhoneNumber();
La fonction getPhones() accepte un objet en entrée et pour cela il faut aller chercher l'objet qui représente le téléphone mobile dans cette page. Le téléphone mobile est "MOBILE_PHONE" ce qui devient ContactsApp.Field.MOBILE_PHONE pour la fonction.
La fonction getPhones renvoie un PhoneField, je pensais au début que c'était directement le téléphone mais en fait non, c'est un tableau donc c'est pour cela que l'on doit mettre phone[0].getPhoneNumber() ce n'est pas très logique car on a limité la recherche à un seul téléphone mais c'est comme cela.

J'ai mis contacts[i] car on a plusieurs contacts dans le groupe et donc il faut parcourir tout le tableau. Si on fait une recherche de type getContactsByEmailAddress(email) on aura aussi en retour un tableau donc il faudrait aussi passer par contacts[i], si on est sur que l'on aura un seul contact on peut faire contacts[0]. C'est ce que j'ai fait pour la variable phone.

Trouver un contact par date
Je fais cet exemple car je me suis bien pris la tête. Pour rechercher un contact par date on peut utiliser cette fonction getContactsByDate(month, day, label). Day est un integer ça c'est facile par contre month doit être une variable ENUM de type Month (cf. cet page). Donc Janvier = JANUARY mais il faut l'écrire ContactsApp.Month.JANUARY. Le souci que j'ai eu est si on veut calculer le mois de la date du jour j'ai essayé pas mal de truc et voici ce qui marche il faut faire un switch/case, num est le numéro du mois :
function findMonth(num)
{
  var month;
  switch (num)
  {
    case 1:
      month = ContactsApp.Month.JANUARY;
      break;
    case 2:
      month = ContactsApp.Month.FEBRUARY;
      break;
    case 3:
      month = ContactsApp.Month.MARCH;
      break;
    case 4:
      month = ContactsApp.Month.APRIL;
      break;
    case 5:
      month = ContactsApp.Month.MAY;
      break;
    case 6:
      month = ContactsApp.Month.JUNE;
      break;
    case 7:
      month = ContactsApp.Month.JULY;
      break;
    case 8:
      month = ContactsApp.Month.AUGUST;
      break;
    case 9:
      month = ContactsApp.Month.SEPTEMBER;
      break;
    case 10:
      month = ContactsApp.Month.OCTOBER;
      break;
    case 11:
      month = ContactsApp.Month.NOVEMBER;
      break;
    default:
      month = ContactsApp.Month.DECEMBER;
      break;
    }
  return (month);
}
Pour le label c'est comme dans la partie précédente il faut utiliser les labels que l'on trouve dans la section field et par exemple pour l'anniversaire c'est BIRTHDAY qui deviendra ContactsApp.Field.BIRTHDAY. Dans la doc il est dit que pour label on peut utiliser une string mais franchement ça n'a jamais vraiment bien marché pour les champs de base de la fiche contact, c'est pour cela qu'il vaut mieux utiliser les champs fournis dans Field. Pour les champs custom peut être que ça fonctionnera mieux ...
Exemple de code :
var contact = ContactsApp.getContactsByDate(findMonth(5),13,ContactsApp.Field.BIRTHDAY);
 Remplacer 5 et 13 par les variables que vous calculez dans votre code.

2 Responses so far

  1. Difficile d'utiliser "Contacts" la doc est on ne peut plus succincte... Galère !
    Pour le mois j'utilise une autre solution plus "compacte".
    dateArray = contacts[i].getDates(ContactsApp.Field.BIRTHDAY);
    var moisArray = ["0", "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"];
    month = moisArray.indexOf(dateArray[j].getMonth().toString());

  2. st3ph says:

    Merci de cette astuce, c'est vrai que cette class n'est pas très documentée.

Leave a Reply