Попытка добавить в dateTime в листах

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(), я могу получить листы, чтобы показать ее либо в виде даты, либо в количестве дней с 01.01.1900, либо в любом другом виде. На этом этапе в ячейке я могу добавить к ней. Я могу добавить getLatestTime () и daysLeft() в ячейку, и она отлично работает. Я также могу добавить смещение часового пояса, и это работает, в ячейке. Но когда я делаю это в этой функции, кажется, ничего не работает. Я попытался добавить.value к вызовам функций и использовать parseFloat(), но это дает мне NaN.

Как я могу сделать арифметику с этими функциями возвращает?

2 ответа

Решение

Таким образом, Date.parse дает мне половину пути, но он дает мне миллисекунды с 01.01.1970, где google - дни с 30.12.1899. Так что мне просто пришлось использовать некоторую математику, которую я оставил без вычисления для ясности.

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

Теперь я могу использовать dateToNum(getLatestTime()) и делай все, что захочу. Когда этот номер помещается в ячейку, отформатированную по дате и времени, он будет отображаться правильно.

Проблема в том, что Даты не обрабатываются в javascript.

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

Это установит для Дня Месяца вашего объекта DateTime исходную дату + daysLeft(). Я не уверен, что вы имеете в виду с 2/24 (как это всегда 12), но я включил его на случай, если у вас есть какой-то другой контекст. Если вы добавите количество дней к количеству дней в месяце, оно перейдет к следующему месяцу, и аналогично, если вы добавите отрицательные дни ниже 0, оно перейдет к предыдущему месяцу.

Для получения дополнительной информации об обработке дат с помощью JavaScript, перейдите по этой ссылке на W3Schools.

Другие вопросы по тегам