APP Script - récupérer MFC texte cellule pour export sur Gmail
Bonjour à tous,
Petit amateur de App Script, la fonction ou le code doit être assez basique mais après recherche, je ne trouves pas.
Je cherche à récupérer le texte d'une cellule de Google Sheet en prenant la MFC du texte de cette cellule et de l'exporter dans un mail type.
Cependant lorsque que je récupère le texte de la cellule en question, cela m'intègre bien dans le mail le texte (avec les espaces) mais de façon BRUT sans la couleur du texte, ni les interlignes ou encore le type de mise en forme (GRAS/Italique).
Le code de la cellule en question est :
var Comm =ss.getSheetByName('Communication');
var msg = Comm.getRange(2,4).getValue();Une fois inclus dans mon HTML Body :
htmlBody: msg+ "Communication fixe du mail"J'ai bien le texte de "msg" // sans interlignes ni MFC du texte
Voici mon code :
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('E-mail').addItem('Envoi', 'send').addToUi()
}
function send() {
// Variable
var ss = SpreadsheetApp.getActiveSpreadsheet()
var Destinataire_mail =ss.getSheetByName('Renouvellement');
const ui = SpreadsheetApp.getUi();
var Comm =ss.getSheetByName('Communication');
var msg = Comm.getRange(2,4).getValue();
// Dernière ligne
var derniere_ligne = Destinataire_mail.getLastRow();
// boucle + instruction
for (var i = 6; i < derniere_ligne + 1; i ++) {
var emailAdress = Destinataire_mail.getRange(i,3).getValue();
MailApp.sendEmail({
to: emailAdress,
subject: "URGENT",
htmlBody: msg+ "Communication fixe du mail"
});
SpreadsheetApp.getActiveSheet().getRange(i, 5).setValue('Envoyé');
}
}Quelqu'un pourrait m'aider à mon problème de très bas niveau ?!
En vous remerciant chaleureusement
Cordialement
sans la couleur du texte, ni les interlignes ou encore le type de mise en forme (GRAS/Italique)
il faut séparer les interlignes du reste
1-
pour les interlignes, il faut remplacer \n par <br> qui est le code html de retour à la ligne
var msg = Comm.getRange(2,4).getValue().replace(/(\r\n|\n|\r)/gm,"<br>")2-
pour le reste, admettons que
var range = Comm.getRange(2,4)les propriétés sont ici
var data = range.getDisplayValue()
var size = range.getFontSize()
var style = range.getFontStyle()
var weight = range.getFontWeight()
var line = range.getFontLine()
var bg = range.getBackground()
var color = range.getFontColor()
var font = range.getFontFamily()
var textalign = range.getHorizontalAlignment()==> il faut connaître un peu le html pour en tenir compte, genre
var msg = '<span ' +
' style="font-family:' + font +
'; background-color:' + bg +
'; color:' + color +
'; font-style:' + style +
'; font-weight:' + weight +
'; text-decoration:' + line +
'; font-size:' + size + 'px' +
'; text-align:' + textalign + ';">' +
data.replace(/(\r\n|\n|\r)/gm, "<br>") + '</span>';si problème d'intégration, poste un fichier simple anonymisé
Merci pour ta réponse !
En fait pour être précis, le mail est composé de deux parties :
La première : Qui seras une cellule du Sheet (Feuille Communication) // et sera modifier à chaque envoi par un utilisateur lambda qui ne toucheras pas au code.
la deuxième : La deuxième partie sera intégrée dans l'Appscript en HTML (avec balise) et non modifiée.
Effectivement, avant j'avais tout coder en HTML dans le script et ca marchait bien, mais non facilement modifiable par Mme Michu de 55 ans (d'où la partie modifiable et l'autre non).
Malgré intégration, cela résout le problème de paragraphe mais pas de personnalisation du texte de la cellule.
Je te met capture d'écran et lien du fichier anonymiser ci dessous :
Lien du fichier : https://docs.google.com/spreadsheets/d/1FyTkaMHqYzuwdzl0P7vm8ouhkImRPwL7muk0VJNEiVY/edit?usp=sharing
Encore merci !
Il est très complexe de détailler une même cellule avec des mises en forme différentes à l'intérieur de la cellule.
Dans ce cas, il est plus simple de mettre le texte dans un document google doc à part et faire appel à lui, ou mettre le texte sur plusieurs lignes, chacune ayant une mise en forme particulière mais homogène pour la cellule.
Ceci fait, tu peux utiliser le même code mais généralisé comme ceci
function tableHTML(range){
var data = range.getDisplayValues()
var size = range.getFontSizes()
var style = range.getFontStyles()
var weight = range.getFontWeights()
var line = range.getFontLines()
var bg = range.getBackgrounds()
var color = range.getFontColors()
var font = range.getFontFamilies()
var textalign = range.getHorizontalAlignments()
var offsetx = range.getRow()
var offsety = range.getColumn()
var mergedRanges = range.getMergedRanges();
var flag = Array.from({ length: range.getNumRows() }, () => Array.from({ length: range.getNumColumns() }, () => true));
var layout = Array.from({ length: range.getNumRows() }, () => Array.from({ length: range.getNumColumns() }, () => ''));
mergedRanges.forEach((rng,i) => {
for (x=rng.getRow();x<rng.getRow()+rng.getNumRows();x++){
for (y=rng.getColumn();y<rng.getColumn()+rng.getNumColumns();y++){
try{flag[x-offsetx][y-offsety]=false}catch(e){}
}
}
flag[rng.getRow()-offsetx][rng.getColumn()-offsety]=true
layout[rng.getRow()-offsetx][rng.getColumn()-offsety]=' colspan="'+rng.getNumColumns()+'" rowspan="'+rng.getNumRows()+'" '
});
var tableformat = 'cellspacing="2" cellpadding="2" border="1" style="width:100%;border-collapse:collapse;border:1px solid #ccc"';
var htmltable = '<table ' + tableformat +' >';
for (row = 0; row<data.length; row++){
htmltable += '<tr>';
for (col = 0 ;col<data[row].length; col++){
if (flag[row][col]){
if (data[row][col] === '') {
htmltable += '<td '+layout[row][col]+' style="background-color:' + bg[row][col] + ';">' + ' ' + '</td>';
}
else
htmltable += '<td '+layout[row][col] +
' style="font-family:' + font[row][col] +
'; background-color:' + bg[row][col] +
'; color:' + color[row][col] +
'; font-style:' + style[row][col] +
'; font-weight:' + weight[row][col] +
'; text-decoration:' + line[row][col] +
'; font-size:' + size[row][col] + 'px' +
'; text-align:' + textalign[row][col] + ';">' +
data[row][col].replace(/(\r\n|\n|\r)/gm,"<br>") + '</td>';
}
}
htmltable += '</tr>';
}
htmltable += '</table>';
return htmltable
}à intégrer dans ta fonction d'envoi, par exemple (ramène par formule la valeur de la cellule isolée dan la même plage)
var feuille = 'nom de la feuille'
var email = 'nom@email.com' // pour l'envoi par courrier électronique
function sendEmail() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(feuille)
var plage = sh.getDataRange()
MailApp.sendEmail({
to: email,
subject: 'Bla bla ' ,
htmlBody: tableHTML(plage)
})
};Yes je vois !
Ca va être complexe de gérer le texte dans plusieurs cellule sachant que je vais avoir une liste à rallonge d'adresse mail à envoyer et la nécessité d'avoir mon compteur.
Yep merci pour ton expertise et ton temps.
Je vais partir sur de l'appel de Google Doc qui sera plus simple mais ca fais deux fichier à gérer pour un mail.
Je vais voir ça !
Encore merci.
Ca va être complexe de gérer le texte dans plusieurs cellule sachant que je vais avoir une liste à rallonge d'adresse mail à envoyer et la nécessité d'avoir mon compteur.
Pas forcément ... tu fais une boucle sur la valeur de la cellule qui change