【问题标题】:Send an email on submission of a Google form在提交 Google 表单时发送电子邮件
【发布时间】:2016-11-23 05:06:56
【问题描述】:

每当用户向我的 Google 表格提交 Google 表单时,我都想触发 OnSubmit 函数,以使用表单字段中的电子邮件地址自动发送电子邮件回复,并计算提交的“正确/错误”数据验证.由于最新的表单提交数据进入工作表的最后一行,我尝试使用以下代码从工作表中提取这两个数据(即使我可以使用电子邮件地址的函数参数)。

我还设置了表单提交事件触发器和电子邮件授权。但是电子邮件似乎不起作用。如果设置为在表单提交时触发,我还需要在脚本编辑器中运行该功能吗?当我尝试单击运行时,代码超过了执行时间。

function OnSubmit(e) {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = sheet.getLastRow()-1; 
  var numRows = 1; // Number of rows altogether


  // Fetch the range of cells A(last row):G(last row)
  var dataRange = sheet.getRange(startRow, 1, numRows, 7);

  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
   var row = data[i];
   var emailAddress = row[2];   // Column C of last row
   var message = ""; 
   while(row[6] === "") {     // Delay until data verification is done
     Utilities.sleep(10000);
   }
   var subject = row[6]  // Column G (data verification cell) of last row
   MailApp.sendEmail(emailAddress, subject, message);
  }
}

【问题讨论】:

  • 使用 Logger 跟踪您的执行情况
  • 您能详细说明一下吗?这是我第一次尝试 Google Apps 脚本。我根据我在网上阅读的内容将代码放在一起。
  • 您不能使用这部分代码:while(row[6] === "") { // Delay until data verification is done Utilities.sleep(10000); } 因为在脚本执行期间您的数据不会更新,因此如果函数为空时 row[6] 为空,则循环将始终是无限的调用。

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


【解决方案1】:

我知道您正试图让脚本等到计算完成。

然而,

while(row[6] === "") {  
 Utilities.sleep(10000);
}

这样做是错误的:变量row 在循环中没有改变。如果数据获取行 var data = dataRange.getValues();while 循环内,则可以。

但有一种比待定更改实际发生更好的方法来确保:使用

SpreadsheetApp.flush(); 

var data = dataRange.getValues();之前

这将应用挂起的计算,并消除对 while 循环的需要。结果:

function OnSubmit(e) {  
  SpreadsheetApp.flush(); 
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getRange(sheet.getLastRow(), 1, 1, 7);
  var data = dataRange.getValues();
  var row = data[0];
  var emailAddress = row[2];   // Column C of last row
  var message = ""; 
  var subject = row[6]  // Column G (data verification cell) of last row
  MailApp.sendEmail(emailAddress, subject, message);
}

【讨论】:

  • 感谢大家指出循环问题!但是,计算的数据(col G)不在表单提交中,因此我不得不尝试从工作表的最后一行而不是函数参数中将其拉出。另外,有一个计算延迟,需要在我提取数据之前检查计算是否完成(因此循环使用不正确)。有什么办法可以做到这一点?
  • OnEdit 似乎也不起作用,因为工作表必须打开,而这意味着在工作表关闭的情况下运行。
  • 非常感谢!我之前在另一个代码 sn-p 上看到了 flush ,但没有意识到它的作用!顺便说一句,我还应该如何优化从最后一行读取的代码?我复制的原始代码是一次发送多封电子邮件,因此代码循环了多行,但实际上我只需要读取最后一行。
  • 使用优化脚本编辑答案。我认为从 getLastRow 的结果中减去 1 是一个错误。 getLastRow 返回带有数据的最后一行的索引,这是我使用的。
  • 非常感谢您帮助我们完成这项工作! :) 非常感谢!点赞!
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多