Automatisierung: Dokumente mit Google App Script

Im Vertrieb werden oft Dokumentationen, Angebote und Präsentationen verschickt. Wäre es nicht gut, durch Automatisierung jedem Kunden ein individuelles und auf ihn zugeschnittenes Dokument zu verschicken? Es gibt einige kostenpflichtige Dienste, die das Erstellen von Powerpoint und Word-Dokumenten als Templates ermöglichen und automatisiert versenden lassen.

In diesem Beitrag möchte ich zeigen, wie man aus Google Suite heraus, dynamisch Dokumente erzeugt und per Email verschickt. Und zwar ohne weitere kostenpflichtige Dienste einzusetzen. Dabei Hilft uns die Erweiterung „Google App Scripts„.

Meine Idee: Ich möchte in meinen Dokumenten Platzhalter verwenden. Diese sollen dann durch die richtigen Werte ausgetauscht werden. Beispiel: Ich setze im Text den Platzhalter „{{name}}“ und dieser soll dann im finalen Dokument durch den richtigen Wert ersetzt werden.

Achtung! Jetzt wird es etwas Code-Lastig. Wer nicht viel mit Programmierung zu tun hat, kann sich am Ende des Beitrags das Video anschauen. In dem Video zeige ich, wie man selbst ein Dokument mit Hilfe meines Scripts erstellt. Dafür braucht man keine Programmiererfahrung.

Dynamische Dokumente mit Platzhaltern in Google Documents

Bei Google Documents geht das Suchen und Ersetzen von Platzhaltern eigentlich sehr einfach. Man durchläuft per Script alle Paragraphen und ersetzt im Text die Platzhalter. Um das Ganze dynamisch zu gestallten. Suche ich alle Platzhalter und frage einmalig nach dem entsprechenden Wert dafür.

function onOpen() {
  var ui = DocumentApp.getUi();
  ui.createMenu('DynMedia')
      .addItem('Send Document', 'dynDocument')
      .addToUi();
}

function dynDocument() {
  var varMap={};
  var file=DriveApp.getFileById(DocumentApp.getActiveDocument().getId()).makeCopy("Copy of ");
  
  var doc=DocumentApp.openById(file.getId());
  var para=doc.getBody().getParagraphs();
  
  for(var i=0; i<para.length; i++){
    var text=para[i].getText();
    if(!text) continue;
    
    text=text.replace(/{{([^}]*)}}/g, function(m, $1) {
      if(!varMap[$1]){
        varMap[$1]=DocumentApp.getUi().prompt($1+" ?").getResponseText();
      }
      return varMap[$1];
    });
    
    para[i].setText(text);
  }
  doc.saveAndClose();
  var email=DocumentApp.getUi().prompt("Document is ready! Send to? (Email-Adress)").getResponseText()
  GmailApp.sendEmail(email, "Your document", "See attachment",{
     attachments: [doc.getAs(MimeType.PDF)],
     name: 'Automatic Emailer Script'
  });
  
  DriveApp.getFileById(doc.getId()).setTrashed(true);
}

Im Video gehe ich ein klein auch drauf ein, was der Code eigentlich macht. Hier nur die wichtigsten Punkte zum allgemeinen Verständnis.

In „onOpen()“ passiert nur die normale Magic, bei der ein neuer Menüpunkt im Dokument erzeugt wird. Dadurch kann man das Script direkt aus dem Dokument heraus verwenden.

Nun kommen wir zur eigentlichen Automatisierung. In der Funktion „dynDocument()“ wird dann zunächst eine Kopie des Dokumentes erzeugt und geöffnet. Anschließend wird jeder Paragraph durchlaufen und jeder Platzhalter wird ersetzt. Alle Platzhalter werden im Objekt „varMap“ gespeichert, so das jeder Wert nur einmal beim Nutzer abgefragt wird. Zum Schluss wird das Dokument als Email verschickt. Und die Arbeitskopie gelöscht. Den letzten Teil kann jeder für sich entscheiden, man könnte auch nach dem Dateinamen fragen und dann das Dokument so nennen und nicht direkt verschicken.

In meinem ersten Test hat das Script mit folgenden Elementen funktioniert: Paragraphen, Tabellen, Fussnoten und Formeln.

Dynamische Dokumente mit Platzhaltern in Google Slides

Automatisierung funktioniert auch mit Google Slides. Um ganze Präsentationen automatisiert zu erweitern, musste ich noch die Iteration über die Slides hinzufügen. Ansonsten funktioniert das Ganze ziemlich ähnlich.

Hier der Script für Google Slides:

function onOpen() {
  var ui = SlidesApp.getUi();
  ui.createMenu('DynMedia')
      .addItem('Send Document', 'dynDocument')
      .addToUi();
}

function dynDocument() {
  var varMap={};
  var file=DriveApp.getFileById(SlidesApp.getActivePresentation().getId()).makeCopy("Copy of ");
  
  var doc=SlidesApp.openById(file.getId());
  
  var slides=doc.getSlides()
  for(var i=0; i<slides.length; i++){
    var slide=slides[i];
    var shapes=slide.getShapes();
  
    for(var j=0; j<shapes.length; j++){
      var text=shapes[j].getText().asString();
        if(!text) continue;
      
        text=text.replace(/{{([^}]*)}}/g, function(m, $1) {
          if(!varMap[$1]){
            varMap[$1]=SlidesApp.getUi().prompt($1+" ?").getResponseText();
          }
          return varMap[$1];
        });
      
        shapes[j].getText().setText(text);
    }
  }
  doc.saveAndClose();
  var email=SlidesApp.getUi().prompt("Document is ready! Send to? (Email-Adress)").getResponseText()
  GmailApp.sendEmail(email, "Your document", "See attachment",{
     attachments: [DriveApp.getFileById(doc.getId()).getBlob()], //little different
     name: 'Automatic Emailer Script'
  });
  
  DriveApp.getFileById(doc.getId()).setTrashed(true);
}

Ich war überrascht beim Testen, dass die Platzhalter sogar in Diagrammen funktionieren. Das Dokument wird momentan als PDF versendet.

Das Ganze in Aktion

In folgendem Video zeige ich, wie das Script praktisch funktioniert und wie man selbst ein dynamisches Dokument anlegt.

1 Gedanke zu “Automatisierung: Dokumente mit Google App Script”

Spannend? Lass uns Gedanken austauschen!