Google onformsubmit вызывает отправку последней строки для одновременной отправки - PullRequest
0 голосов
/ 10 января 2019

Все еще очень плохо знаком со скриптом Google App, но ему удалось настроить форму, которая заполняет электронную таблицу, а затем отправляет электронное письмо с вложением в формате PDF с отчетом на основе данных пользователей. Моя проблема заключается в том, что при одновременной подаче. Вложение формы отправляется последнему респонденту по электронной почте в количестве, равном количеству одновременных представлений. К счастью, по последним данным респондентов

Я пробовал SpreadsheetApp.flush (), а также LockService.getScriptLock (), но не смог решить проблему (возможно, из-за неправильного использования). Я включаю в этот код, который у меня есть. Помощь будет оценена. Спасибо

При этом обновленный код

//automatically send email with cash flow attached when form is submitted

function onFormSubmit(e) {
// change onFormSubmit() to onFormSubmit(e) when based on event otherwise just onFormSubmit()    

  var sourceSpreadSheet = SpreadsheetApp.openById("spreadsheetID");
  var responseSheet = ss.getSheetByName("Form responses 1") ;

  var data = e.range.getValues();

  //var replied = data.offset(0, e.range.getNumColumns(),0,0);

  //Logger.log(data)

  //change to data = e.range when based on event alternatively responseSheet.getRange("A5:AA26").getValues();

  //Get a lock on this script, because we're about to modify a shared resource
  var lock = LockService.getScriptLock()

  //Wait 30 seconds for other processes to finish
  lock.waitLock(30000);

  //Logger.log(data[0][2]); //- email address

  var email = data[0][2];
  var name = data[0][1];
  var subject = "DelQS - Estimated cash flow for your project";

  //Generate attachment

  hideSheetsforPrint();

  //additional parameters for exporting the sheet as a pdf
   var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      // Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
      +  ('&id=' + sourceSpreadSheet())

      // following parameters are optional...
      + '&size=A4'          // paper size
      + '&portrait=false'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&printnotes=false' // remove notes
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

   var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
    }
  }

   var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/" + url_ext, options);
   var blob = response.getBlob().setName('Estimated cash flow.pdf');

  showAllSheets();

  var projectName = data[0][3]; //project name (optional)
  var htmlBody = HtmlService.createTemplateFromFile("notificationCashFlowEmail");

  //set the values for placeholders in the html file
  htmlBody.name = name;

  //evaluate and get the html file
  var emailHtml = htmlBody.evaluate().getContent();

  GmailApp.sendEmail(email, subject, emailHtml, {htmlBody: emailHtml,attachments: [blob]});

  var d = new Date();

  //responseSheet.getRange(replied).setValue(d); //optional to below line
  responseSheet.getRange(responseSheet.getLastRow(),responseSheet.getLastColumn()).setValue(d);

   SpreadsheetApp.flush();

  //Release the lock so that other processes can continue
  lock.releaseLock();

}
...