Пожалуйста, убедитесь, что у меня нет проблем с выполнением скрипта.
У меня есть ПЯТЬ форм 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]
}
);
}