如果单元格与今天的日期匹配,如何通过电子邮件发送多行 google sheet table

How to send several rows of google sheet table via email if cell match today's date

每天我必须通过电子邮件向几个收件人发送不同数量的 google sheet table 行(这取决于出发的卡车数量)。

请你帮我举个例子,如果单元格匹配今天的日期,如何收集几行 google table 然后通过电子邮件发送?

例如,我需要获取包含今天日期的所有行,并通过电子邮件发送 A、B、C、E 列的数据。

提前感谢您的帮助:)

让我们一步一步来。我假设 A 列包含日期。不对请修改:

  1. 声明我们将为此使用的变量
function main() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sheet.getActiveSheet();
  var row_count = sheet.getLastRow() - 1;  
  var today = Utilities.formatDate(new Date(), "UTC", "dd.MM.yyyy"); //You can use the date format you prefer
  var data = sheet.getRange("A2:E"+ (row_count + 1)).getValues(); //We get all the values from A to E and from row 2 to the last one.

  countToday(sheet, today, row_count, data);
  sendEmails(data);


}
  1. 由于我们在数据的每个位置都有每一行,所以我们将比较 每个日期 "today",我们将从中删除(拼接)行 其他日子。具有有效日期的行将保留在变量中:
function countToday(sheet,today, row, data){

  var lastrow = "A" + (row + 1);
  var col_A = sheet.getRange('A2:'+lastrow).getValues();


  for (var i = row; i >= 0; i--){
    if (col_A[i] != today){
      data.splice(i, 1); //
    }

  }

}
  1. 现在我们得到了每一行元素,我们可以发送电子邮件了。我们将创建一个 html table 以便更容易理解。 Mailapp 功能使它变得非常简单:

function sendEmails(data){

 MailApp.sendEmail({
    to: "example1@mail.com" + "example2@mail.com", //You can put as many emails you want
    subject: "Example",
    htmlBody:"<html><body>" + createTable(data)+ "</body></html>"});

}
  1. 要创建 html table,我们只需创建一个编码为 html 的字符串 Sheet 中的列名称。然后我们制作一个 table 数组, 我们将从 data 中用逗号分隔的每个元素(即每个 sheet 单元格)拆分,并将其添加到变量的末尾。 将为我们创建行。
function createTable(data){
  var cells = [];

  var table = "<html><body><br><table border=1><tr><th>Date</th><th>Column B</th><th>Column C</th><th>Column D</th><th>Column E</tr></br>";

  for (var i = 0; i < data.length; i++){
      cells = data[i].toString().split(",");
      table = table + "<tr></tr>";

      for (var u = 0; u < cells.length; u++){
          table = table + "<td>"+ cells[u] +"</td>";
      }
  }

  table=table+"</table></body></html>";
  return table;
}

这是我的代码示例。但是我不知道如何实现防止重复发送邮件的功能。 EMAIL_SENT 仅适用于 "for" 循环。但在那种情况下,如果单元格不包含 "EMAIL_SENT" 字符串,则电子邮件发送的次数与空单元格的次数一样多。

function main() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sheet.getSheetByName("HR-SI B2C");
  var row_count = sheet.getLastRow() - 1;  
  var today = Utilities.formatDate(new Date(), "UTC", "dd/MM/yyyy"); //You can use the 
  date format you prefer
  var data = sheet.getRange("A3:K"+ (row_count + 1)).getValues(); //We get all the 
  values from A to E and from row 2 to the last one.
  var lastrow = "A" + (row_count + 1);
  var col_A = sheet.getRange('A3:'+lastrow).getDisplayValues();
  var row = data[i];

for (var i = row_count; i >= 0; i--){

  if (col_A[i] != today){
  data.splice(i, 1);
  }
}

if (("K" + (row_count+2)) == "EMAIL_SENT"){

}else if(("D" + (row_count)) == "" || ("F" + (row_count)) == ""){
  dontSendEmail();
}else{
  sendEmailsQHNBRGR(data);

 }
}

//-----------------------------------------------------------------------------------

function dontSendEmail(){

 var today = Utilities.formatDate(new Date(), "UTC", "dd/MM/yyyy"); //You can use the 
  date format you prefer

 MailApp.sendEmail({
   to: "xxxxxxxxxx@gmail.com", //You can put as many emails you want
   subject: "Brak wpisanych ilości dla HR i SI za " + today,
   htmlBody:"<html><body> Witam,<br><br>" + 
   "<span><b>Proszę bardzo wpisać ilości dla HR i SI do tabeli</b></span>" +
   "</body></html>"});  

} 

//-----------------------------------------------------------------------------------

function sendEmailsQHNBRGR(data, platesNum){

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sheet.getSheetByName("HR-SI B2C");
  var row_count = sheet.getLastRow() - 1;  
  var today = Utilities.formatDate(new Date(), "UTC", "dd/MM/yyyy"); //You can use the date format you prefer
  var data = sheet.getRange("A3:G"+ (row_count + 1)).getDisplayValues(); //We get all the values from A to D and from row 2 to the last one.  
  var cells = [];
  var table = "<html><body><table border=3><tr><th>Date</th><th>Day</th><th>HR [pcs]</th><th>HR [ep]</th><th>SI [pcs]</th><th>SI [ep]</th></tr>";
  var lastrow = "A" + (row_count + 1);
  var col_A = sheet.getRange('A3:'+lastrow).getDisplayValues();

  MailApp.sendEmail({
    to: "xxxxxxx@gmail.com", //You can put as many emails you want
    subject: "(HR+SI) Orsay prealert " + today,
    htmlBody:"<html><body> Dear All,<br><br>" + 
    "<span style=background-color:rgb(217,234,211)><b>Today we've sent e-com goods in listed quantity:</b></span>" +
    createTable(data) + "<br>" + 
    "<span style=background-color:rgb(255,242,204)><b>@DPD team, could you pick it up 
tomorrow at 02:00 PM?</b></span><br>" + 
    "</body></html>"});  

}

//-----------------------------------------------------------------------------------

 function createTable(data){

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sheet.getSheetByName("HR-SI B2C");
  var row_count = sheet.getLastRow() - 1;  
  var today = Utilities.formatDate(new Date(), "UTC", "dd/MM/yyyy"); //You can use the date format you prefer
  var data = sheet.getRange("A3:G"+ (row_count + 1)).getDisplayValues(); //We get all the values from A to D and from row 2 to the last one.  
  var cells = [];
  var table = "<html><body><table border=3><tr><th>Date</th><th>Day</th> 
    <th>Plates number</th><th>HR [pcs]</th><th>HR [ep]</th><th>SI [pcs]</th> 
    <th>SI [ep]</th></tr>";
  var lastrow = "A" + (row_count + 1);
  var col_A = sheet.getRange('A3:'+lastrow).getDisplayValues();

  for (var i = row_count; i >= 0; i--){

    if (col_A[i] != today){
       data.splice(i, 1);
    }

  }

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

      cells = data[i].toString().split(",");
      table = table + "<tr></tr>";

      for (var u = 0; u < cells.length; u++){
        table = table + "<td>"+ cells[u] +"</td>";
        sheet.getRange("K3:K"+ (row_count + 1)).setValue("EMAIL_SENT");

    }
  }

  table=table+"</table></body></html>";
  return table;

 }
}