感谢所有人对此的关注。
我在同一个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;
}
答案 0 :(得分:0)
您是否尝试过1而不是0开始循环?这样做可以跳过标题值(只是一个想法)
答案 1 :(得分:0)
我的猜测是函数使用的数据或逻辑存在差异,导致您没有处理的边缘情况。简化调试的一种方法是将共享代码放在单个函数中,而不是使用两个副本。这样可以更容易地看到数据输入和数据输出。
答案 2 :(得分:0)
为什么Date函数中有这么多参数?我以为只能用逗号分隔3个。你检查startDate是一个约会吗?
var startDate = new Date(year, forecastMonth, 1, 0, 0, 0, 0);