Search code examples
google-docsgoogle-app-maker

Document Merge with Google App Maker


I would like to integrate a document merge into a workflow which I created in Google App Maker. Whenever an input is submitted in a form, the answers should be merged into a Google Docs template, if the template contains a placeholder that matches the name of the field. For example, if the field name is last_name, the placeholder would be {{last_name}}.

The document merge should go through each field of every item, so that I don't have to program the field names into the script. In a Google Spreadsheet this would be resolved by using a loop like

function documentMerge() {
  var ss = SpreadsheetApp.getActiveSpreadsheet.getActiveSheet;
  var lastClmn = ss.getDataRange.getLastColumn();
  var lastRow = ss.getDataRange.getLastRow();

  for (var i=0, lastClmn, i++) {
    for (var j=1, lastRow, j++) {  
      // if '{{' + (ss.getRange(0, i).getValue()) + '}}' is found in document
      // ... replace placeholder in document with contents from column i, row j ...
  }

Is there something similar possible in Google App Maker?


Solution

  • Put the following in your onAfterCreate event of your model:

    var templateId = 'your template ID';
    var filename = 'Document for Customer ' + record.ClientName + new Date();
    
    var copyFile = DriveApp.getFileById(templateId).makeCopy(filename);
    
    var copyDoc = DocumentApp.openById(copyFile.getId());
    var copyBody = copyDoc.getBody();
    var fields = app.metadata.models.Clients.fields;
    
    for (var i in fields) {
      var text = '<<' + fields[i].name + '>>';
      var data = record[fields[i].name];
      copyBody.replaceText(text, data);
    }
    
    copyDoc.saveAndClose();
    

    That should do it for you. See the pictures as to the template and created document. Application Form

    Document Template

    Filled Template