0

ご清聴ありがとうございました。

同じ Google Scripts プロジェクト内の 2 つの別々の関数に含まれる同一のコードがあります。このコードは、特定の日付を照合し、インデックスを使用してスプレッドシートから値を取得するための単なる基本的なループです。問題の特定の行は次のとおりです。

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

コードは 1 つの関数で正常に動作します。ただし、他の関数では 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;

}
4

3 に答える 3

0

Date 関数の引数が多いのはなぜですか? コンマで区切られたのは3つだけだと思っていました。startDate が日付であることを確認しましたか?

var startDate = new Date(year, forecastMonth, 1, 0, 0, 0, 0);
于 2012-06-09T04:40:47.630 に答える
0

0 ではなく 1 でループを開始しようとしましたか? そうすることで、ヘッダー値をスキップできます(単なるアイデアです)

于 2012-06-03T07:43:50.313 に答える
0

私の推測では、関数が使用するデータまたはロジックに違いがあり、その結果、処理していないエッジ ケースが発生します。デバッグを簡素化する 1 つの方法は、共有コードを 2 つのコピーではなく、1 つの関数内に配置することです。これにより、入ってくるデータと出てくるデータを簡単に確認できます。

于 2012-06-04T16:44:35.143 に答える