Re !
Hum, je n'ai pas tout compris, mais je vais essayer d'apporter quelques pistes...
Une méthode que j'apprécie pour la génération dynamique de document depuis GAS implique l'utilisation de signets :
1) je crée un document Google Docs modèle. Il est en tout point similaire aux documents attendus mais je remplace les informations "dynamiques" par des signets.
2) A l'aide d'une méthode de détermination (ci-après), je repère l'identifiant de chaque signet coté GS que je conserve sous forme d'une variable constantes, par ex
var MARK_TITRE = 'id.fygw72ubugq'; // Le titre du document
3) Au besoin, il est alors possible d'ouvrir le document template, d'en réaliser une copie dans un répertoire de destination, d'alimenter cette copie à l'aide de données issue d'un spreadsheet, puis de l'envoyer par mail :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // Variables élémentaires : modèle, répertoires, etc...
var docTemplate = DriveApp.getFileById(xxx);
var dossierDeGeneration = DriveApp.getFolderById(yyy);
// Obtention d'une copie de travail personnalisée et datée à partir du modele
var copiePerso_File, copiePerso_Doc, pdf, pdfFile;
copiePerso_File = docTemplate.makeCopy('mon_titre' + edit_FormatDatePourTitreDoc_(new Date()), dossierDeGeneration);
copiePerso_Doc = DocumentApp.openById(copiePerso_File.getId());
// Mise à jour de la copie
copiePerso_Doc = edit_alimenterAnnexe_(copiePerso_Doc);
copiePerso_Doc.saveAndClose();
// Génération du fichier sous sa forme PDF
pdf = copiePerso_Doc.getAs(TYPE_PDF)
pdf.setName(copiePerso_Doc.getName() + ".pdf");
pdfFile = DriveApp.createFile(pdf);
DriveApp.getFolderById(ID_REP_GENERATION).addFile(pdfFile); // Ajout du fichier au répertoire de destination
DriveApp.removeFile(pdfFile); // Le fichier doit être supprimé de la racine du Drive où il a été généré
pdf = DriveApp.getFileById(pdfFile.getId()); // Récupération de la version depuis le répertoire de génération
mailing_envoiDocParMail(pdf, user); |
"edit_alimenterAnnexe_" sert à substituer l'ensemble des signets du document en s'appuyant sur la méthode suivante (et en exploitant un spreadhseet pour déterminer les valeurs "texteAInserer"...). Un exemple d'appel serait "edit_remplacerMarkParId_(docARemplir, MARK_TITRE, 'Titre du document!');" :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /**
* Fonction de complétion du texte d'un bookmark identifié par son id par le texte personnalisé transmis
*
* @param {File / Document} copieDeTravail, le document en cours de personnalisation
* @param {String} idBookMarkARemplacer, l'id du bookmark à compléter
* @param {String} texteAInserer, le texte à insérer
*/
function edit_remplacerMarkParId_(copieDeTravail, idBookMarkARemplacer, texteAInserer) {
// Identification du bookmark
var bookMarkTemp = copieDeTravail.getBookmark(idBookMarkARemplacer);
// ATTENTION : les bookmarks apparaissent parfois comme des PARAGRAPH et parfois comme des éléments TEXT
// Concaténation de la valeur transmise, texteAInserer, au texte de présentation déjà présent sur le modèle
var containerElement = bookMarkTemp.getPosition().getElement();
if (containerElement.getType() == DocumentApp.ElementType.PARAGRAPH && texteAInserer != '') {
containerElement.asParagraph().appendText(texteAInserer);
} else if (containerElement.getType() == DocumentApp.ElementType.TEXT && texteAInserer != '') {
containerElement.asText().appendText(texteAInserer);
}
} |
Et la méthode d'identification des signets/bookmarks :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| /**
* DEV uniquement
* Fonction utilitaire d'aide à l'identification des bookmarks présents dans un document : leurs id sont tracés et rapprochés de leur texte
*/
function edit_IdentifierBookmark() {
var docTemplate = edit_getTemplateAnnexe_(DEPLOYMENT_TYPE);
var dossierDeGeneration = DriveApp.getFolderById(ID_REP_GENERATION);
var copiePerso_File = docTemplate.makeCopy(DOC_TITRE + '_' + ('temp'.split('@')[0]).split('.')[0], dossierDeGeneration);
var copiePerso_Doc = DocumentApp.openById(copiePerso_File.getId());
// L'ensemble des bookmark est parcourus pour tracer dans les logs chaque ID avec le texte qui l'accompagne
var bookMarks = copiePerso_Doc.getBookmarks();
var indiceBM = 0;
for(indiceBM; indiceBM < bookMarks.length; indiceBM++) {
Logger.log(bookMarks[indiceBM].getId() + ' : ' + bookMarks[indiceBM].getPosition().getElement().asText().getText());
}
} |
Bon courage !
Partager