提交 Google 表单后发送电子邮件
Send an email on submission of a Google form
每当用户向我的 Google Sheet 提交 Google 表单时,我想触发 OnSubmit 函数以使用表单字段中的电子邮件地址自动发送电子邮件回复,连同提交的计算 'right/wrong' 数据验证。由于最新的表单提交数据进入 sheet 的最后一行,我尝试了以下代码从 sheet 中提取这两个数据(即使我可以使用电子邮件地址的函数参数) .
我还设置了表单提交事件触发器和电子邮件授权。但电子邮件似乎不起作用。如果设置为在提交表单时触发,我还需要 运行 脚本编辑器中的函数吗?但是,当我尝试单击 运行 时,代码超出了执行时间。
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);
}
}
我了解到您正试图让脚本等待计算完成。
然而,
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);
}
每当用户向我的 Google Sheet 提交 Google 表单时,我想触发 OnSubmit 函数以使用表单字段中的电子邮件地址自动发送电子邮件回复,连同提交的计算 'right/wrong' 数据验证。由于最新的表单提交数据进入 sheet 的最后一行,我尝试了以下代码从 sheet 中提取这两个数据(即使我可以使用电子邮件地址的函数参数) .
我还设置了表单提交事件触发器和电子邮件授权。但电子邮件似乎不起作用。如果设置为在提交表单时触发,我还需要 运行 脚本编辑器中的函数吗?但是,当我尝试单击 运行 时,代码超出了执行时间。
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);
}
}
我了解到您正试图让脚本等待计算完成。
然而,
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);
}