Cas particulier des champs calculés. Révolution Informatique Rich Mail Merge
Révolution Informatique – Rich Mail Merge – guide développeur
•
Les déclencheurs peuvent s'ajouter les uns aux autres :
Dans cet exemple, l'envoi se fera à chaque validation du formulaire et chaque lundi de 2 à 3 heures et chaque Jeudi de 22 à 23 heures.
Cas particulier des champs calculés
La gestion des champs calculés nécessite 3 manipulations complémentaires :
1.
Après avoir inséré la première ligne de données, retournez dans votre feuille de calcul pour y ajouter les formules. Ex : sur la copie d'écran du paragraphe 3 la formule est dans la cellule M3 contient la formule =Round(E3;2)
2.
Cette formule doit ensuite être répliquée à chaque insertion d'un nouvel enregistrement. La fonction rangeCopy() est prévue, à cet effet, dans le script. Ajoutez un déclencheur :
Run rangeCopy() From Spreadsheet On form submit
3.
A ce jour vous devez modifier le code de la fonction pour indiquer la/les cellules qui doivent être répliquées.
function rangeCopy () {
// based on (basé sur) google apps script / spreadsheet services documentation
// http://code.google.com/intl/fr/googleapps/appsscript/service_spreadsheet.html
// Copy a range of cells.
Les livres blancs 2010 - Patrick Oliviero page 21/27
Révolution Informatique – Rich Mail Merge – guide développeur
// Should be used by a 'on update' trigger to add content regardless of the form
// By example for adding formatted fields
// Copie une sélection de cellules.
// Pour utilisation par un déclencheur on update pour ajouter du contenu indépendamment du formulaire
// Exemples d'utilisation ajout de champs formatés var ss = SpreadsheetApp .
getActiveSpreadsheet (); var dataSheet = ss .
getSheets ()[ 0 ];
var rangeToCopy = dataSheet .
getRange ( "M2" );
La ligne ci-dessus est la source elle contient la formule à copier. Si vous avez plusieurs champs calculés le plus simple est de les mettre dans des colonnes consécutives et d'indiquer la zone à copier. Ex dataSheet.getRange("M2:V10");
var targetRow = dataSheet .
getLastRow ();
var target = dataSheet .
getRange ( "M" +( targetRow + 1 ));
Il faut également modifier la zone cible : ex dataSheet.getRange("M"+(targetRow+1)+":V"+
(targetRow+1));
rangeToCopy .
copyTo ( target ); return 1
}
NB : Dans une prochaine version un mécanisme sera prévu pour éliminer cette modification de code.
Les livres blancs 2010 - Patrick Oliviero page 22/27
Révolution Informatique – Rich Mail Merge – guide développeur
7 Analyse du code
Je ne reprendrais pas ici intégralement le tutorial de Google que vous pouvez retrouver à l'adresse http://code.google.com/intl/fr-FR/googleapps/appsscript/articles/mail_merge.html
mais je m'attacherais aux améliorations apportées par notre script Rich Mail Merge.
La modification de la fonction sendEmails porte sur les lignes suivantes :
26 var rmmVersion = getRmmVersion ( dataSheet ); lit la version du script attendue par la feuille de calcul. Elle sera utilisée dans la suite du script pour assurer une compatibilité ascendante
Nous préparons ensuite la lecture du modèle selon la version :
En version1.0 les paramètres sont en dur (les utilisateur devaient donc modifier ce code) et les données commencent sur la ligne 2.
En version 2.0 les paramètres sont lus dans la feuille de calcul, les données commencent sur la ligne 3. if ( rmmVersion == "v1.0" ) {
//deprecated version 1.0 headers are on the first row
// version 1.0 dépréciée les entêtes sont sur la première ligne var domainName = 'revolution-informatique.fr' ; // uddate with yourDomain.com - mettre à jour avec votreDommaine.fr
var siteName = 'revolution-informatique-script' ; // update with yourSite.com - mettre à jour avec votreSite.fr
var pageName = '/newsletters/n201102' ; // update with yourPage name - mettre à jour avec votre page var emailSubject = "Lettre information Révolution Informatique" ; //update with your Subject - mettre à jour avec votre sujet var language = "fr" //update with your language code - mettre à jour avec votre code langage
// contacts list starts at the 2nd row
// la liste des contacts commence sur la 2eme ligne var dataRange = dataSheet .
getRange ( 2 , 1 , dataSheet .
getLastRow (), dataSheet .
getLastColumn ());
} else {
// version 2.0 - 2 rows for headers
// on the 1st row are headers inherited from the form, versionning and parameters headers
// on the 2nd are fiels names (whitch are now independant from colums names) & parameters values
// version 2.0 - 2 lignes d'entête
// La 1ere ligne contient les noms de colonnes hérités du formulaire, le n° de version et les noms de paramètres
Les livres blancs 2010 - Patrick Oliviero page 23/27
Révolution Informatique – Rich Mail Merge – guide développeur
// la 2eme ligne contient les nom de champs (maintenant indépendants des noms de colonnes) et les valeurs des paramètres
// Read parameters from dataSheet
// lecture des paramètres à partir de la feuille de calcul var dataRange = dataSheet .
getRange ( 2 , 1 , 2 , dataSheet .
getLastColumn ());
// Create one JavaScript object from the row of data
// Crée un objet Javascript à partir des données de la ligne objects = getRowsData ( dataSheet , dataRange ); var data = objects [ 0 ]; var domainName = data [ "domainName" ]; var siteName = data [ "siteName" ]; var pageName = data [ "pageName" ]; var emailSubject = data [ "emailSubject" ]; var language = data [ "language" ];
// contacts list starts at the 3rd row
// la liste des contacts commence à la 3eme ligne var dataRange = dataSheet .
getRange ( 3 , 1 , dataSheet .
getLastRow (), dataSheet .
getLastColumn ());
}
N ous exécutons ensuite la fonction readPage qui lit le modèle
24 var emailTemplate = readPage ( domainName , siteName , pageName );
Cette fonction commence par instancier un objet site à partir du nom de domaine et du nom du site. Puis instancie la page correspondant au modèle, recupère le code HTML (du corps seulement !), corrige les caractères spéciaux dans les hyperliens et renvoi le texte corrigé.
function readPage ( domainName , siteName , pageName ) {
// based on (basé sur) google apps script / site services documentation http://code.google.com/intl/fr-FR/googleapps/appsscript/service_sites.html
// return the HTML page content of domainName,siteName,pageName
// renvoie le code HTML du contenu de la page domainName,siteName,pageName (nom de domaine, nom de site, nom de page) var site = SitesApp .
getSite ( domainName , siteName ) var page = site .
getChildByName ( pageName ); var content = page .
getHtmlContent (); content = hyperlinksCorrect ( content ) ; // corrige les hyperliens - hyperlinks correction return content ;
}
Les livres blancs 2010 - Patrick Oliviero page 24/27
Révolution Informatique – Rich Mail Merge – guide développeur
Le script effectue ensuite le remplacement des variables par leurs valeurs :
//met à jour les variables emailTemplate = fillInTemplateVariables ( emailTemplate , language );
// Remplace les variables u modèle par les valeurs correspondantes
// Paramètres :
// - template: chaine contenant les variables, ex %{vName"}
// variables supportées :
// %{"jj"}, %{"mm"}, %{"aa"} or %{"yy"} jour, mois, année 2 digits
// %{"ddddd"} or %{"jjjjj"} jour de la semaine
// %{"mmmmm"} mois en lettre
// %{"aaaa"} or %{"yyyy"} année 4 digits
// - language: code langage pour la traduction des jours et mois function fillInTemplateVariables ( template , language ) { var message = template ; var d = new Date ();
// year 4 digits année var reg = new RegExp ( /\%\{\"aaaa\"\}|\%\{\"yyyy\"\}/g ); message = message .
replace ( reg , d .
getFullYear ());
// year 2 digits année var reg = new RegExp ( /\%\{\"aa\%\{\"|yy\"\}\"\}/g ); message = message .
replace ( reg , d .
getFullYear ().
toString ().
slice (2 ));
// month 2 digits mois var reg = new RegExp ( /\%\{\"mm\"\}/g ); message = message .
replace ( reg , d .
getMonth ());
// day 2 digits jour var reg = new RegExp ( /\%\{\"jj\"\}|\%\{\"dd\"\}/g ); message = message .
replace ( reg , d .
getDate ());
// Day of the week - jour de la semaine var reg = new RegExp ( /\%\{\"jjjjj\"\}|\%\{\"ddddd\"\}/g ); var ddddd = Utilities .
formatDate ( d , "GMT" , "EEEEE" ); ddddd = LanguageApp .
translate ( ddddd , "en" , language ); message = message .
replace ( reg , ddddd );
// month in letters - mois en lettres var reg = new RegExp ( /\%\{\"mmmmm\"\}/g ); var mmmmm = Utilities .
formatDate ( d , "GMT" , "MMMMM" ); mmmmm = LanguageApp .
translate ( mmmmm , "en" , language ); message = message .
replace ( reg , mmmmm );
Les livres blancs 2010 - Patrick Oliviero page 25/27
Révolution Informatique – Rich Mail Merge – guide développeur return message ;
}
Les variables étant remplacées le document est maintenant près pour la fusion.
Un dernier point. Attention à la syntaxe de la ligne :
MailApp .
sendEmail ( rowData .
email , emailSubject , "" , { htmlBody : emailText });
Le corps HTML du courriel est passé comme quatrième argument, contrairement à un format texte qui est attendu en troisième position.
Les livres blancs 2010 - Patrick Oliviero page 26/27

Link pubblico aggiornato
Il link pubblico alla tua chat è stato aggiornato.