5

私は周りを見回して、断片を持っていますが、パズルを組み立てることができません. 毎日実行するように構成されたトリガーで実行されるスクリプトを作成しようとしています。トリガーは、エディターの [リソース] オプションで設定されます。

基本的に、セルの範囲をキャプチャし、列に入力される期日を特定し、現在の日付に一致させるスクリプトを探しています。一致する場合は、メールを送信します。Google のスプレッドシート チュートリアルからメールを送信するところから始めました。日付を確認するためにifステートメントを追加しましたが、dataRangeとの比較で失われています。誰でもこれらの修正を手伝ったり、研究の方向性を教えてくれるかもしれません。

スクリプトは実行されているように見えますが、何も起こりません。これは、「if (currentTime == 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 行目)」。しかし、それでもメールは送信されます。日付を比較し、日付が一致する場合にのみメールを送信する必要があります。行ごとにメールを送信します。コードとスプレッドシートの設定方法を確認するために、スプレッドシートを共有しました。 共有スプレッドシート

ロガーと 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)
            }    
   }
  }
4

3 に答える 3

7

これがコードの動作バージョンです。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)
    }    
  }
}

ログを確認することを忘れないでください;-)

于 2012-06-16T22:23:15.937 に答える
3

私ならこうします……。

次のようにスプレッドシートを設定します: 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 ドキュメントのスプレッドシートを開きます。リンクには「key=A0a0df...」が含まれており、コードを貼り付けます。例を参照してください。

JavaScript: Java Script の使用について詳しく知りたい場合は、http://www.w3schools.com/js/default.aspをお勧めします。

于 2012-06-14T02:43:16.470 に答える
1

ここで2つの異なるオブジェクトを比較しています

    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 */ 
  }
}
于 2012-06-14T07:06:59.580 に答える