0
function getFirstEmptyRow() {
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var column = spr.getRange('A:A');
  var values = column.getValues(); // get all data in one call
  var ct = 0;
  while ( values[ct][0] != "" ) {
    ct++;
  }
  return (ct);
}

function getLatestTime() {
  return SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(getFirstEmptyRow(),1).getValue();
}

function getLatestPoints() {
  return SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(getFirstEmptyRow(),2).getValue();
}

function getLatestAverage() {
  return SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(getFirstEmptyRow(),3).getValue();
}

function daysLeft(){
  var pointsLeft = 24250 - getLatestPoints();
  return  (pointsLeft / getLatestAverage()) / 24;
}

function nextRedeem() { //Problem is with this function:
  var redeemTime = getLatestTime() + daysLeft() + (2/24); 
  return redeemTime;
}

在我的工作表中,我有一个行列表,其中包含 1)日期/时间 2)点值和 3)每小时点的运行平均值。我正在尝试编写一个函数来计算在点数达到某个数字之前还剩多少时间,并将其添加到最新时间以计算出我希望在什么时间获得该点数。

我对 java 脚本和弱类型几乎没有经验。我的问题是,当我尝试向返回的日期值添加一个数字时,我要么得到一个字符串,要么只得到 NaN。我的另一个问题是工作表似乎将日期解释为与 Number() 不同的数字。

如果我的 nextRedeem() 函数只返回 getLatestTime(),我可以获取工作表以显示日期或自 1900 年 1 月 1 日以来的天数或其他任何内容。那时,我可以在一个单元格中添加它。我可以在一个单元格中添加 getLatestTime() 和 daysLeft() 并且它工作正常。我还可以在单​​元格中添加时区偏移量并且它可以工作。但是,当我在此功能中执行此操作时,似乎没有任何效果。我尝试将 .value 添加到函数调用并使用 parseFloat() 但这给了我 NaN。

如何对这些函数返回进行算术运算?

4

2 回答 2

0

所以 Date.parse 让我走到了一半,但它给了我自 1970 年 1 月 1 日以来的毫秒数,其中谷歌是自 1899 年 12 月 30 日以来的天数。因此,为了清楚起见,我只需要使用一些未计算的数学。

function dateToNum(date) {
  return (Date.parse(date)/1000/60/60/24 + 25569)
}

现在我可以使用dateToNum(getLatestTime())并做任何我想做的数学运算。当将此数字放入格式化为日期时间的单元格中时,它将正确显示。

于 2014-11-12T07:20:41.323 回答
0

问题在于 javascript 中不是如何处理日期的。

var redeemTime = getLatestTime().setDate( getLatestTime().getDate() + daysLeft() + 12 );

这会将 DateTime 对象的日期设置为原始日期 + daysLeft()。我不确定你用 2/24 指的是什么(因为它总是 12),但我把它包括在内,以防你有其他上下文。如果在当月的天数上加上天数,则进入下个月,同样,如果在 0 以下加上负数,则进入上个月。

有关使用 JavaScript 处理日期的更多信息,请参阅W3Schools上的此链接。

于 2014-11-11T08:43:50.503 回答