Google 表单提交,发送电子邮件锁定不起作用
Google Form on Submit, Send Email Lock Doesn't Work
我创建了一个带有电子邮件字段的 google 表单。响应存储在 spreadsheet 中。在提交时,我从 sheet(最新响应)中取出最后一行并向该用户发送一封电子邮件。
我已经尝试实现一个锁定系统,但是它并没有像我希望的那样工作。如果有多个快速连续提交(即一分钟内 3 个)只有最后一个用户会收到发送给他们的电子邮件,他们实际上会收到 3 个重复的电子邮件,即快速连续提交的数量。
function EmailFormConfirmation() {
// Get a public lock on this script, because we're about to modify a shared resource.
var lock = LockService.getScriptLock()
// Wait for up to 30 seconds for other processes to finish.
lock.waitLock(30000);
try {
var sheetname = "reg-responses"
var columnnumber = 4
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetname);
// Determines row number of most recent form submission and sets it as "lastrow"
if (sheet.getRange(sheet.getMaxRows(),1).getValue() != "") {
var lastrow = sheet.getMaxRows()
}
else {
var count = 0
for (var i = 0; i < sheet.getMaxRows(); i++) {
if (sheet.getRange(sheet.getMaxRows()-i,1).getValue() != "") {
var lastrow = sheet.getMaxRows()-i
break;
}
}
}
var email = sheet.getRange(lastrow,columnnumber).getValue();
var name = sheet.getRange(lastrow,2).getValue();
var message = "<HTML><BODY>"
+"<h3>Your registration has been submitted</h3>"
+"<p><b>Name</b>: "+name+"</p>"
+"</HTML></BODY>";
//validation is handled on the form as regex
MailApp.sendEmail(email, "Form Submitted", "", {htmlBody: message});
//flags it as email sent
sheet.getRange(lastrow,8,1,1).setValue("Email Sent");
//Here is the catch if the lock doesn't work
if(!lock.hasLock()){
Logger.log('Could not obtain lock after 30 seconds.');
}
//Secondary catch for the entire function.
} catch (e) {
Logger.log(e.toString());
}
// Release the lock so that other processes can continue.
lock.releaseLock();
}
我必须在我的锁上解决什么问题才能解决这个问题?
您可以检查 sheet 中的所有行,而不仅仅是最后一行,如果该行没有将标志设置为 "Email Sent",请发送电子邮件。
这里的问题不是锁定,而是您只检查了最后一行。
我创建了一个带有电子邮件字段的 google 表单。响应存储在 spreadsheet 中。在提交时,我从 sheet(最新响应)中取出最后一行并向该用户发送一封电子邮件。
我已经尝试实现一个锁定系统,但是它并没有像我希望的那样工作。如果有多个快速连续提交(即一分钟内 3 个)只有最后一个用户会收到发送给他们的电子邮件,他们实际上会收到 3 个重复的电子邮件,即快速连续提交的数量。
function EmailFormConfirmation() {
// Get a public lock on this script, because we're about to modify a shared resource.
var lock = LockService.getScriptLock()
// Wait for up to 30 seconds for other processes to finish.
lock.waitLock(30000);
try {
var sheetname = "reg-responses"
var columnnumber = 4
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetname);
// Determines row number of most recent form submission and sets it as "lastrow"
if (sheet.getRange(sheet.getMaxRows(),1).getValue() != "") {
var lastrow = sheet.getMaxRows()
}
else {
var count = 0
for (var i = 0; i < sheet.getMaxRows(); i++) {
if (sheet.getRange(sheet.getMaxRows()-i,1).getValue() != "") {
var lastrow = sheet.getMaxRows()-i
break;
}
}
}
var email = sheet.getRange(lastrow,columnnumber).getValue();
var name = sheet.getRange(lastrow,2).getValue();
var message = "<HTML><BODY>"
+"<h3>Your registration has been submitted</h3>"
+"<p><b>Name</b>: "+name+"</p>"
+"</HTML></BODY>";
//validation is handled on the form as regex
MailApp.sendEmail(email, "Form Submitted", "", {htmlBody: message});
//flags it as email sent
sheet.getRange(lastrow,8,1,1).setValue("Email Sent");
//Here is the catch if the lock doesn't work
if(!lock.hasLock()){
Logger.log('Could not obtain lock after 30 seconds.');
}
//Secondary catch for the entire function.
} catch (e) {
Logger.log(e.toString());
}
// Release the lock so that other processes can continue.
lock.releaseLock();
}
我必须在我的锁上解决什么问题才能解决这个问题?
您可以检查 sheet 中的所有行,而不仅仅是最后一行,如果该行没有将标志设置为 "Email Sent",请发送电子邮件。
这里的问题不是锁定,而是您只检查了最后一行。