Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌表单上提交,发送电子邮件锁不';行不通_Javascript_Google Apps Script_Google Sheets_Google Forms - Fatal编程技术网

Javascript 谷歌表单上提交,发送电子邮件锁不';行不通

Javascript 谷歌表单上提交,发送电子邮件锁不';行不通,javascript,google-apps-script,google-sheets,google-forms,Javascript,Google Apps Script,Google Sheets,Google Forms,我创建了一个带有电子邮件字段的谷歌表单。响应存储在电子表格中。在提交时,我从工作表的最后一行(最新回复)中选择一行,并向该用户发送电子邮件 我曾试图实现一个锁系统,但它不工作的方式,我想它太多。如果有多个快速连续提交(即一分钟内提交3封),只有最后一个用户会收到发送给他们的电子邮件,他们实际上会收到3封重复的电子邮件,数量与快速连续提交的数量相同 function EmailFormConfirmation() { // Get a public lock on this script, bec

我创建了一个带有电子邮件字段的谷歌表单。响应存储在电子表格中。在提交时,我从工作表的最后一行(最新回复)中选择一行,并向该用户发送电子邮件

我曾试图实现一个锁系统,但它不工作的方式,我想它太多。如果有多个快速连续提交(即一分钟内提交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();
}   
函数EmailFormConfirmation(){
//获取此脚本的公钥,因为我们将修改共享资源。
var lock=LockService.getScriptLock()
//等待30秒,等待其他进程完成。
lock.waitLock(30000);
试一试{
var sheetname=“reg响应”
var columnnumber=4
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(sheetname);
//确定最近提交的表单的行号并将其设置为“lastrow”
if(sheet.getRange(sheet.getMaxRows(),1.getValue()!=“”){
var lastrow=sheet.getMaxRows()
} 
否则{
变量计数=0
对于(var i=0;i”
+"";      
//验证在表单上作为regex处理
MailApp.sendmail(电子邮件,“表单已提交”,“,{htmlBody:message});
//将其标记为电子邮件已发送
sheet.getRange(lastrow,8,1,1).setValue(“已发送电子邮件”);
//这是锁坏了的锁销
如果(!lock.hasLock()){
Logger.log('30秒后无法获得锁');
}
//整个函数的二次捕获。
}捕获(e){
Logger.log(例如toString());
}
//释放锁,以便其他进程可以继续。
锁。释放锁();
}   

我必须解决锁上的什么问题才能解决此问题?

您可以检查工作表中的所有行,而不仅仅是最后一行,如果该行的标志未设置为“已发送电子邮件”,请发送电子邮件


这里的问题不是锁,而是您只检查了最后一行。

谢谢!看来我把整个过程复杂化了。我已经实现了您的答案,效果非常好。谢谢@Tudor,您的答案对我很有用。您将获得活动的电子表格,这意味着“表单提交”触发器安装在电子表格中,而不是安装在表单中。指定为“表单提交”触发器的函数可以接收值对象。通常,为该对象分配名为“e”的变量。请参阅以下链接:您可以从事件对象获取当前表单提交值,这比从工作表中检索值要好。正如您的经验所证明的,锁定服务并不能完成大多数人认为它可以完成的任务。这是一个问题。在某些情况下,锁服务基本上是无用的。我没有解决办法。如果谷歌能想出一个解决这个问题的办法,那就太好了。嗯,lockService很好用。锁的具体问题是什么?