1

なぜこれが機能しないのですか?

function sendDuesReminder() {

  var paid = 3;
  var name = 1;
  var submitted = 0;
  var allowance = 9;
  var ms = 86400000; // Number of milliseconds in a day
  var today = new Date();
  var reminder = 72;
  var data = SpreadsheetApp.openById('___').getSheetByName('Master').getDataRange().getValues();

  for (var i = 1; i < data.length; i++) {
    if (data[i][paid] != 'Yes' &&
        data[i][paid] != 'yes' &&
        data[i][reminder] == '' &&
        ((((today.valueOf()) - (data[i][submitted].valueOf()))/ms) > allowance)) {
        MailApp.sendEmail("___", "___") ;
    SpreadsheetApp.openById('___').getSheetByName('Master').getRange(i+1, reminder).setValue(today);
    }

 if (data[i][paid] != 'Yes' &&
        data[i][paid] != 'yes' &&
        data[i][reminder] != null &&
       ((((today.valueOf()) - (data[i][reminder].valueOf()))/ms) > allowance)) {
        MailApp.sendEmail("___", "___") ;
        SpreadsheetApp.openById('___').getSheetByName('Master').getRange(i+1, reminder).setValue(today);
    }
  SpreadsheetApp.flush();        
  }
  Browser.msgBox("OK. Reminder e-mails have been sent. !")
}

私が本当にやりたいのは、列BTが空の場合、または列BTの日付が9日より古い場合に、電子メールを送信することです。しかし、ifステートメントにorステートメントを含める方法がわかりませんでした。したがって、2つの別々のifステートメントを設定しました。

ただし、''を使用すると、2番目のifステートメントで、未定義のものの値を取得できないというエラーが表示されます。

nullまたはundefinedを使用すると、機能しません。

誰か考えがありますか?

4

2 に答える 2

2
  • スプレッドシートに72列ありますか?返されたエラーを使用data[i][reminder] == ''すると、2番目ではなく、等しいの最初の項に関係します...したがって、データには72のセカンダリインデックスがなく、これはエラーを返していると思います。(編集:より明確にするために:を使用して未定義のアイテムの値を取得し、.valueOfそれを何かで割ることはできません。そのため、「未定義のアイテムの値を取得できないというエラー」が発生します。)
  • ORステートメントの実装方法について知りたい場合は、w3schoolの「ComparisonOperators」を参照してください。
  • 日付オブジェクトを直接比較できることに注意してください。明示的にミリ秒に変換する必要はありません。javascriptが内部で変換します。

これをすぐに書く方法の例を次に示します

var tendaysBefore = new Date(new Date().getTime()-10*24*60*60*1000);// 10 days before
 if (data[i][paid].toLowerCase() != 'yes' && (data[i][reminder] == ''||(data[i][reminder] == null || data[i][submitted]< tendaysBefore)) { // not 'yes' and one of the 3 other conditions
    MailApp.sendEmail("___", "___") ;
SpreadsheetApp.openById('___').getSheetByName('Master').getRange(i+1, reminder).setValue(today);
}
于 2012-07-22T10:32:52.970 に答える
0

これが、Sergeの非常に親切な最初の考えに基づいて試したループのコードです。

for (var i = 1; i < data.length; i++) {
    if (data[i][paid].toLowerCase() != 'yes' &&
        (data[i][submitted]<tendaysBefore &&
        (data[i][reminder] == ''||
        data[i][reminder] == null))) {
        MailApp.sendEmail("___", "Reminder About Dues for Newcomers & Neighbors", "___") ;
    SpreadsheetApp.openById('___').getSheetByName('Master').getRange(i+1, reminder).setValue(today);
    }
  SpreadsheetApp.flush();        
  }

ifステートメントの順序を変更したのは、英語で何をしようとしているのかが適切に表現されているかどうかわからないためです。

私が言いたいのは、彼らが支払いをしておらず、フォームを送信してから10日が経過し、リマインダーセルが空白であるかnull値である場合は、電子メールを送信することです。

(このステートメントが機能するようになったら、最初の電子メールを送信してから10日が経過し、まだ​​支払いが行われていない場合は、別の電子メールを送信します。そのため、私は通過します。単なる「送信済み」のようなものではなく、日付を思い出させるためのこのすべての策略。)

私が持っているコードは機能します。ただし、実行する場合は、最初のバッチの電子メールを送信し、今日の日付をリマインダーに追加してから再度実行すると、電子メールが再度送信されます。

要するに、

(data[i][reminder] == ''||
        data[i][reminder] == null))

リマインダー列にANYTHINGが含まれている行に対して、ifステートメントが失敗するという本来の目的を達成していないようです。そういうわけで、私は最初に「空のセルをどのように処理するか」でこれに到達しましたか?なぜなら-私の人生のために、私は理由を理解することができません

(data[i][reminder] == ''||
        data[i][reminder] == null))

防弾ではありません。

セルジュの答えへのコメントで示唆したように、これは私を夢中にさせ始めています。したがって、私はあなたが持っているどんな考えに対しても十分に誰かに感謝することはできません。前もって感謝します!

ログからいくつかの値をキャプチャするというSergeの質問に応えて、要求されたコードをループに追加した後のログからの出力を次に示します。

Paid=yes date subm=Sat Jun 02 2012 14:44:27 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=reminder=undefined
Paid=yes date subm=Wed Jun 27 2012 16:22:35 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Fri Jun 29 2012 09:07:21 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 10:11:20 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 10:16:56 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 10:17:00 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 10:26:36 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 10:30:23 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 11:02:19 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 12:33:57 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Mon Jul 09 2012 13:48:54 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 18:19:22 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 21:07:05 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 21:44:13 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Mon Jul 09 2012 21:53:55 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Tue Jul 10 2012 11:09:03 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Tue Jul 10 2012 12:57:41 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Wed Jul 11 2012 18:36:49 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Thu Jul 12 2012 07:14:53 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Tue Jul 17 2012 14:54:16 GMT-0400 (EDT)reminder=undefined
Paid=yes date subm=Wed Jul 18 2012 20:26:23 GMT-0400 (EDT)reminder=undefined
Paid= date subm=Thu Jul 19 2012 13:43:09 GMT-0400 (EDT)reminder=undefined

これをどうすればいいのかわかりませんが、ここで何か面白いものを見るよりも賢い人はいると思いますか?

OK、Sergeが私と一緒に熱心にトラブルシューティングを行った後、この問題を解決したコードを次に示します。セルジュに感謝します!

function sendDuesReminder() {

  var paid = 3;
  var name = 1;
  var submitted = 0;
  var allowance = 9;
  var ms = 86400000; // Number of milliseconds in a day
  var today = new Date();
  var reminder = 72;
  var reminderArray = reminder - 1;
  var tendaysBefore = new Date(new Date().getTime()-10*24*60*60*1000);
  var data = SpreadsheetApp.openById('___').getSheetByName('Master').getDataRange().getValues();

  for (var i = 1; i < data.length; i++) {
    if (data[i][paid].toLowerCase() != 'yes' &&
        (data[i][submitted]<tendaysBefore &&
        (data[i][reminderArray] == ''||
        data[i][reminderArray] == null))) {
        MailApp.sendEmail("___", "___", "___") ;
    SpreadsheetApp.openById('___').getSheetByName('Master').getRange(i+1, reminder).setValue(today);
    }
  SpreadsheetApp.flush();        
  Logger.log('Paid='+data[i][paid].toLowerCase()+' date subm='+data[i][submitted]+'reminder='+data[i][reminder])
  }
  Browser.msgBox("OK. Reminder e-mails have been sent. !")
}
于 2012-07-22T17:46:01.817 に答える