【问题标题】:error in onform submit script when two form submit at same time两个表单同时提交时onform提交脚本出错
【发布时间】:2020-06-18 07:21:53
【问题描述】:

我有一个 google sheet 脚本,当提交表单时,它会做一些事情,然后创建一个新工作表,最后将工作表作为电子邮件的附件发送。它工作正常但是当两个表单同时提交时(当第二个表单在触发器完成之前提交时)电子邮件没有发送并且它根本不起作用

这是我的代码:

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 = SpreadsheetApp.CopyPasteType.PASTE_FORMULA, 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("1glwG1---------------tW").addFile(newSheet)
newSheet.getParents().next().removeFile(newSheet); 
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();

}

【问题讨论】:

  • 我的脚本我有行“获取最后一行”我认为当第二次提交此代码时会出错

标签: google-apps-script google-sheets triggers google-forms


【解决方案1】:

如您所见,您的代码可能会与同步表单提交发生冲突

为什么?

因为您对电子表格服务执行了多次调用,这会显着降低您的代码速度,您可以在Best Practices 下阅读。

怎么办?

  • 除了根据 Apps 脚本最佳实践优化您的代码之外,您还可以使用 LockService
  • Lo​​ckservice 允许您确保在给定时间仅运行一次脚本实例,随后的调用“在队列中等待”直到第一个脚本执行完成

如何使用锁服务?

基于您的代码的示例:

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();
}

注意: 此代码可以进一步优化以更快地运行

【讨论】:

  • 感谢您的有用回答我想在表单中设置设置确认消息,并在表单中设置一些单元格。我该怎么办?
  • 我不确定您所说的确认信息是什么意思——您是指电子邮件的正文吗?目前它设置为Responses.getRange(lastRow, 5).getValue(),只要您指定了正确的单元格,它就会按预期工作。如果问题仍然存在,我建议您发布一篇新帖子,更详细地解释有关确认消息的问题,如果有助于排除故障,可能还提供示例电子表格的副本。
猜你喜欢
  • 2018-05-10
  • 2013-01-14
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多