2012-06-14 4 views
4

둘러 보았지만 조각이 있지만 퍼즐을 함께 넣을 수는 없습니다. 매일 실행되도록 구성된 트리거에서 실행되는 스크립트를 만들려고합니다. 편집기의 리소스 옵션 아래에서 트리거가 설정됩니다.Google Apps Script - 셀에있는 날짜를 기준으로 이메일 보내기

기본적으로 나는 셀 범위를 캡처하는 스크립트를 찾고, 기한 내에 날짜가 표시되고 현재 날짜와 일치하는지 확인합니다. 일치하면 이메일을 보내십시오. 스프레드 시트 자습서에서 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 도움말 .. 감사합니다 !!

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

이 코드의 작업 버전, 나는 유틸리티를 사용하는 것입니다 (DATE_COL이 당신의 날짜를 갖는 열입니다)입니다.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 comments 나는 약간 자신을 디버깅하려고했다. 로깅이 훨씬 낫습니다. 현재 날짜가 하루 전에 표시되는 것처럼 보입니다. 6/17/2012 ?? 로그에이를 출력하므로 2012 : 06 : 17 =? 2012 년 6 월 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를 사용하는 스프레드 시트. 이렇게하려면 코드에서 '스프레드 시트 URL의 스프레드 시트 키 입력'을 바꾸십시오. 키를 찾으려면 Google 워드 프로세서 스프레드 시트를 열고 링크에 "key = A0a0df ..."라고 붙여 넣습니다. 예제를 참조하십시오.

자바 스크립트 : 당신은 자바 스크립트를 사용하는 방법에 대한 자세한 내용을 원한다면, 나는 dataRange는 Range 개체 인 반면

if (currentTime == dataRange) { 

currentTime을이 날짜 개체입니다 당신은 여기에 두 개의 서로 다른 객체를 비교하는 http://www.w3schools.com/js/default.asp

+0

w3schools에게 제안 해 주셔서 감사합니다. 실제로 참조 용으로 사이트를 살펴 봤습니다. 실제로 lynda.com에 가입했습니다. 여러 권의 책을 활용할 수 있습니다. 우리 회사가 Google Apps 회사 인 것처럼 자바 스크립트를 비롯하여 Google Apps Script에 더 많이 투자하려고합니다. 나는 내 요구에 더 맞는 것 같아서 Srik 옵션을 선호했다. 기본적으로 정보 열을 가진 스프레드 시트를 계획하고있다. IE 작업 열, 할당, 이메일, 기한 스크립트는 실행해야하며 만기일, 현재 날짜와 일치하고 일치하는 경우 전자 메일 알림을 보냅니다. – jjones312

1

추천 - 그들은 평등하지 않으므로 아무 일도 일어나지 않습니다. 당신이 할 수있는 것은 여기

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

"i"는 변수 데이터의 배열을 기반으로 값을 가져 오는 변수입니까? – jjones312

+0

Srik의 피드백에 업데이트 된 코드가 추가되었습니다. 아직 이메일을 인식하고 발사 할 수 없습니다. A, B, C = 이메일, b = 작업, c = 데이터 등 3 개의 열이있는 Google 스프레드 시트가 있습니다. 스크립트는 a2 : c6 ​​(6 줄 입력)에서 시작하는 범위를 캡처해야합니다. C 열에 입력 한 날짜가 현재 날짜와 일치하는지 확인하십시오. 날짜 형식이 일치하지 않아 원인이 무엇입니까? – jjones312