在Google Apps脚本中处理空单元格

时间:2012-07-22 09:45:58

标签: google-apps-script

为什么这不起作用?

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语句中包含或声明。所以我只设置了两个单独的if语句。

当我使用''时,对于第二个if语句,我得到一个错误,说它无法获得未定义的值的值。

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

有人有任何想法吗?

2 个答案:

答案 0 :(得分:2)

  • 您确定电子表格中有72列吗?当你使用data[i][reminder] == ''时,返回的错误涉及相等的第一项,而不是第二项...所以我猜数据没有72个二级索引,这就是返回错误。 (编辑:更清楚:您无法使用.valueOf获取未定义项目的值并将其除以某些内容,这就是&#34的原因;一个错误,说它无法获得未定义的东西的价值&#34; 。)
  • 如果您想了解如何实施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);
}

答案 1 :(得分: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. !")
}