Google apps script 两个表单同时提交时onform提交脚本出错
我有一个谷歌工作表脚本,当一个表单提交时,它会做一些事情,然后创建一个新的工作表,最后将工作表作为电子邮件附件发送。它可以正常工作,但当两个表单同时提交时(当第二个表单在触发器完成之前提交时),电子邮件不会发送,它根本不工作 这是我的密码:Google apps script 两个表单同时提交时onform提交脚本出错,google-apps-script,google-sheets,triggers,google-forms,Google Apps Script,Google Sheets,Triggers,Google Forms,我有一个谷歌工作表脚本,当一个表单提交时,它会做一些事情,然后创建一个新的工作表,最后将工作表作为电子邮件附件发送。它可以正常工作,但当两个表单同时提交时(当第二个表单在触发器完成之前提交时),电子邮件不会发送,它根本不工作 这是我的密码: function onSubmit(e){ Logger.log('submit ran'); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet();
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();
}
请帮助我正如您正确注意到的,您的编解码器可能会与模拟表单提交发生冲突 为什么? 因为您对电子表格服务执行了多次调用,这会大大降低代码的速度,正如您可以在下面阅读的一样 怎么办?
- 除了根据应用程序脚本最佳实践优化代码外,您还可以使用
- 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();
}
注意:
此代码可以进一步优化以更快地运行正如您正确注意到的,您的代码可能会与模拟表单提交发生冲突 为什么? 因为您对电子表格服务执行了多次调用,这会大大降低代码的速度,正如您可以在下面阅读的一样 怎么办?
- 除了根据应用程序脚本最佳实践优化代码外,您还可以使用
- 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();
}
注意:
此代码可以进一步优化以更快地运行i脚本我有行“get last row”我想当提交此代码的第二行出现错误i脚本我有行“get last row”我想当提交此代码的第二行出现错误谢谢您的有用回答我想在表单中设置确认消息,并在工作表中添加一些单元格。我该怎么办?我不知道你所说的确认信息是什么意思-你是指电子邮件的正文吗?当前,它被设置为
Responses.getRange(lastRow,5).getValue()
,如果您指定了正确的单元格,它应该可以正常工作。如果问题仍然存在,我建议你写一篇新帖子,更详细地解释确认信息的问题,如果有助于排除故障,也许可以提供一份样本电子表格的副本。感谢你有用的回答,我想在表单中设置确认信息,并在工作表中添加一些单元格。我该怎么办?我不知道你所说的确认信息是什么意思-你是指电子邮件的正文吗?当前,它被设置为Responses.getRange(lastRow,5).getValue()
,如果您指定了正确的单元格,它应该可以正常工作。如果问题仍然存在,我建议你写一篇新的帖子,更详细地解释确认消息的问题,如果有助于排除故障,也许可以提供一份样本电子表格的副本。