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 语句。所以我只是设置了两个单独的 if 语句。

但是,当我在第二个 if 语句中使用 '' 时,我收到一条错误消息,指出它无法获取未定义内容的值。

当我使用 null 或 undefined 时,它不起作用。

有人有什么想法吗?

4

2 回答 2

2
  • 您确定电子表格中有 72 列吗?当您使用data[i][reminder] == ''返回的错误时,涉及等号的第一项,而不是第二项……所以我猜数据没有 72 个二级索引,这将返回一个错误。(编辑:更清楚一点:您无法使用未定义项目的值.valueOf并将其除以某物,这就是为什么您会收到“一个错误,指出它无法获得未定义项目的值”。)
  • 如果您想了解如何实现 OR 语句,您可以查看w3school, 'Comparison Operators'
  • 请注意,您可以直接比较日期对象,您不需要显式地将它们转换为毫秒,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 天,并且提醒单元格为空白或具有空值,则发送电子邮件。

(一旦我得到这个声明,我会继续说,如果在我们发送第一封电子邮件后 10 天过去了,他们仍然没有付款,我们会发送另一封电子邮件。这就是为什么我要通过所有这些诡计都是为了提醒一个日期,而不仅仅是“发送”之类的东西。)

我的代码有效。除了,如果你运行它,发送第一批电子邮件,让它在提醒中添加今天的日期,然后再次运行它,它会重新发送电子邮件。

简而言之,

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

似乎没有完成应该做的事情,这使得 if 语句对于提醒列中包含 ANYTHING 的任何行都失败。这就是为什么我最初提出“如何处理空单元格”?因为——为了我的一生,我无法理解为什么

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

不是防弹的。

正如我在对 Serge 的回答的评论中所建议的那样,这开始让我发疯了。因此,对于您的任何想法,我都不能感谢任何人。提前致谢!

针对 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

我不知道该怎么做,但我敢肯定比我更聪明的人在这里看到了一些有趣的东西?

好的,在 Serge 与我一起努力解决问题之后,这是解决此问题的代码。非常感谢 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 回答