簡體   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