Как отправить PDF по электронной почте с содержимым в виде таблицы? - PullRequest
0 голосов
/ 23 ноября 2018

Вот код, который я сейчас использую:

function emailQuestionnaireAsPDF(questionnaireKey) {
  if (app.getActiveUserRoles().indexOf(app.roles.Admins) === -1) {
    throw new Error('You don\'t have permissions to perform this operation');
  }

  var questionnaire = app.models.Questionnaire.getRecord(questionnaireKey);

  if (!questionnaire) {
    throw new Error('Questionnaire was not found');
  }

  var tmpDoc = DocumentApp.create(FILE_NAME + ' ' + Date.now());
  var body = tmpDoc.getBody();
  var title = questionnaire.FirstName + '\'s Questionnaire';
  var fields = app.metadata.models.Questionnaire.fields;

  body.insertParagraph(0, title)
    .setHeading(DocumentApp.ParagraphHeading.HEADING1)
    .setAlignment(DocumentApp.HorizontalAlignment.CENTER);

  appendField_(body, fields.FirstName.displayName,
               questionnaire.FirstName);
  appendField_(body, fields.LastName.displayName,
               questionnaire.LastName);
  appendField_(body, fields.LikeIceCream.displayName,
               questionnaire.LikeIceCream);
  appendField_(body, fields.FavoriteMovie.displayName,
               questionnaire.FavoriteMovie);
  appendField_(body, fields.FavoriteColor.displayName,
               questionnaire.FavoriteColor);
  appendField_(body, fields.LuckyNumber.displayName,
               questionnaire.LuckyNumber);

  tmpDoc.saveAndClose();

  var blob = tmpDoc.getAs(MimeType.PDF);
  var pdfFile = DriveApp.createFile(blob);

  Drive.Files.remove(tmpDoc.getId());
  pdfFile.setName(FILE_NAME);

  sendEmail_(Session.getActiveUser().getEmail(), FILE_NAME, pdfFile.getUrl());
}

Я пытаюсь добавить все поля, из модели, связанной с вопросником, в "pdfFile".Как это сделать так, чтобы все связанные поля и значения были вставлены в pdfFile в виде таблицы?

1 Ответ

0 голосов
/ 01 декабря 2018

Основываясь на вашем описании, это то, что я сделал:

  1. Создал модель с именем Анкета со следующими полями:

    • firstName
    • lastName
    • likeIcecream
    • favouriteMovie
    • favouriteColor
    • luckyNumber

Я добавил пару тестовых записей.Затем на серверный скрипт я добавил две функции.Первая отправка электронной почты выглядит следующим образом:

function sendEmail(recipient, fileUrl, fileName){

  var pdfBlob = UrlFetchApp.fetch(fileUrl).getAs("application/pdf");

  MailApp.sendEmail({
    to: recipient,
    subject: "PDF Email Sample",
    htmlBody: "Attached the PDF File",
    attachments: [pdfBlob]
  });  

}

Вторая функция для создания документа выглядит следующим образом:

function emailQuestionnaireAsPDF(questionnaireKey){

  if (app.getActiveUserRoles().indexOf(app.roles.Admins) === -1) {
    throw new Error('You don\'t have permissions to perform this operation');
  }

  var questionnaire = app.models.questionnaire.getRecord(questionnaireKey);

  if (!questionnaire) {
    throw new Error('Questionnaire was not found');
  }

  //Start generating the HTML template
  var htmlData = "";
  htmlData += "<h1 style='text-align:center'>" + questionnaire.firstName + "'s Questionnaire </h1><br>"; //Title of the document

  //Create table start tag
  htmlData += "<table style='border:none;'>";

  //Create headers and append to table
  var headers = ["QUESTION", "RESPONSE"];
  var hRowStyle = "background-color:#efefef"; //style for table header row
  var hCellStyle = "font-weight:bold; padding-top:4px; padding-bottom: 3px; border-bottom:1px solid #bebebe;"; //style for table header cells
  htmlData += "<tr style='"+hRowStyle+"'><td style='"+hCellStyle+"'>" + headers.join("</td><td style='"+hCellStyle+"'>") + "</td></tr>";

  //Define row cell styles
  var tdSytle = "border-bottom: 1px solid #bebebe; border-left:0px; border-right:0px; padding-top:7px; padding-bottom: 6px;";

  //Create table rows
  var rows = [];
  rows.push(["First Name:", questionnaire.firstName]); // Add firstName
  rows.push(["Last Name:", questionnaire.lastName]); // Add lastName
  rows.push(["Likes Icecream:", questionnaire.likeIcecream]); // Add likeIceacream
  rows.push(["Favorite Movie:", questionnaire.favoriteMovie]); // Add favoriteMovie
  rows.push(["Favorite Color:", questionnaire.favoriteColor]); // Add favoriteColor
  rows.push(["Lucky Number:", questionnaire.luckyNumber]); // Add luckyNumber

  //Append rows to table
  rows.forEach(function(row){
     htmlData += "<tr><td style='"+tdSytle+"'>" + row.join("</td><td style='"+tdSytle+"'>") + "</td><tr>";
  });

  //Create table end tag
  htmlData += "</table>";

  //Create gooleDriveDoc
  var fileName = questionnaire.firstName + "'s Questionnaire";
  var data = Utilities.newBlob("").setDataFromString(htmlData).setContentType("text/html");
  var drvFile = Drive.Files.insert({title: fileName}, data, {convert: true});

  //Mail PDF File
  var recipient = "email@test.com";
  var fileUrl = "https://docs.google.com/document/d/"+drvFile.id+"/export?format=pdf&access_token="+ScriptApp.getOAuthToken();  
  sendEmail(recipient, fileUrl, fileName);

}

Итак, в общем, я создал Googleдокумент из шаблона HTML.Затем я использовал URL-адрес загрузки с токеном для получения PDF-файла Blob и прикрепления его к электронному письму.

Результат будет следующим:

enter image description here enter image description here

Чтение кода, который выдолжна быть в состоянии уловить, что это делается в деталях и, конечно, вы можете улучшить это!


Ссылки:

...