javascript - Google Apps 脚本 - 根据单元格中的日期发送电子邮件

标签 javascript google-apps-script google-sheets

我环顾四周,有一些零碎的东西,但无法拼凑起来。我正在尝试创建一个脚本,该脚本将在配置为每天运行的触发器上运行。触发器将在编辑器的资源选项下设置。

基本上,我正在寻找脚本来捕获一定范围的单元格,确定一个到期日期,该日期将填充在一列中,并将其与当前日期相匹配。如果匹配,则发送电子邮件。我从 Google 的电子表格教程发送电子邮件开始。我已经添加了一个 if 语句来检查日期,但是我在与 dataRange 的比较中丢失了它。任何人都可以帮助纠正这些或指出我的研究方向。

脚本似乎运行但没有任何反应,我认为这是因为“if (currentTime == dataRange)”dataRange 没有正确匹配??

代码如下:

function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 50;   // Number of rows to process
// Fetch the range of cells
var dataRange = sheet.getRange(startRow, 1, numRows, 2)
// Fetch values for each row in the Range.
var data = dataRange.getValues();   
//Get todays date     
var currentTime = new Date();
var month = currentTime.getMonth() + 1;
var day = currentTime.getDate();
var year = currentTime.getFullYear();      
//Test column  for date due & match to current date
    if ( currentTime == dataRange) {
  for (i in data) {
var row = data[i];
var emailAddress = row[0];  // First column
var message = row[1];       // Second column
var subject = "Task Item Due";
MailApp.sendEmail(emailAddress, subject, message);

}
}
}

我正在更新 Srik 提供的建议并在下面的代码中提供他的建议。我已经尝试发布几次,所以我不确定为什么它没有通过同行评审?

 function sendEmail() {

var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 50;   // Number of rows to process

var dataRange = sheet.getRange(startRow, 1, numRows, 50);

// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Browser.msgBox(data)

for (i in data) {
var row = data[i];
var date = new Date();
var sheetDate = new Date(row[1]);

if (date.getDate() == sheetDate.getDate() && date.getMonth() == sheetDate.getMonth() && date.getFullYear() == sheetDate.getFullYear());
{
  var emailAddress = row[0];  // First column
  var message = row[2];       // Second column
  var subject = "Sending emails from a Spreadsheet";
  MailApp.sendEmail(emailAddress, subject, message);
 // Browser.msgBox(emailAddress)

}

}

}

代码似乎可以运行,但我在脚本编辑器中收到以下错误。 “发送电子邮件失败:没有收件人(第 23 行)”。但它仍然发送电子邮件。它应该比较日期,并且只在日期匹配时才发送电子邮件。它为每一行发送一封电子邮件。我已经共享了电子表格以查看代码以及电子表格的设置方式。 Shared Spreadsheet

记录器和 Utilities.formatDate 上带有 SERGE 帮助的更新代码.. 谢谢!!

function sendEmail() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = sheet.getLastRow()-1;   // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
// Fetch values for each row in the Range.
var data = dataRange.getValues();
//Logger.log(data)

for (i in data) {
  var row = data[i];
  var date = new Date();
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);
  //Logger.log(date);
  var sheetDate = new Date(row[2]);
 //Logger.log(sheetDate);
 var Sdate = Utilities.formatDate(date,'GMT+0200','yyyy:MM:dd')
 var SsheetDate = Utilities.formatDate(sheetDate,'GMT+0200', 'yyyy:MM:dd')
     Logger.log(Sdate+' =? '+SsheetDate)
        if (Sdate == SsheetDate){
          var emailAddress = row[0];  // First column
          var message = row[1];       // Second column
          var subject = "Your assigned task is due today." +message;
          MailApp.sendEmail(emailAddress, subject, message);
          //Logger.log('SENT :'+emailAddress+'  '+subject+'  '+message)
            }    
   }
  }

最佳答案

这是您代码的工作版本,我使用 Utilities.formatDate 制作日期字符串,因此您可以选择要比较的内容(仅天、小时?分钟?)

我评论邮件调用只是为了我的测试,需要时重新启用它

function sendEmail() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow()-1;   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  Logger.log(data)

  for (i in data) {
    var row = data[i];
    var date = new Date();
    var sheetDate = new Date(row[1]);
    Sdate=Utilities.formatDate(date,'GMT+0200','yyyy:MM:dd')
    SsheetDate=Utilities.formatDate(sheetDate,'GMT+0200', 'yyyy:MM:dd')
    Logger.log(Sdate+' =? '+SsheetDate)
    if (Sdate == SsheetDate){
      var emailAddress = row[0];  // First column
      var message = row[2];       // Second column
      var subject = "Sending emails from a Spreadsheet";
//      MailApp.sendEmail(emailAddress, subject, message);
     Logger.log('SENT :'+emailAddress+'  '+subject+'  '+message)
    }    
  }
}

不要忘记查看日志 ;-)

关于javascript - Google Apps 脚本 - 根据单元格中的日期发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025491/

相关文章:

javascript - 如何在没有用户确认提示的情况下使用 javascript/extendscript 在 Illustrator 中打开一组 PDF 文件?

javascript - RequireJS, $.Deferred 怎么办?

google-apps-script - Google 表格网络应用以所有者身份运行脚本

google-apps-script - 如何在 Google Apps 脚本/表格的 IF 语句中比较当前编辑时间与指定条件时间?

google-apps-script - Google Apps 脚本电子表格返回选定范围

javascript - Google Sheets API Node 客户端库最小示例

javascript - 访问嵌套的 json 数组字段

javascript - 将 promise 变量拆分为命名变量

google-apps-script - 如何从客户端处理程序移动弹出窗口?

javascript - 如何在 Google 脚本中格式化从扫描仪收到的数据?