Google脚本:Javascript日期调用返回NaN

时间:2012-06-03 03:11:20

标签: javascript date google-apps-script nan

感谢所有人对此的关注。

我在同一个Google Scripts项目中的两个独立函数中包含相同的代码段。代码只是匹配给定日期的基本循环,然后使用索引从电子表格中获取值。有问题的具体行是:

var pmsDate = new Date(data[j][dateColIndex]).setHours(0, 0, 0, 0);

代码在一个函数中工作正常;但是,在另一个函数中,它返回NaN。我完全复制了&将循环结构从一个函数粘贴到另一个函数,所以我不明白为什么它不起作用。我已经尝试了所有可能的操作,但是似乎没有什么能够解决这个问题。

编辑:功能1不起作用。功能2有效。

任何人都可以指出任何错误或提供一些指导吗?我正在使用Chrome,同样的问题出现在FF中。

编辑2:感谢您给予一些思考。根据要求,我已经发布了这些功能的代码(它们不是很长,所以我发布了整个事情)。此处引用的“数据”表只是一个包含日期和一些相应数据的电子表格。同样,我遇到的问题是var pmsDate在函数2中正确返回DateString但在函数1中返回NaN,尽管使用完全相同的数据数组。感谢任何帮助!

功能1:

function getMonthlyRooms(month) {

  var forecastMonth = getMonthDigit(month);
  var monthDays = daysInMonth(month);
  var year = getYear();

  var startDate = new Date(year, forecastMonth, 1, 0, 0, 0, 0);

  var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
  var sheetDataCols = sheetData.getDataRange().getNumColumns();
  var sheetDataRows = sheetData.getDataRange().getNumRows();


  // find column header indexes

  var dataHeaders = sheetData.getRange(1, 1, 1, sheetDataCols).getValues();

  for (i = 0; i < sheetDataCols; i++) {
    if (dataHeaders[0][i] == "CONSIDERED_DATE") {
      var dateColIndex = i;
    }
    if (dataHeaders[0][i] == "NO_ROOMS") {
      var roomsColIndex = i;
    }
  }


  // find what row the month begins

  var data = sheetData.getDataRange().getValues();

  for (j = 0; j < sheetDataRows; j++) {
    var pmsDate = new Date(data[j][dateColIndex]).setHours(0, 0, 0, 0);

    if (pmsDate == startDate) {
      var startRow = j + 1;
    }
  }


  // loop through range and sum

  var monthData = sheetData.getRange(startRow, (roomsColIndex + 1), monthDays, 1).getValues();

  var occRooms = 0;

  for (var k in monthData) {
    occRooms += monthData[k][0];
  }

  return occRooms;  

}

功能2

function getDailyRooms(date) {

  var forecastDate = new Date(date).setHours(0, 0, 0, 0);

  var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
  var sheetDataCols = sheetData.getDataRange().getNumColumns();
  var sheetDataRows = sheetData.getDataRange().getNumRows();


  // find column header indexes

  var dataHeaders = sheetData.getRange(1, 1, 1, sheetDataCols).getValues();

  for (i = 0; i < sheetDataCols; i++) {
    if (dataHeaders[0][i] == "CONSIDERED_DATE") {
      var dateColIndex = i;
    }
    if (dataHeaders[0][i] == "NO_ROOMS") {
      var roomsColIndex = i;
    }
  }


  // loop through data

  var data = sheetData.getDataRange().getValues();

  for (j = 0; j < sheetDataRows; j++) {
    var pmsDate = new Date(data[j][dateColIndex]).setHours(0, 0, 0, 0);

    if (pmsDate == forecastDate) {
      var occRooms = sheetData.getRange(j + 1, roomsColIndex + 1).getValue();
    }
  }

  return occRooms;

}

3 个答案:

答案 0 :(得分:0)

您是否尝试过1而不是0开始循环?这样做可以跳过标题值(只是一个想法)

答案 1 :(得分:0)

我的猜测是函数使用的数据或逻辑存在差异,导致您没有处理的边缘情况。简化调试的一种方法是将共享代码放在单个函数中,而不是使用两个副本。这样可以更容易地看到数据输入和数据输出。

答案 2 :(得分:0)

为什么Date函数中有这么多参数?我以为只能用逗号分隔3个。你检查startDate是一个约会吗?

var startDate = new Date(year, forecastMonth, 1, 0, 0, 0, 0);