ошибка в скрипте отправки формы, когда две формы отправляются одновременно - PullRequest
0 голосов
/ 18 июня 2020

У меня есть сценарий листа Google, и когда форма отправляется, он работает над чем-то, а затем создает новый лист и, наконец, отправляет лист как вложение электронной почты. он работает правильно, но когда две формы отправляются одновременно (когда вторая форма отправляется до триггера fini sh), электронное письмо не отправляется, и оно вообще не работает

вот мой код:

function onSubmit(e){
Logger.log('submit ran');

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();


var calculate = ss.getSheets()[2];
var Responses = ss.getSheets()[0];
var report = ss.getSheets()[1];
var report1= ss.getSheets()[3];


var lastRow = Responses.getLastRow();
var copyrange = Responses.getRange("e2:m2").copyTo(Responses.getRange(lastRow, 5), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
  SpreadsheetApp.flush();


var sh = Responses.getRange(lastRow, 8).getValue();



var cell = calculate.getRange("c2");
cell.setFormula(sh);
SpreadsheetApp.flush();

 SpreadsheetApp.flush();
  var lastRow = Responses.getLastRow();
var copyrange = Responses.getRange(lastRow, 5,1, 10).copyTo(Responses.getRange(lastRow, 5),SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

SpreadsheetApp.flush();
var sa = Responses.getRange(lastRow, 1).getValue();
var sB = Responses.getRange(lastRow, 2).getValue();
var se = Responses.getRange(lastRow, 5).getValue();
var sf = Responses.getRange(lastRow, 6).getValue();
var si = Responses.getRange(lastRow, 9).getValue();



SpreadsheetApp.flush();

var ss = SpreadsheetApp.getActiveSpreadsheet();

  var rangclear= report1.getRange("a9:z100");
  rangclear.deleteCells(SpreadsheetApp.Dimension.ROWS);

var count= calculate.getRange("b6").getValue();



report.getRange("A:Z").copyTo(report1.getRange("A1"));
SpreadsheetApp.flush();
report.getRange("A:Z").copyTo(report1.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
SpreadsheetApp.flush();

var maxRow1 = report1.getMaxRows();
var lastRow1 = report1.getLastRow();
SpreadsheetApp.flush();
report1.deleteRows(9+count, (172-(9+count)))
SpreadsheetApp.flush();



var email = sB;
var subject = "راید ریپورت "+sa;
var body = se;

var calculate = ss.getSheets()[2];
var Responses = ss.getSheets()[0];
var report = ss.getSheets()[1];


var newSheetid = SpreadsheetApp.create("promoter report "+si,30,60).getId();
var newSheet= DriveApp.getFileById(newSheetid);
DriveApp.getFolderById("1glwG1WF2rgrg54hfh0nJjxgtW").addFile(newSheet)
newSheet.getParents().next().removeFile(newSheet);

var source = SpreadsheetApp.getActiveSpreadsheet();
var sheet = source.getSheets()[3];

var destination = SpreadsheetApp.openById(newSheetid);
sheet.copyTo(destination);


var source = SpreadsheetApp.getActiveSpreadsheet();
var  sheet1= destination.getSheetByName("Sheet1").hideSheet();
var sheet1id=sheet1.getSheetId();

SpreadsheetApp.flush();

var pdf = newSheet.getAs('application/pdf')


MailApp.sendEmail(email,subject ,body, {attachments:[pdf]});
var sf = Responses.getRange(lastRow, 6).setValue("EMAIL_SENT")
SpreadsheetApp.flush();

}

помогите пожалуйста

1 Ответ

2 голосов
/ 18 июня 2020

Как вы правильно заметили, ваш код может столкнуться с конфликтами с имитирующей формой отправки

Почему?

Потому что вы выполняете несколько вызовов службы электронных таблиц, что замедляет ваш код значительно вниз, как вы можете прочитать в разделе Лучшие практики .

Что делать?

  • Помимо оптимизации вашего кода в соответствии с передовыми методами скриптов приложений, вы можете использовать LockService
  • Lockservice позволяет вам убедиться, что только один раз экземпляр скрипта запускается в данный момент времени, а последующие вызовы «ждут в очереди», пока завершается выполнение первого скрипта

Как использовать Lockservice?

Пример на основе вашего кода:

function onSubmit(e){
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);
  Logger.log('submit ran');

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();


  var calculate = ss.getSheets()[2];
  var Responses = ss.getSheets()[0];
  var report = ss.getSheets()[1];
  var report1= ss.getSheets()[3];


  var lastRow = Responses.getLastRow();
  var copyrange = Responses.getRange("e2:m2").copyTo(Responses.getRange(lastRow, 5), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
  SpreadsheetApp.flush();


  var sh = Responses.getRange(lastRow, 8).getValue();



  var cell = calculate.getRange("c2");
  cell.setFormula(sh);
  SpreadsheetApp.flush();

  SpreadsheetApp.flush();
  var lastRow = Responses.getLastRow();
  var copyrange = Responses.getRange(lastRow, 5,1, 10).copyTo(Responses.getRange(lastRow, 5),SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  SpreadsheetApp.flush();
  var sa = Responses.getRange(lastRow, 1).getValue();
  var sB = Responses.getRange(lastRow, 2).getValue();
  var se = Responses.getRange(lastRow, 5).getValue();
  var sf = Responses.getRange(lastRow, 6).getValue();
  var si = Responses.getRange(lastRow, 9).getValue();

  SpreadsheetApp.flush();

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var rangclear= report1.getRange("a9:z100");
  rangclear.deleteCells(SpreadsheetApp.Dimension.ROWS);

  var count= calculate.getRange("b6").getValue();

  report.getRange("A:Z").copyTo(report1.getRange("A1"));
  SpreadsheetApp.flush();
  report.getRange("A:Z").copyTo(report1.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  SpreadsheetApp.flush();

  var maxRow1 = report1.getMaxRows();
  var lastRow1 = report1.getLastRow();
  SpreadsheetApp.flush();
  report1.deleteRows(9+count, (172-(9+count)))
  SpreadsheetApp.flush();

  var email = sB;
  var subject = "راید ریپورت "+sa;
  var body = se;

  var calculate = ss.getSheets()[2];
  var Responses = ss.getSheets()[0];
  var report = ss.getSheets()[1];


  var newSheetid = SpreadsheetApp.create("promoter report "+si,30,60).getId();
  var newSheet= DriveApp.getFileById(newSheetid);
  DriveApp.getFolderById("1glwG1WF2rgrg54hfh0nJjxgtW").addFile(newSheet)
  newSheet.getParents().next().removeFile(newSheet);

  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = source.getSheets()[3];

  var destination = SpreadsheetApp.openById(newSheetid);
  sheet.copyTo(destination);


  var source = SpreadsheetApp.getActiveSpreadsheet();
  var  sheet1= destination.getSheetByName("Sheet1").hideSheet();
  var sheet1id=sheet1.getSheetId();

  SpreadsheetApp.flush();

  var pdf = newSheet.getAs('application/pdf')


  MailApp.sendEmail(email,subject ,body, {attachments:[pdf]});
  var sf = Responses.getRange(lastRow, 6).setValue("EMAIL_SENT")
  SpreadsheetApp.flush();

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

Примечание : Этот код можно дополнительно оптимизировать, чтобы он работал быстрее

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