如何仅向最后一次 Google 表单提交发送电子邮件?

How to send an email only to the last Google form submission?

我正在使用 Google 课堂表格 'store' 供学生从中购买物品。学生收银员将填写表格,然后 sheet 将向购买商品的学生发送一封电子邮件收据。该电子邮件使用我当前的代码和触发器发送正常,但是,它会在每次新提交时向所有提交发送一封电子邮件。我只希望它发送到最后一次提交。我知道可能有一个简单的解决方法,我只是忽略了一些东西。这是我当前的代码:

function sendAutomatedEmails() {
  var spreadSheet = SpreadsheetApp.getActiveSheet();
  var dataRange = spreadSheet.getDataRange();
  
  var data = dataRange.getValues();
  for (var i = 1; i< data.length; i++) {
    (function(val) {
      var row = data[i];
      var emailAddress = row[3];
      var message = 'At '+ row[0] + 'You purchased the following:' + '\n\n' + row[4] + '\n' + row[5] + '\n' + row[6] + '\n' + row[7] + '\n' + row[8] + '\n' + row[9] + '\n' + 'Your total cost is $' + row[10];
      var subject = 'Personal Purchase Reciept';
      MailApp.sendEmail(emailAddress, subject, message);
    })(i);
  }
}

我不能每次都删除提交,因为另一个课堂作业是每周检查我们的网上银行系统中的购买是否已支付,这时提交将被删除。非常感谢任何帮助。

这将满足您的需要。使用 .getDataRange() 可以解决问题 sheet。然后循环遍历数据并为每一行发送一封电子邮件。我假设你从某个地方得到了脚本?

function sendAutomatedEmails() {
  var spreadSheet = SpreadsheetApp.getActiveSheet();
  var dataRange = spreadSheet.getRange(spreadSheet.getLastRow(), 1, 1, spreadSheet.getLastColumn()).getValues();
  var row = dataRange[0];
  var emailAddress = row[3];
  var message = 'At ' + row[0] + 'You purchased the following:' + '\n\n' + row[4] + '\n' + row[5] + '\n' + row[6] + '\n' + row[7] + '\n' + row[8] + '\n' + row[9] + '\n' + 'Your total cost is $' + row[10];
  var subject = 'Personal Purchase Reciept';
  MailApp.sendEmail(emailAddress, subject, message);
}

参考:

即使同时提交多个表单,此功能也会发送表单提交中数据的电子邮件。如果您希望同时提交多个,则应考虑在函数中使用 Lock Service。这不需要对数据进行任何额外的读取 sheet 因为所有这些信息都已经在 formSubmit 事件对象中。

function sendAutomatedEmails(e) {
  let message = 'At ' + e.values[0] + 'You purchased the following:' + '\n\n' + e.values[4] + '\n' + e.values[5]+ '\n' + e.values[6] + '\n' + e.values[7] + '\n' + e.values[8] + '\n' + e.values[9] + '\n' + 'Your total cost is $' + e.values[10];
  MailApp.sendEmail(e.values[3], 'Personal Purchase Receipt', message);
}

function runThisToSetupTrigger() {
  const ss = SpreadsheetApp.getActive();
  if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == 'sendAutomatedEmails').length == 0) {
    ScriptApp.newTrigger('SendAutomatedEmails').forSpreadsheet(ss.getId()).onFormSubmit().create();
  }
}