Comment garder vos numéros de téléphone de Google Contacts impeccablement organisés ?

Dans un monde connecté, gérer efficacement son répertoire téléphonique est devenu une nécessité quotidienne. Que vous soyez un professionnel cherchant à optimiser votre réseau ou simplement quelqu’un qui aime garder ses contacts personnels bien organisés, vous avez probablement déjà rencontré des numéros de téléphone formatés de manière inconsistante.

Aujourd’hui, je vais partager avec vous comment un script Google Apps Script peut transformer votre gestion de contacts en rendant tous vos numéros conformes à la norme française (+33 x xx xx xx xx), peu importe comment ils ont été initialement enregistrés.

L’importance d’une organisation cohérente

Avant de plonger dans le script, réfléchissons un instant à pourquoi cela est important. Un format uniforme pour les numéros de téléphone non seulement facilite la lecture et la recherche dans votre liste de contacts, mais peut aussi prévenir des erreurs lors de l’utilisation de services automatisés, comme l’envoi de SMS ou d’appels internationaux. En normalisant le format de vos numéros de téléphone, vous assurez une cohérence qui peut grandement simplifier votre communication.

Le script magique

Le script que je propose utilise Google Apps Script, un puissant outil permettant d’automatiser des actions au sein des applications Google. Pour notre cas, le script va parcourir tous vos contacts Google, vérifier le format de chaque numéro de téléphone, et le mettre à jour si nécessaire selon la norme française. Voici une vue d’ensemble de son fonctionnement :

  1. Reformatage des Numéros de Téléphone : Le script analyse chaque numéro, enlève les caractères non numériques, vérifie le format et, si le numéro est national (commençant par 0), il le reformate en ajoutant l’indicatif international français (+33), tout en restructurant le numéro pour une meilleure lisibilité.
  2. Mise à Jour sélective : Plutôt que de mettre à jour aveuglément tous les contacts, le script vérifie d’abord si une modification est nécessaire. Cette étape assure une utilisation minimale des ressources et évite les mises à jour inutiles.
  3. Backoff Exponentiel : Pour éviter de dépasser les quotas d’utilisation de l’API Google People, le script implémente une stratégie de backoff exponentiel, réessayant avec des intervalles de temps croissants en cas d’erreur liée au dépassement de quota.

Mise en place du script

Pour utiliser ce script, vous aurez besoin d’un compte Google et d’un accès à Google Apps Script. Créez un nouveau projet Apps Script depuis Google Drive ou Sheets, collez le code du script, et exécutez-le. Vous pourriez avoir à autoriser le script à accéder à vos contacts la première fois.

// Fonction pour reformater les numéros de téléphone selon la norme française
const reformaterNumeroTelephone = (numeroTelephone) => {
  if (!numeroTelephone) {
    return ''; // Retourne une chaîne vide si le numéro n'est pas défini
  }
  
  let numeroNettoye = numeroTelephone.replace(/\D/g, '');
  
  if (numeroNettoye.startsWith('33')) {
    numeroNettoye = `+${numeroNettoye}`;
  } else if (numeroNettoye.startsWith('0')) {
    numeroNettoye = `+33${numeroNettoye.substring(1)}`;
  }

  if (numeroNettoye.length === 12 && numeroNettoye.startsWith('+33')) {
    return numeroNettoye.replace(/^\+33(\d)(\d{2})(\d{2})(\d{2})(\d{2})$/, '+33 $1 $2 $3 $4 $5');
  }

  return numeroNettoye;
};

const mettreAJourNumerosDeTelephone = () => {
  backoffExponentiel(() => {
    let contacts = [];
    let jetonPage;
    
    do {
      const reponse = People.People.Connections.list('people/me', {
        pageSize: 100,
        personFields: 'names,phoneNumbers,metadata',
        pageToken: jetonPage,
      });

      if (reponse.connections) {
        contacts = contacts.concat(reponse.connections);
      }

      jetonPage = reponse.nextPageToken;
    } while (jetonPage);

    let compteurMisesAJour = 0;
    contacts.forEach(contact => {
      if (contact.phoneNumbers && contact.phoneNumbers.length > 0) {
        let miseAJourNecessaire = false;

        const numerosMisAJour = contact.phoneNumbers.map(numero => {
          const numeroOriginal = numero.value;

          if (numeroOriginal) {
            const numeroFormate = reformaterNumeroTelephone(numeroOriginal);

            if (numeroOriginal !== numeroFormate) {
              miseAJourNecessaire = true;
              return { value: numeroFormate, type: numero.type };
            }
          }

          return numero;
        });

        if (miseAJourNecessaire) {
          const requeteMiseAJour = {
            etag: contact.etag,
            phoneNumbers: numerosMisAJour
          };

          try {
            People.People.updateContact(requeteMiseAJour, contact.resourceName, {
              updatePersonFields: 'phoneNumbers'
            });
            Logger.log(`Contact mis à jour : ${(contact.names ? contact.names[0].displayName : 'Sans nom')}`);
            compteurMisesAJour++;

            // Attendre une seconde après chaque mise à jour pour éviter d'atteindre le quota
            Utilities.sleep(1000);

            // Si on atteint 50 mises à jour, faire une pause de 30 secondes pour ne pas dépasser le quota
            if (compteurMisesAJour >= 50) {
              Logger.log('Pause de 30 secondes pour éviter de dépasser le quota...');
              Utilities.sleep(30000); // Pause de 30 secondes
              compteurMisesAJour = 0;
            }
          } catch (erreur) {
            Logger.log(`Erreur lors de la mise à jour du contact : ${erreur.message}`);
          }
        }
      }
    });
  });
};

const backoffExponentiel = (fonctionAppel) => {
  const tentativesMax = 5;
  let tentative = 0;

  while (tentative < tentativesMax) {
    try {
      fonctionAppel();
      break; // Si l'appel réussit, sortir de la boucle
    } catch (erreur) {
      if (erreur.toString().includes("Quota exceeded")) {
        if (tentative === tentativesMax - 1) {
          Logger.log(`Tentative finale, échec après ${tentativesMax} tentatives. Attendre plus longtemps.`);
          Utilities.sleep(10000); // Attendre plus longtemps avant la dernière tentative
        } else {
          const delai = Math.pow(2, tentative) * 1000; // Délai exponentiel
          Utilities.sleep(delai);
        }
        tentative++;
      } else {
        Logger.log(`Erreur non liée au quota : ${erreur.message}`);
        break;
      }
    }
  }

  if (tentative === tentativesMax) {
    Logger.log(`La mise à jour des contacts a échoué après ${tentativesMax} tentatives.`);
  }
};

Automatiser la gestion de vos contacts peut vous faire économiser du temps et des efforts considérables. Ce script est un exemple de comment un peu de code peut apporter une grande valeur à vos routines quotidiennes. Si vous avez des centaines, voire des milliers de contacts, ce script Google Apps Script est la solution parfaite pour assurer que tous vos numéros de téléphone sont non seulement uniformes mais aussi conformes aux standards internationaux.

Je vous propose dans un autre article de gérer les noms et prénoms de vos contacts dans Google Contacts.