【问题标题】:Google Apps Script - Send Email based on date in cellGoogle Apps 脚本 - 根据单元格中的日期发送电子邮件
【发布时间】:2012-06-14 01:16:22
【问题描述】:

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

基本上,我正在寻找脚本来捕获一系列单元格,确定将填充到列中的截止日期,并将其与当前日期匹配。如果匹配,则发送电子邮件。我从 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 上的更新代码 W/SERGE HELP.. 谢谢!!

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)
            }    
   }
  }

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    这是您的代码的工作版本,我使用 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)
        }    
      }
    }
    

    别忘了查看日志;-)

    【讨论】:

    • 好的..好的..看起来正在取得进展..感谢您使用记录器..如果您注意到 Browswer.msgBox cmets 我正在尝试自己调试一下。但日志记录要好得多。所以看起来当前日期提前一天显示。 2012 年 6 月 17 日??当它输出到日志 2012:06:17 =? 2012:06:15 不太确定为什么它会为明天而不是实际日期拉日期.. 将开始挖掘并在我发现时更新:)
    • 让它工作,不确定它是最好还是最聪明的方法。我在当前日期使用了 .setHours、.setMinutes 和 setSeconds,它们现在与从电子表格中提取的日期匹配。电子邮件流量恰到好处 :) 感谢 Serge 帮助我解决这个问题。如果有人认为我添加了 .setHOurs 等方法,请告诉我。 Javascript 对我来说是新的,所以我试图吸收我能做的。再次感谢..
    • 您遇到的问题可能与时区有关,我使用的 GMT+0200 适合我,但可能不适合您;-) 还要检查电子表格中的设置。 (查看旧论坛以获取有关 GAS 日期的信息)
    【解决方案2】:

    我会这样做......

    像这样设置电子表格: https://docs.google.com/spreadsheet/ccc?key=0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc

    将代码改为:

    function sendEmails() {
      var spreadsheet = SpreadsheetApp.openById('Type spreadsheet key here from spreadsheet URL');       
      /// e.g.  var spreadsheet = SpreadsheetApp.openById('0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc');     
    
      var sheet = spreadsheet.getSheets()[0]; // gets the first sheet, i.e. sheet 0
    
      var range = sheet.getRange("B1"); 
      var dateString = new Date().toString();
      range.setValue(dateString);   // this makes all formulas recalculate
    
      var startRow = 4;  // 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, 4)
      // Fetch values for each row in the Range.
      var data = dataRange.getValues();   
    
      for (i in data) {
        var row = data[i];
        if( row[3] == true) {
          var emailAddress = row[0];  // First column
          var message = row[1];       // Second column
          var subject = "Task Item Due";
          try {
              MailApp.sendEmail(emailAddress, subject, message);
          } catch(errorDetails) {
            // MailApp.sendEmail("eddyparkinson@someaddress.com", "sendEmail script error", errorDetails.message);
          }
    
        }
      }
    }
    

    触发器:

    由于触发器,您需要使用 openById 打开电子表格。 为此,请在代码中替换“在此处从电子表格 URL 键入电子表格密钥”。 要找到密钥,请打开 google docs 电子表格,链接有“key=A0a0df...”粘贴代码。请参阅示例。

    JavaScript: 如果你想了解更多关于使用 Java Script 的知识,我推荐http://www.w3schools.com/js/default.asp

    【讨论】:

    • 感谢 w3schools 的建议。我实际上已经查看了该网站的参考资料等。我实际上已在 lynda.com 注册以帮助并利用几本书。我只是冒险使用 JavaScript 等等,因为我的公司是 Google Apps 公司。我有点倾向于下面的 Srik 选项,因为我认为它更适合我的需要。基本上有一个项目规划电子表格,其中包含信息列。IE 任务列,分配给,电子邮件,截止日期脚本应该运行并识别截止日期,匹配到当前日期,如果匹配,发送电子邮件通知。
    【解决方案3】:

    你在这里比较两个不同的对象

        if ( currentTime == dataRange) {
    

    currentTime 是一个 Date 对象,而 dataRange 是一个 Range 对象——它们永远不会相等,所以什么也不会发生。 您可以做的是(DATE_COL 是包含您的日期的列)

    for ( var i in data ){
      var row = data[i] ; 
      var today = new Date(); 
      var date = new Date(row[DATE_COL]) ; 
    
      if (today.getDate() == date.getDate() && 
          today.getMonth() == date.getMonth() && 
          today.getYear() == date.getYear() {
        /* Your email code here */ 
      }
    }
    

    【讨论】:

    • 感谢您的反馈。我目前正在对其进行测试,虽然不是全部,但我想我已经接近了。我确实有一个问题,因为我是 JavaScript / GAS 的新手,所以我完全理解“for (var i in data)”。我看到你已经在 GAS 教程中以这种方式添加了它,上面写着“for (i in data)”。谁能帮我理解这一点以及“i”的含义?
    • “i”是不是根据变量data中的数组取值的变量?
    • 这是在来自 Srik 的反馈中添加的更新代码。仍然无法让它识别并触发电子邮件。我有一个包含三列 A、B、C 的 Google 电子表格。a = 电子邮件,b = 任务,c = 到期数据。脚本应捕获从 a2:c6 开始的范围(填写 6 行)查看在 C 列中输入的日期是否与当前日期匹配,如果是则发送电子邮件。日期格式是否关闭导致它不匹配?
    • Srik,我一直在编辑您的帖子以添加更新的代码,我不确定为什么它没有通过同行评审?我是新来的,所以不确定我是否只是错过了一些东西。我可以在另一个答案回复中发布它吗?
    • 好的.. 重读常见问题解答我发现我在编辑帖子时出错了.. 对不起,伙计们.. 我的帖子应该更新以查看带有您的建议的新更新代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2022-11-16
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多