Comment créer les stamp <refer on=… what=… /> à ajouter sur PortaBilling

Created on 2009-10-05 by Nicolas Jorand

Switzernet

 

 

 

Le but est d’ajouter le stamp <refer on=… what=… /> sur PortaBilling aux clients qui ont parrainés un numéro. Au préalable il faut récupérer les e-mails http://switzernet.com/public/090818-export-outlook-thunderbird-headers-to-excel/. Il faut ensuite mettre les informations recueillies au bon format. Avec celles-ci on va rechercher les clients qui sont enregistrés sur PortaBilling à l’aide d’une requête SQL qu’on aura généré. Et enfin, comparer les informations extraites des e-mails avec celles obtenues avec la requête SQL et pour finir créer le stamp.

 

 

 

Fonctions Excel utilisées

Requête SQL

Création des stamp

 

 

 

[fonctions_excel] Fonction Excel utilisées

 

Les fonctions Excel sont utilisées notamment pour créer la requête SQL, comparer deux listes de clients et créer le stamp. Pour ceci, il est nécessaire de combiner plusieurs de ces fonctions. Voici la description de chacune d’elles.

 

Concatenate

Description : cette fonction permet d’assemble plusieurs morceaux de texte en un seul

Syntaxe : Concatenate(texte1,texte2,texte3,…)

Paramètres : on donne en paramètre toutes les parties de texte que l’on souhaite assembler et on les sépare par une virgule

 

Exemple :

 

 

Mid

Description : cette fonction permet de sélectionner une partie d’un texte

Syntaxe : Mid(texte,position départ,nombre caractères)

Paramètres : on donne le texte dans lequel on veut récupérer une partie seulement, puis on donne le numéro du caractère à partir duquel on veut commencer à sélectionner le texte et enfin le nombre de caractères que l’on veut avoir

 

Exemple :

 

 

If

Description : cette fonction permet de choisir entre deux valeurs suivant si la condition donnée en paramètre est vraie ou fausse

Syntaxe : If(condition,valeur si vrai,valeur si faux)

Paramètres : on entre la condition  ainsi que les valeurs à retourner si elle est remplie ou non

 

Exemple :

 

 

And

Description : cette fonction retourne TRUE si toutes les conditions sont remplies et FALSE si une ou plusieurs de ces conditions ne sont pas remplies

Syntaxe : And(condition1,condition2,condition3,…)

Paramètres : on donne toutes les conditions que l’on doit tester

 

Exemple :

 

 

IsNA

Description : cette fonction test s’il y la valeur en paramètre est invalide (#N/A) et dans ce cas elle retourne TRUE. Si la valeur est valide, elle retourne FALSE

Syntaxe : Isna(valeur)

Paramètres : on entre la valeur que l’on désir tester

 

Exemple :

 

 

VLookup

Description : cette fonction permet de rechercher une valeur dans un tableau. Si celle-ci est trouvée, la fonction retourne la valeur de la case se trouvant sur la même ligne que la valeur trouvée dans le tableau et à la colonne entrée en paramètre. Attention, le tableau de recherche doit être trié dans le sens ascendant !!!

Syntaxe : Vlookup(valeur,tableau,colonne,valeur pas exacte)

Paramètres : on entre la valeur à rechercher ainsi que le tableau dans lequel elle est recherchée. Il faut aussi donner l’index de colonne dans le tableau de la valeur à retourner et enfin si on recherche la valeur exacte (mettre FALSE) ou une valeur approximative

 

Exemple :

 

 

Text

Description : cette fonction retourne un texte contenant la valeur entrée dans un format que l’on a spécifié

Syntaxe : Text(valeur,format)

Paramètres : on donne la valeur que l’on veut mettre dans le format également entré en paramètre

 

Exemple :

 

 

Hyperlink

Description : cette fonction créer un lien avec un document ou une adresse d’un site web

Syntaxe : Hyperlink(chemin ou Url,nom)

Paramètres : on entre soit le chemin du document ou l’adresse du site web (Url) ainsi que le nom sous lequel on veut le lien

 

Exemple :

 

 

Cellule<>""

Description : test si la case contient quelque chose ou si elle est vide

Exemple :

 

 

 

Symbole $

Description : sert à bloquer une cellule dont les informations sont utilisées dans une formule.

Exemple :

Quand on écrit une formule en prenant une valeur contenue dans une autre cellule, par exemple en B1 on met =A1, et que l’on copie vers le bas, on aura en B2 la formule =A2 (en B3, =A3 etc).

 

Si on copie vers la droite, on aura en =B1 en C1 (=C1 en D1 etc).

 

On peut ajouter le $ de trois manières différentes :

-          $A$1, on garde toujours la valeur de la même cellule quelque soit le sens de la copie

-          $A1, on garde la colonne uniquement

-          A$1 on garde la ligne uniquement

 

 

 

[requete] Requête SQL

 

Pour rappel le fichier Excel contenant les informations récupérées des e-mails était le suivant :

 

 

 

Il faut maintenant récupérer le numéro de téléphone du Subject et le mettre au format 412x5xxxxxx, ainsi que mettre la date au format yymmdd (dans le cas où celle-ci serait dans un autre format).

 

La description de chaque fonction Excel qui sont utilisées par la suite est dans la partie Fonction Excel utilisées. Commencez par sauvegarder ce fichier sous un autre nom (File->Save As) et choisissez l’extension CSV :

 

 

Mettre la date au format yymmdd

Pour mettre la date dans le format voulu, il faut sélectionner la colonne entière puis clique droite->Format Cell. Dans l’onglet Number, allez dans Custom et taper le format de la date désiré puis Ok :

 

                     

 

 

Récupérer et mettre le numéro au format 412x5xxxxxx

Il serait trop compliqué d’utiliser Excel pour faire cette opération, car il y a trop de différentes syntaxes pour le sujet de l’e-mail. Nous allons donc utiliser un script en Perl :

#!/usr/bin/perl

use strict;

my ($ligne);

open FILE,"<fichier.csv";

while ($ligne=<FILE>) {

     if($ligne =~ /^.*0(\d{2})-(\d{3})-(\d{4}).*,(.*),(.*)/) {

           print "41$1$2$3,$4,$5\n";

     }

}

close FILE;

 

#!/usr/bin/perl : permet de spécifier l'emplacement de l'interpréteur Perl sur le système

use strict : indique que toutes les variables qui vont être utilisées dans le script doivent être déclarées

my (…) : permet de déclarer des variables locales

 

Ensuite, on ouvre le fichier CSV qui contient les informations récupérées des e-mails et pour chaque ligne on prend le numéro de téléphone du sujet (Subject), ainsi que l’e-mail (ToAddress) et la date (Received).

Ceci se fait à l’aide de la regex : /^.*0(\d{2})-(\d{3})-(\d{4}).*,(.*),(.*)/ (le \d filtre les chiffres et le .* indique n’importe quoi). On regarde que la ligne commence par n’importe quoi, mais suivit d’un 0 (/^.*0). On va ensuite prendre les numéros qui suivent : l’indicatif 2x (\d{2}), le 5xx (\d{3}) et les quatre derniers chiffres xxxx (\d{4}). On va aussi prendre l’email et la date (,(.*),(.*))

Chacune de ces lignes "filtrées" est affichée (print … ). Elles ont l’allure suivante : 412x5xxxxxx,email,date.

 

Copiez ce script dans un document texte (extension .txt), sauvegardez et fermez le document. Changez maintenant l’extension en .pl au lieu de .txt. Pour exécuter ce script, on utilise Cygwin. Démarrez ce logiciel et faites la commande suivante : cd (pour ouvrir un répertoire) et glissez le dossier contenant le script

 

La commande suivante va exécuter le script :

./script.pl > sortie.csv

 

 

Au lieu d’afficher le résultat du script à l’écran (print), celui-ci sera écrit dans le fichier sortie.csv

 

Le fichier CSV obtenu est le suivant :

 

Il se peut que certains e-mails récupérés soient à double, car dans deux dossiers différents. Pour les repérer plus facilement, on peut les trier par numéro et dans la cellule à côté de la date on peut mettre la formule suivante pour mettre en évidence les doublons :

=IF(Aj<>"",IF(AND(OR(Aj=Ai,Aj=Ak),OR(Bj=Bi,Bj=Bk)),1,""),"")

i, j et k sont des numéros de ligne

 

Toutes les lignes qui sont précédées ou suivies d’une ligne identique sont marquées avec la valeur "1" :

 

 

Création de la requête SQL

Nous ne pouvons pas récupérer les informations de tous les clients en une seule requête, car celle-ci prend trop de temps et de ressource. Nous faisons donc 1 requête par tranche de 100 clients.

 

Tout d’abord, on commence par créer la partie de la requête SQL qui concerne une seule ligne (donc un seul client).

 

Nous utilisons la formule suivante :

=IF(AND(A2<>"",B2<>""),CONCATENATE(IF(LEFT(A1,2)<>"41","and ("," or "),"((c.email='",B2,"' or c.cont2='",B2,"') and a.id like '%",A2,"%' )"),"")

j est le numéro de la ligne

 

La seule différence est que pour le premier le début de la requête commence par un and (voir dans le CONCATENATE) et que pour les autres on a un espace suivit d’un or. On voit que les fonctions IF, AND, cellule<>"" et CONCATENATE sont utilisées.

 

Voici ce que l’on obtient :

 

Comme vu précédemment, il faut faire une requête pour un nombre maximum de 100 clients. Nous pouvons donc regrouper ces parties par tranche de 100 clients. Pour ceci, commencez par ajouter une ligne vide tous les 100 clients. Ensuite on applique la formule suivante :

=IF(D2<>"",IF(LEFT(D2,3)="and",D2,CONCATENATE(F1,D2)),"")

 

Voici ce que l’on obtient :

 

On peut amélioré la visibilité en rajoutant un peu de couleur, sélectionner la colonne entière puis clique droit->Format Cells->Onglet Patterns :

 

Vous pouvez prendre le fichier Excel contenant déjà les formules sur [xls].

 

 

Nous allons faire six requêtes différentes afin de traiter le cas des clients qui ont plusieurs numéros. Avec ces six requêtes, nous traitons les clients ayant jusqu’à 5 numéros (c’est le maximum observé jusqu’au 30-09-2009).

 

Voici les différents débuts de requêtes SQL, on va récupérer le numéro de client (i_customer), le nom (name) et les adresses e-mails du parrain (email et cont2) et le numéro de téléphone (id) ainsi que la date dans le stamp order du parrainé (order) :

Cas où le client n’a qu’un seul numéro :

select c.i_customer, c.name, c.email, c.cont2, right(a.id,11), mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} />"

 

 

Cas où le client a plusieurs numéros, 1er numéro :

select c.i_customer, c.name, c.email, c.cont2, mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,23,11) as "id", mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} what="

 

2ème numéro :

select c.i_customer, c.name, c.email, c.cont2, mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,23,11) as "id", mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what="

 

3ème numéro (si existant) :

select c.i_customer, c.name, c.email, c.cont2, mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,23,11) as "id", mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what="

 

4ème numéro (si existant) :

select c.i_customer, c.name, c.email, c.cont2, mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,23,11) as "id", mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what="

 

5ème numéro (si existant) :

select c.i_customer, c.name, c.email, c.cont2, mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,23,11) as "id", mid(if(@pos:=locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad,locate(concat("<",@stamp1," "),cnp.notepad)+1)+1)+1)+1),@stampfull:=mid(cnp.notepad,@pos,locate(" />",cnp.notepad,@pos)-@pos+3),@stampfull:="") ,11,6) as "order" from Customers c, Customer_Notepad cnp, Accounts a where a.i_customer=cnp.i_customer and c.i_rep>2 and cnp.notepad regexp "<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what=.*<order on=0[8-9]{1}[0-9]{4} what="

 

 

et pour la fin :

) into outfile '/Chemin.../.../nom_fichier.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

il faut spécifier le chemin ainsi que le nom que vous voulez donner au fichier CSV de sortie.

 

 On aura un fichier CSV par requête. De plus, il est conseillé de trier les résultats obtenu dans différents dossier suivant le début de la requête (début1->dossier1, début2->dossier2, …). De même pour le nom du fichier CSV, choisissez le même pour toutes les requêtes ayant le même début (début1_part1, début1_part2, … , début2_part1, …)

 

Client de 1 à 100 :

) into outfile '/Chemin.../.../nom_fichier1.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

 

De 101 à 200 :

) into outfile '/Chemin.../.../nom_fichier2.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

 

Etc…

On peut calculer le nombre total de requêtes que nous avons besoin d’après la formule suivante :           

 

Il ne reste plus qu’à assembler le tout : début, partie(s) client(s) et fin. Pour ceci créez un nouveau fichier .txt. et comme première ligne écrivez : set @stamp1="order"; Ensuite copiez le début de la première requête, ajoutez les parties concernant les 100 premiers clients (donc celle juste avant la ligne vide qui sépare deux tranches de 100 clients) et la fin. Répétez cette opération, mais en prenant la partie concernant les 100 clients suivants et ainsi de suite. Une fois finie, changez l’extension en .sql au lieu de .txt. Ceci permet d’interpréter le contenu du fichier comme étant du code SQL.

 

Maintenant il faut faire de même avec les cinq autres débuts de requête.

 

Exécution et récupération du résultat de la requête SQL

Il faut commencer par copiez les six fichier .sql sur PortaBilling Slave. Connectez vous à celui-ci avec PuTTY. Si vous souhaitez stocker les résultats des différentes requêtes dans des dossiers séparés, utilisez les deux commandes ci-dessous :

mkdir nom_dossier     - pour créer le dossier

 

et

 

chmod 777 nom_dossier     - pour donner tous les droits

 

Démarrez Cygwin, tapez la commande cd et glissez-y le dossier contenant les requêtes SQL, puis appuyez sur Enter. Pour copier les requêtes, exécutez la commande suivante :

scp fichier_requete.sql nom_utilisateur@serveur:/Chemin/.../...

 

On peut maintenant exécuter les requêtes. Pour ceci, connecter vous à la base de donnée MySQL dans PuTTY et exécuter la commande suivante pour chacune des requêtes. Le résultat se trouve dans le fichier CSV à l’endroit que vous avez spécifié dans le fichier.sql :

source /Chemin/.../fichier_requete.sql

 

Une fois toutes les requêtes exécutées, il faut récupérer les résultats (les fichiers CSV). Utiliser à nouveau Cygwin, vous pouvez ouvrir le dossier de réception (cd + glisser le dossier). La commande est la suivante :

scp nom_utilisateur@serveur:/Chemin/.../resultat.csv copie_resultat.csv

 

Si vous avez créer un ou des dossier(s) qui contient uniquement les résultats des requêtes, vous pouvez récupérer tous les fichiers CSV en une seule fois avec la commande :

scp nom_utilisateur@serveur:/Chemin/.../dossier_resultat/* dossier_reception

 

Il faut, maintenant regrouper tous les fichiers CSV en un seul. Mettez-les tous dans le même dossier, puis ouvrez celui-ci dans Cygwin (cd + glisser le dossier). Ne mettez rien d’autre dans ce dossier, uniquement les résultats des requêtes. La commande suivant permet de créer un fichier CSV qui va contenir tous les résultats :

cat * > sortie.csv

 

Nous obtenons le fichier suivant :

 

 

Il est tout à fait normal qu’il y ait moins de clients récupérés avec la requête SQL qu’avec les e-mails

 

 

[stamp] Création des stamp

 

Il nous faut créer un stamp pour chacun des clients récupérés avec la requête SQL. Nous avons besoin de combiner les informations des deux fichiers Excel vu ci-dessus (celui avec les informations récupérées des e-mails après avoir appliqué le script Perl et celui avec les informations récupérées par requêtes SQL). Pour être bien sûr de combiner les bonnes données ensemble, il faut concaténer l’e-mail et le numéro de téléphone et ceci pour les deux fichiers Excel. Pour ceci utiliser la formule suivante :

=IF(Aj<>"",CONCATENATE(Bj,Aj),"")

j est le numéro de la ligne

 

On aura donc :

 

Ouvrez un nouveau fichier Excel et commencez par y copier les colonnes i_customer, nom, mail1 et mail2 (concaténées avec le téléphone), le tel et enfin la date du fichier obtenu avec les requêtes SQL. Copiez ensuite l’e-mail concaténé avec le téléphone (ToAdrress+tel) et la date (Received) du fichier obtenu avec les e-mails envoyé au parrain. Vous devez avoir :

 

 

Nous allons maintenant rechercher la date (Received) en comparant les e-mails qui sont dans mail1 et mail2 avec ceux dans ToAddress+tel à l’aide des formules suivantes (une en prenant mail1 et l’autre avec mail2) :

=IF(Cj<>"",IF(ISNA(VLOOKUP(Cj,H:I,2,FALSE)),"",VLOOKUP(Cj,H:I,2,FALSE)),"")

 

et

 

=IF(Dj<>"",IF(ISNA(VLOOKUP(Dj,H:I,2,FALSE)),"",VLOOKUP(Dj,H:I,2,FALSE)),"")

 

On va mettre les dates trouvées dans une troisième colonne avec la formule :

=IF(Kj<>"",Kj,Lj)

 

On a donc :

 

Il faut vérifier qu’il n’y a pas d’erreur. Pour ceci on va commencer par regarder si la date d’envoi de l’e-mail au parrain n’est pas antérieure à celle du stamp order. On peut faire ce test avec la formule, si c’est le cas on marque avec un "1" :

=IF(Mj<>"",IF(Mj>=Fj,"",1),1)

 

Voici un exemple :

 

Dans un cas comme ça, il faut regarder dans Thunderbird->contracts quand l’e-mail de commande a été envoyé au parrainé (expéditeur Demand…) et comparer la date avec celle de l’e-mail contenant [refer… dans le sujet si les noms correspondent. On peut les retrouver en filtrant avec le numéro de téléphone. A l’aide des informations contenues dans les deux e-mails, trouvez la paire parrain-parrainé qui est correcte et modifiez en conséquent les données dans le fichier Excel.

 

Ensuite, on doit vérifier les lignes quand la différence entre la date d’envoi de l’e-mail au parrain et celle du stamp order est de plus de 3 mois. Voici la formule qui met ces cas en évidence :

=IF(Mj<>"",IF((Mj-Fj>300),1,""),"")

 

Voici un exemple :

 

Il faut également aller dans Thunderbird pour voir si la paire parrain-parrainé est correcte et modifier les données dans Excel si ce n’est pas le cas.

 

Une fois que tout est bon, on va prendre les données qui vont nous être utiles pour la création et l’ajout des stamps. Ces données sont les suivantes : i_customer du parrain, date du stamp order, numéro de téléphone du parrainé et le nom du parrain. Voici les formules utilisées :

i_customer :

=IF(Aj<>"",Aj,"")

 

date :

=IF(Rj<>"",Fj,"")

 

tel :

=IF(Sj<>"",Ej,"")

 

nom :

=IF(Tj<>"",Bj,"")

 

On a donc :

 

 

On peut maintenant créer le stamp à ajouter, ainsi que le lien vers la page PortaBilling du client à l’aide des formules suivantes :

stamp :

=IF(AND(Sj<>"",Tj<>""),CONCATENATE("<refer on=0",Sj," to=",Tj," />"),"")

 

page web :

=IF(V2<>"","http://unappel.ch/public/090831-link-stamp-order/?i_customer="&R2,"")

 

On obtient ceci :

 

 

On peut également ajouter de la couleur pour améliorer la lisibilité :

 

Vous pouvez prendre le fichier Excel contenant déjà les formules sur [xls]

 

 

Il reste encore à supprimer les éventuels cas où il y a plusieurs fois le même stamp. Pour ceci, copiez les colonnes Nom (final), Stamp et Page Web dans un nouveau fichier Excel. Triez ces trois colonnes en prenant les stamps comme référence (sélectionnez les trois colonnes puis aller dans l’onglet Data->Sort, choisissez Sort by : Stamp et Descending :

 

Ajoutez la formule suivante pour mettre en évidence les cas de stamps à double :

=IF(Aj<>"",IF(OR(AND(Aj<>Ai,Bj=Bi),AND(Aj<>Ak,Bj=Bk)),1,""),"")

 

Voici ce que l’on obtient :

 

Dans ces cas, il faut rechercher dans Thunderbird à qui l’e-mail contenant [refer dans le sujet a été envoyé. Au besoin, aidez vous de PortaBilling. Quand vous avez trouvé le bon parrain supprimez la ou les lignes qui sont fausses.

 

Une fois toutes les lignes erronées supprimées, vous pouvez créer le lien cliquable vers la page PortaBilling du parrain. Utilisez la formule suivante :

=IF(Cj<>"",HYPERLINK(Cj,"stamp"),"")

 

On a :

 

Vous pouvez prendre le fichier Excel contenant déjà les formules sur [xls]

 

 

 

*   *   *