Imprimer en masse - publipostage

Voici un custom widget simple qui permet d’imprimer en masse plusieurs documents à la fois, générés par du publipostage.

Nov-28-2025 20-22-55

Pas à pas :

  • Ajouter une vue personnalisée > custom widget builder, basée sur la table qui contient votre formule dynamique qui génère le html
  • Ouvrez la configuration du widget, et dans le code html collez ce code qui affiche un bouton « Imprimer tout » :
<html>
<head>
  <script src="https://docs.getgrist.com/grist-plugin-api.js"></script>
</head>
<body>
  <button id="printBtn">Imprimer tout</button>
</body>
</html>
  • Dans l’onglet js, collez le code suivant en remplaçant formule_avec_style par l’identifiant de votre colonne qui contient le html dynamique :
grist.ready({ requiredAccess: 'full' });

const printBtn = document.querySelector("#printBtn");
let tableData = [];

grist.onRecords(table => {
 tableData = table;
});

printBtn.addEventListener('click', () => {
 if (tableData.length === 0) {
   alert("Aucune donnée à imprimer");
   return;
}

const printWindow = window.open('', '_blank');
let htmlContent = '<html><head><title>Impression</title></head><body>';
     
tableData.forEach((row) => {
 htmlContent += row.formule_avec_style || '';
 htmlContent += '<div style="page-break-after: always;"></div>';
});
     
htmlContent += '</body></html>';
     
printWindow.document.write(htmlContent);
printWindow.document.close();
printWindow.print();
});

Un document d’exemple avec le custom widget est disponible ici :

PS : je pense qu’on peut faire mieux sans ouvrir de nouvel onglet

1 « J'aime »

Si vous souhaitez imprimer seulement les vues de certaines lignes (= filtrer votre table), vous pouvez créer une colonne « Imprimer » de type booléen, et cocher les lignes que vous souhaitez enregistrer/imprimer.

Puis utiliser ce code dans le js, en remplaçant Imprimer par l’id de votre colonne booléen :

grist.ready({ requiredAccess: 'full' });

const printBtn = document.querySelector("#printBtn");
let tableData = [];

grist.onRecords(table => {
  tableData = table;
});

printBtn.addEventListener('click', () => {
  if (tableData.length === 0) {
    alert("Aucune donnée à imprimer");
    return;
  }

  // Filtrer uniquement les lignes où Imprimer est True
  const rowsToPrint = tableData.filter(row => row.Imprimer === true);
      
  if (rowsToPrint.length === 0) {
    alert("Aucune ligne avec Envoyer = True");
    return;
  }

  const printWindow = window.open('', '_blank');
  let htmlContent = '<html><head><title>Impression</title></head><body>';
      
  rowsToPrint.forEach((row) => {
    htmlContent += row.formule_avec_style || '';
    htmlContent += '<div style="page-break-after: always;"></div>';
  });
      
  htmlContent += '</body></html>';
      
  printWindow.document.write(htmlContent);
  printWindow.document.close();
  printWindow.print();
});

Ex ici : Ex - Imprimer en masse publipostage - Grist

1 « J'aime »

Je me suis aidé de cette doc de mozilla pour ne pas avoir de fenêtre qui s’ouvre.

Il faut remplacer

src

par

srcdoc = htmlContent

grist.ready({ requiredAccess: 'full' });

const printBtn = document.querySelector("#printBtn");
let tableData = [];

grist.onRecords(table => {
 tableData = table;
});

function setPrint() {
  const closePrint = () => {
    document.body.removeChild(this);
  };
  this.contentWindow.onbeforeunload = closePrint;
  this.contentWindow.onafterprint = closePrint;
  this.contentWindow.print();
}

document.getElementById("printBtn").addEventListener("click", () => {

  if (tableData.length === 0) {
   alert("Aucune donnée à imprimer");
   return;
  }

  let htmlContent = '<html><head><title>Impression</title></head><body>';
  tableData.forEach((row) => {
  htmlContent += row.PDF || '';
  htmlContent += '<div style="page-break-after: always;"></div>';
  });
  htmlContent += '</body></html>';

  const hideFrame = document.createElement("iframe");
  hideFrame.onload = setPrint;
  hideFrame.style.display = "none"; // hide iframe
  hideFrame.srcdoc = htmlContent;
  document.body.appendChild(hideFrame);
});

Par contre, ce dont j’ai besoin ce serait de générer un pdf par ligne.
Je n’ai pas encore trouvé.
Enfin si avec html2pdf, mais cela créé des images, ce que je ne veux pas.

Pierre

Bonjour, est-ce que ce widget pourrait vous convenir ?