Javascript 根据编辑的列向以前的Google表单提交发送电子邮件

Javascript 根据编辑的列向以前的Google表单提交发送电子邮件,javascript,forms,email,google-apps-script,Javascript,Forms,Email,Google Apps Script,我的谷歌脚本有问题。它实际上是按原样工作的,但问题是,在提交表单并且有人提交了新表单之后,第一个提交的表单将不再发送电子邮件,因为它正在查找最后一行。我很难让它正常工作。。。有人能帮忙吗 以黄色突出显示的列由供应商填写后,右侧第5列(绿色)也应填写“已发送”,让用户知道已向创建表单的人员发送电子邮件 这里有一张表格的图片,希望能得到一个更好的想法 函数sendNotification(){ var doc=SpreadsheetApp.getActiveSpreadsheet(); var s

我的谷歌脚本有问题。它实际上是按原样工作的,但问题是,在提交表单并且有人提交了新表单之后,第一个提交的表单将不再发送电子邮件,因为它正在查找最后一行。我很难让它正常工作。。。有人能帮忙吗

以黄色突出显示的列由供应商填写后,右侧第5列(绿色)也应填写“已发送”,让用户知道已向创建表单的人员发送电子邮件

这里有一张表格的图片,希望能得到一个更好的想法

函数sendNotification(){
var doc=SpreadsheetApp.getActiveSpreadsheet();
var sheet=doc.getSheets()[0];
var startRow=sheet.getLastRow();
var dataRange=sheet.getRange(startRow,1,1,21);
var data=dataRange.getValues();
var行;
对于(数据中的i){
行=数据[i];
var EMAIL_SENT=‘SENT’;
var emailSent=行[19];//第三列
如果(emailSent!=EMAIL_SENT){//防止发送重复的邮件
//定义通知详细信息
var subject=“第12行已编辑!”;
变量体=
“产品检查”
+“
时间:” +第[0]行 +“
请求的电子邮件:” +第[1]行 +“
请求日期:” +第[2]行 +“
ISBN:” +第[4]行 +“
产品名称:” +第[7]行 +“
供应商名称:” +第[8]行 +“
采购订单编号:” +第[10]行 +“
评论:” +第[12]行 +“
在此处查看电子表格:”; 如果(第[13]行!=''和第[0]行!=''和第[18]行=''){ var recipients=行[1]; var subject=“列“N”已编辑!”; sheet.getRange(startRow,19,1,1).setValue(已发送电子邮件)和sheet.getRange(startRow,19,1,1).setBackgroundColor(“00ff00”); SpreadsheetApp.flush(); MailApp.sendmail({ 收件人:收件人:, 主题:主题,, htmlBody:body}); }
您描述的行为是正常的,您自己已经发现了起源

不使用最后一行作为引用,只使用与第[19]行对应的列中没有“EMAIL_SENT”的第一行,这一行将是正确的

但在并发的情况下,只处理一个请求,所以我建议您使用计时器触发器每隔几分钟运行一次代码,以便在每种情况下都处理所有提交


另一种解决方案是使用表单提交触发器,但从处理程序回调对象而不是工作表(例如namedValues,)获取值但这意味着您的代码会有更多的更改。在后一种情况下,每次提交都会独立处理,即使是两次或更多提交都集中在一起。

因此,当您有多个用户同时访问同一个电子表格时,就会出现问题?我们有1组用户提交表单,1组用户编辑表单回复表单(第N列)…只有在编辑第N列后最后一行才会发送电子邮件。感谢您的回复。在提交表单时,我已经发送了一封基本电子邮件,向提交表单的人发送电子邮件。问题是,我们有另一组用户(例如第N列)在表单提交后手动编辑响应表单。因此,多个表单在其他组之前填写并提交(第N列)时发生了这种情况有时间编辑。如果发生这种情况,只有最后一行会发送电子邮件——其他行都不会发送,那么计时器解决方案将是最佳选择…任何没有“email_sent”的行Serge,你有关于如何使用e.namedValues的例子吗?或者你能给我指引正确的方向吗?谢谢你的时间关于e.namedValues请看这篇关于触发器的文章:只需创建一个触发器,每5分钟运行一次你的函数。如果执行时间不太长就足够了。如果没有,你可以设置一个更多的c仅在“工作时间”运行的复合触发器。
function sendNotification() {
 var doc = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = doc.getSheets()[0];
 var startRow = sheet.getLastRow();
 var dataRange = sheet.getRange(startRow, 1, 1, 21) ;
 var data = dataRange.getValues();
 var row;
 for (i in data) {
 row = data[i];
 var EMAIL_SENT = 'Sent';
 var emailSent = row[19];     // Third column
  if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates

   //Define Notification Details
  var subject = "Row 12 has been edited!";
  var body = 
          '<html><body><b><u>Product Check</u></b>'
           + '<br><b>Time: </b>'
           + row[0]
           + '<br><b>Email requested: </b>'
           + row[1]
           + '<br><b>Request date: </b>'
           + row[2]
           + '<br><b>ISBN: </b>'
           + row[4]
           + '<br><b>Product Title: </b>'
           + row[7]
           + '<br><b>Supplier Name: </b>'
           + row[8]
           + '<br><b>PO Number: </b>'
           + row[10]
           + '<br><b>Comments: </b>'
           + row[12]
           + '<br>View the spreadsheet here: <a     href="#"><b>Click here</b></a> </html></body>';
 if (row[13] != '' && row[0] != '' && row[18] == '') {
  var recipients = row[1];
  var subject = "Column 'N' was edited!";
  sheet.getRange(startRow, 19, 1, 1).setValue(EMAIL_SENT) && sheet.getRange(startRow, 19, 1, 1).setBackgroundColor("#00ff00");
  SpreadsheetApp.flush();

    MailApp.sendEmail({
    to: recipients,
    subject: subject,
    htmlBody: body}); 
 }