Попытка добавить в 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.