【问题标题】:Google Sheet - Email谷歌表格 - 电子邮件
【发布时间】:2019-11-09 04:48:10
【问题描述】:

我正在考虑在提交 Google 表单时触发自动电子邮件。它工作正常,但是我在下面的代码中遇到了 3 个问题

  1. 每次响应都会触发两封电子邮件,而我只希望发送一封电子邮件
  2. 电子邮件是从“所有者”的 ID 发送的,而不是通过 Google 表单提交回复的那个。
  3. 它应该在 col 7 中将所有成功发送的电子邮件的状态捕获为“EMAIL SENT”,但它没有这样做。
// has been sent successfully.
var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow();   // Number of rows to process
  var dataRange = sheet.getRange(numRows, 2, 1, sheet.getLastColumn());
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[5];  // First column
    var message = 'Hello,'+ "\n"
                   +  "\n" 
                   + 'We have received an inquiry from your customer in Inbound'+ ".\n"
                   + "\n"
                   + 'Lead No is' + " - " 
                   +  row[1] + "\n"
                   +  "\n"
                   + 'Kindly arrange a callback'+ "\n"
                   + "\n"
                   + 'Regards,'+ "\n"
                   + 'Team Inbound' + "\n"
                   + "\n"
                   + 'This is an auto-generated email'; // Second column
    var emailSent = row[7];     // Third column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Inbound Inquiry"+ " - " + row[1];
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

【问题讨论】:

标签: google-apps-script google-sheets gmail google-forms


【解决方案1】:

试试这个方法:

function sendEmails() {
  var sheet=SpreadsheetApp.getActiveSheet();
  var startRow=2;  
  var dataRange=sheet.getRange(startRow,1,sheet.getLastRow()-startRow+1,sheet.getLastColumn());//I think startRow is a better fit for the first parameter and my guess is that you did't really intend for data.length to be only 1 row.
  var data=dataRange.getValues();
  for (var i=0;i<data.length;++i) {
    var row=data[i];
    var emailAddress=row[5];//column 6
    var message=Utilities.formatString('Hello,\n\nWe have received an inquiry from your customer in Inbound.\n\nLead No is - %s\n\nKindly arrange a callback.\n\nRegards,\nTeam Inbound\n\nThis is an auto-generated email.',row[1]);    
    var emailSent = row[7];//column 8
    if (emailSent != "EMAIL_SENT") {  // Prevents sending duplicates
      var subject = "Inbound Inquiry"+ " - " + row[1];//column 2
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 8).setValue("EMAIL_SENT");//column 8 and I don't think it's necessary to flush in the loop
    }
  }
}

检查 cmets 以确保我得到了正确的列。

Read Sheet.getRange(row, column, number of rows, number of columns)

【讨论】:

  • 对于我们这些不太敏感的人,请您添加一些关于您的答案如何解决 OP 问题的解释。我可以看到您的数据范围从 A 列开始,B 列中的 OP;您的范围涵盖所有数据,OP 只有一行;你不会脸红(如果你不介意我这么说的话);然后呢??
  • 好吧,我的猜测是 OP 实际上并不打算让它只有一行。所以是的,这有点猜测。并且以类似的方式,我认为 OP 并不想在这里使用 numRows sheet.getRange(numRows, 2, 1, sheet.getLastColumn()); 我认为 startRow 更有意义。最后,我只是认为没有必要冲洗。它只会阻塞循环。
  • 听起来很合理。但我仍然对它如何解决 OP 的三个问题中的任何一个感到困惑。我想布丁的证据就是在吃东西——OP 希望在某个时候做出回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多