尝试在工作表中添加日期时间

Trying to add to dateTime in sheets

本文关键字:添加 日期 时间 工作      更新时间:2023-09-26
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((,我可以让工作表将其显示为日期或自 1/1/1900 以来的天数或任何日期。此时,我可以在单元格中添加它。我可以在单元格中添加getLatestTime((和daysLeft((,它工作正常。我还可以添加时区偏移量,它可以在单元格中工作。但是当我在此功能中执行此操作时,似乎没有任何效果。我尝试将 .value 添加到函数调用并使用 parseFloat((,但这给了我 NaN。

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

问题是这不是

javascript 中处理日期的方式。

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

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

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

所以 Date.parse 让我完成了一半,但它给了我自 1970 年 1 月 1 日以来的毫秒,谷歌是自 1899 年 12 月 30 日以来的几天。所以我只需要使用一些数学,为了清楚起见,我没有计算

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

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