2012-06-14 43 views
4

我环顾四周,看到了一些小零件,但无法将拼图放在一起。我正在尝试创建一个脚本,该脚本将在配置为每天运行的触发器上运行。触发器将在编辑器的“资源”选项下进行设置。Google Apps脚本 - 根据单元格中的日期发送电子邮件

基本上我正在寻找脚本来捕获一系列的单元格,确定一个截止日期,它将填充到列中,并与当前日期相匹配。如果匹配,则发送电子邮件。我已经开始从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) 

} 

} 

} 

该代码似乎运行,但我在脚本编辑器中收到以下错误w /。 “无法发送电子邮件:没有收件人(第23行)”。但它仍然发送电子邮件。它应该比较日期,如果日期匹配,则只发送电子邮件。它发送每一行的电子邮件。我分享了电子表格以查看代码以及如何设置电子表格。 Shared Spreadsheet

更新代码W/SERGE帮助记录器和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(); 
    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) 
      }  
    } 
    } 

回答

3

这里是你的代码的工作版本,我使用的工具。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) 
    }  
    } 
} 
重新启用

不要忘记看日志;-)

+0

好的..好..看起来像正在取得进展..感谢您使用记录器..如果你注意到Browswer.msgBox评论我试图自己调试一下。但日志记录要好得多。所以看起来目前的日期显示提前一天。 6/17/2012?当它输出到日志2012:06:17 =? 2012:06:15不知道为什么它会拉明天的日期,而不是实际的一天..要开始挖掘,并会更新,因为我发现:) – jjones312

+0

得到它的工作,不知道它的最好或最聪明的方式。我在当前日期使用了.setHours,.setMinutes和setSeconds,现在这些日期与从电子表格中提取的日期相匹配。电子邮件流量恰到好处:)谢谢Serge帮助我解决这个问题。如果有人认为我加入.setHOurs等方法,请让我知道。 Javascript对我来说是新鲜事,所以我试图吸收我可以..再次感谢.. – jjones312

+0

你有问题可能与时区有关,我用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("[email protected]", "sendEmail script error", errorDetails.message); 
     } 

    } 
    } 
} 

触发:

由于触发器,您需要打开电子表格使用openById。 为此,请在代码中将'使用电子表格网址输入电子表格的关键字'。 要找到密钥,请打开Goog​​le文档电子表格,该链接具有“key = A0a0df ...”粘贴代码。看例子。

的JavaScript: 如果您想了解更多关于使用Java脚本,我建议http://www.w3schools.com/js/default.asp

+0

感谢您对w3schools的建议..我实际上已经查看了该网站的参考资料等。我实际上在lynda.com注册以帮助以及利用几本书。我只是冒险进入JavaScript,因此我的公司是Google Apps公司的Google Apps Script。我喜欢倾向于下面的斯里克选项,因为我认为它更符合我的需求..基本上有一个项目计划电子表格,具有信息列。IE任务列,分配给,电子邮件,截止日期脚本应运行并标识截止日期,与当前日期匹配,并在匹配时发送电子邮件通知。 – jjones312

1

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

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 */ 
    } 
} 
+0

感谢您的反馈..我目前正在测试它,并不是他们所有的方式,但我认为我越来越接近。我有一个问题,因为我是JavaScript/GAS的新手,完全理解“for(var i in data)”。我看到你已经在GAS教程中以这种方式添加了它的“for(i in data)”。任何人都可以帮助我理解这一点,“我”意味着什么? – jjones312

+0

“我”是一个基于变量数据中的数组获取值的变量吗? – jjones312

+0

这里是更新的代码添加来自Srik的反馈..仍然无法让它识别并发送电子邮件。我有一个Google电子表格,包含三列A,B,C。a = email,b =任务,c =数据到期。脚本应该捕获从a2:c6开始的范围(填写6行),看看列C中输入的日期是否与当前日期匹配,如果是的话发送电子邮件。日期格式是否因为它不匹配而关闭? – jjones312

相关问题