2012-06-14 138 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

相關問題