Я настроил форму Google и связанный лист для записи ответов формы, а затем создал и отправил респонденту письмо из предоставленных данных. Это работало нормально и стало довольно популярным среди коллег, но теперь возникла проблема с onFormSubmit, когда два пользователя отправляют форму одновременно.
По сути, сценарий настроен для запуска в последней строке листа onFormSubmit, но если два ответа отправляются одновременно, он запускает сценарий только для последней записи, возможно, дважды.
Я думаю, что возможно было бы обойти это, установив столбец, который будет помечен, если скрипт завершен, и затем установив триггер времени для запуска на любых строках, которые не были отмечены, но это кажется немного неуклюже, поскольку респонденты обычно требуют письма немедленно.
Есть ли другой способ решения проблемы, чтобы onFormSubmit удостоверился, что скрипт действительно выполняется в строке, созданной исходной отправкой формы, а не просто в последней строке? Любая помощь будет высоко ценится, вот пример моего кода:
function createLetterFromForm(){
// Get data from sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// Define range and data in each column
var data = sheet.getRange(sheet.getLastRow(), 1, 1,
sheet.getLastColumn()).getValues(); // Range (last entry submitted)
for (var i in data){
var row = data[i];
// Pick the right template
if (row[9]=="A"){
var templateid = "xxxxxxxxxxxx";} // Template 1
if (row[9]=="B"){
var templateid = "xxxxxxxxxxxy";} // Template 2
// Make copy and set active
var folder = DriveApp.getFolderById("zzzzzzzzzzzzzz") // Folder for generated letters
var docid = DriveApp.getFileById(templateid).makeCopy(row[7]+" - Letter",folder).getId();
var doc = DocumentApp.openById(docid);
var docBody = doc.getActiveSection();
// Copy data to template
// address
docBody.replaceText("%FNAME%", row[2]);
docBody.replaceText("%SNAME%", row[3]);
docBody.replaceText("%ADDL1%", row[4]);
docBody.replaceText("%ADDL2%", row[5]);
docBody.replaceText("%ADDL3%", row[6]);
docBody.replaceText("%PCODE%", row[7]);
// other data
docBody.replaceText("%DATA1%, row[8]);
// etc.
// Share and Save doc
doc.addEditor(row[1]);
doc.saveAndClose();
// Email PDF to Respondee
var sendFile = DriveApp.getFilesByName(row[7]+' - Letter');
var recipient = row[1]
MailApp.sendEmail({
to:recipient,
subject: "Your Letter",
body:"Hello, \n\nHere's a PDF copy of the letter you created.",
attachments: [sendFile.next()]
});
}
}