Google表格代码可在数据输入空白列后发送带有选定单元格的电子邮件

时间:2019-05-23 00:18:27

标签: google-apps-script google-sheets

尝试创建一个Google表格脚本,一旦将值输入到一个空列(M列)中,就应该发送一封包含E3,F3,电子邮件中的H3,I3,J3,K3,L3,M3,N3,O3。

该脚本应在每次将数据输入到M列时运行

function sendEmail() { 
        // return all data in active spreadsheet
        var values = 
        SpreadsheetApp.getActiveSheet().getDataRange().getValues()
        for (i in values.length) { 
           //iterate over each row
              var data= values[i][14];
              var emailAddress = "someGuy@gmail.com";
              var subject = "Marshal's Notice detected" 
              var message = values[i][E3] [F3] [H3] [I3] [J3] [K3] [L3] [M3] 
                  [N3] [O3];
            // if data cell is greater than one, send an email for this row
               if (data > 1) ;{
                    MailApp.sendEmail(emailAddress, subject, message);
                   }
                 }
       }

1 个答案:

答案 0 :(得分:0)

使用values[i][E3]不起作用-您需要传递整数以获取要在数据数组中查找的值。我对您的脚本进行了一些更改,并在下面进行了说明。

function sendEmail() { 
  // return all data in active spreadsheet
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  for (var i = 0; i < values.length; i++) { 
    //iterate over each row
    var data = values[i][12];
    var emailAddress = "email@address.com";
    var subject = "Marshal's Notice detected" 
    var message = values[2][4] + values[2][5] + values[2][7]    //e3, f3 & h3
                + values[2][8] + values[2][9] + values[2][10]   //i3, j3 & k3
                + values[2][11] + values[2][12] + values[2][13] //l3, m3 & n3
                + values[2][14];                                //o3
    // if data cell is greater than one, send an email for this row
    if (data > 1 && values[i][15] == '') {
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(i+1, 16).setValue('email sent!');
    }
  }
}

我已将您的for循环更改为可运行的值长度:

for (var i = 0; i < values.length; i++) { 

然后在您尝试访问E3等的地方,我给了正确的整数以访问您要查找的特定单元格,例如values[2][4],因为它们的索引为0,这将为您提供单元格第3行第5列= E3。

要阻止此脚本发送相同电子邮件的倍数,我添加了一行,将列P的值设置为“已发送电子邮件”,然后在您的if语句中添加了一个检查以确保它没有尚未发送到该行。

if (data > 1 && values[i][15] == '') {
  MailApp.sendEmail(emailAddress, subject, message);
  sheet.getRange(i+1, 16).setValue('Email Sent');
}

在其他评论后进行编辑:

我整理了以下代码,这些代码应符合您所有的新条件。

function onEdit(e) { 
  // return all data in active spreadsheet
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  for (var i = 0; i < values.length; i++) { 
    //iterate over each row
    var editCol = e.range.getColumn();
    var emailAddress = "email@address.com";
    var subject = "Marshal's Notice detected" 
    var message = values[i][4] + values[i][5] + values[i][7]    //e3, f3 & h3
                + values[i][8] + values[i][9] + values[i][10]   //i3, j3 & k3
                + values[i][11] + values[i][12] + values[i][13] //l3, m3 & n3
                + values[i][14];                                //o3
    // if data cell is greater than one, send an email for this row
    if (values[i][13] !== '' && editCol === 13 && values[i][15] === '') {
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(i+1, 16).setValue('email sent!');
    }
  }
}
  1. 代码现在检查要添加数据的列。为此,我必须将其放入onEdit触发器中,然后使用事件对象获取已输入数据的列,然后在我的if语句中对此进行检查。
  2. 代码正在专门抓取数据的第3行,现在已更改为使用i,它将抓取正在处理的行的数据。
  3. 我还在if语句中添加了一个检查以确保已填充N列,如果尚未计算数据,这应该避免发送任何电子邮件。