【问题标题】:Google Scripts: Javascript Date call returning NaN谷歌脚本:Javascript 日期调用返回 NaN
【发布时间】:2012-06-09 12:40:47
【问题描述】:

感谢大家对此的关注。

我在同一个 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;

}

【问题讨论】:

  • 你加了调试,看看什么时候失败?失败时的价值是什么?
  • “返回 NaN”是什么意思?这个函数应该返回一个值吗?如果是这样,相关代码(包括返回调用)在哪里?如果不是,完整的错误信息是什么,行号是什么?
  • 我已经调试并使用了 GAS Logger 以确保脚本返回值。函数 1 调试产生:“pmsDate / Number / NaN”。函数 2 调试产生:“pmsDate / Date / DateString”,这是它应该做的。 @starbolin:完全相同的代码会产生两种不同的结果——GIGO 怎么样?
  • @chris2964 用这么少的代码是不可能帮助你的。问题很可能不在您发布的这个 sn-p 中。请发布代码的简化版本,但要完整,我们可以运行并重现问题。强调“在这里工作,不在那里工作”并没有帮助。只担心不起作用的部分。

标签: javascript date google-apps-script nan


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我已经(小心地)多次重写了这些函数,但由于某种原因,对同一个数据电子表格的相同调用会产生两个不同的结果。我敢肯定这是我缺少的一些简单的东西——但看起来我必须继续戳它。我的 javascript 绝不是先进的,但我没有看到任何明显的错误 - 你呢?
    【解决方案3】:

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

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

    【讨论】:

    • Date() 也可以包括小时、分钟、秒、毫秒。需要将时间部分设置为零,否则比较将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多