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