Сбой скрипта Google Apps на FormsSubmit с одновременными ответами - PullRequest
0 голосов
/ 17 мая 2018

Я настроил форму 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()]
      });
 }
}
...