Выполнение AppScript при слиянии почты - лучшие практики для надежности и стабильности - PullRequest
0 голосов
/ 20 мая 2019

Пожалуйста, убедитесь, что у меня нет проблем с выполнением скрипта. У меня есть ПЯТЬ форм Google, все привязаны к ОДНОМУ листу Google. К листу прикреплен код ниже (я убрал код из обработки ошибок и т. Д.).

Сценарий:

Я пытаюсь выдать сертификаты для пользователей 5 разных курсов. По завершении курса (примерно в одно и то же время дня) пользователи вводят свои данные (имя, фамилию, адрес электронной почты), а приведенный ниже скрипт заботится о создании и отправке персонализированных сертификатов на свои адреса электронной почты. Скажем, на всех курсах максимум 100 пользователей в день.

Вот вопросы:)

  • Разумно ли управлять пятью формами с одного листа и полагаться на один сценарий?
  • Если нет, то как бы вы это сделали?

Я думаю о том, как выполняется сценарий? Это экземпляр для каждого запроса или будет очередь из 100 заданий, обслуживаемых на одном листе? Я знаю, что javascript запускает одну вещь за раз, но не совсем уверен, что это означает с точки зрения запуска сценария приложения и события onFormSubmit - я просто не знаю, как именно эти сценарии / экземпляры управляются и выполняются.

Это моя вторая попытка выдать сертификаты для нескольких форм. В предыдущем решении было по одному листу на форму и пять сценариев, генерирующих сертификаты, но было больно назад вносить какие-либо изменения и тестировать их.

Большое спасибо за любой ответ.

Лучший. Рафал

var ss = SpreadsheetApp.getActiveSpreadsheet();
var chosenId;

var templates = {
  "templateId_PL_1" : "1oS_11gz_123456789abcdefghijklmnop",
  "templateId_PL_2" : "11gasdsz_123456789abcdefghijklmnop",
  "templateId_PL_3" : "1JMo11gz_123456789abcdefghijklmnop",
  "templateId_EN_1" : "1KTx11gz_123456789abcdefghijklmnop",
  "templateId_EN_2" : "1_VQBgsz_123456789abcdefghijklmnop",
}
// reaction to form submit event
function onFormSubmit(e) {
  //check source of data by getting sheet name, i.e. "PL_1" or "EN_2"
  var range = e.range;
  chosenId = range.getSheet().getName();
  //get corresponding named range in "master" worksheet
  var trainingData = ss.getRangeByName(chosenId).getValues();
  //create new user object
  var userData = {
    //get submitted data from post
    "Title":[e.values[1]],
    "Name":[e.values[2]],
    "Surname":[e.values[3]],
    "Email":[e.values[4]],
    //get data from named range
    "Client":[trainingData[1][0]],
    "Training":[trainingData[1][3]],              
    "Date":[trainingData[1][1]],
     };
  //generate certs
  createAndUpdateCertificate(userData);
 }


function createAndUpdateCertificate(userObj){
  //create template copy according to data source
  var tempId = "templateId_"+chosenId; 
  var copy = DriveApp.getFileById(templates[tempId]).makeCopy("temp");
  var presentationID = copy.getId();
  //open copied presentation and go to 1st (only) slide
  var presentation = SlidesApp.openById(presentationID);
  var firstSlide = presentation.getSlides()[0]
  //replace texts in the slide
  firstSlide.replaceAllText("<<Title>>", userObj.Title);
  firstSlide.replaceAllText("<<Name>>", userObj.Name);
  firstSlide.replaceAllText("<<Surname>>", userObj.Surname);
  firstSlide.replaceAllText("<<Training>>", userObj.Training);
  firstSlide.replaceAllText("<<Date>>", userObj.Date);
  //close the copy
  presentation.saveAndClose();

  //sending certs
  sendCerts(
    presentationID, 
    userObj.Email, 
    userObj.Name, 
    userObj.Surname, 
    userObj.Training, 
    userObj.Date
  );

  //delete copy
  copy.setTrashed(true);
}


function sendCerts(cert, email, name, surname, training, date){
 //fetch cert as pdf
 var docblob = DriveApp.getFileById(cert).getAs('application/pdf');
 docblob.setName(date+"-"+"CERT "+training+"-"+name+" "+surname+".pdf");
 //save the pdf in appropriate  folder as a backup
 var dest = DriveApp.getFolderById("1K2k-123456789abcdefghijklmnop")
 var file = dest.createFile(docblob);
    MailApp.sendEmail(
    email, 
    "test", // title
    "test", // body
    { noReply: true,
     attachments: [file]
    }
  );
}

1 Ответ

0 голосов
/ 21 мая 2019

Я не очень внимательно смотрел на это, но использование диапазона для получения имени листа ответов является ключом к обработке нескольких форм в одной электронной таблице.Похоже, что ваши формы очень похожи, поэтому все становится намного проще.Почему вы просто не отправили один объект, а не все отдельные параметры?В целом, я думаю, что код выглядит хорошо организованным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...