繁体   English   中英

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

[英]Google Scripts: Javascript Date call returning 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。 感谢任何帮助!

功能一:

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;

}

您是否尝试从1而不是0开始循环? 这样做将允许跳过标头值(只是一个想法)

我的猜测是,函数使用的数据或逻辑存在差异,从而导致您无法处理极端情况。 简化调试的一种方法是将共享代码放在单个函数中,而不是拥有两个副本。 这将使查看数据输入和输出数据更加容易。

为什么在Date函数中有这么多参数? 我以为只能用逗号分隔3个。 您是否已检查startDate是一个日期?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM