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

Как сделать арифметику с помощью этих функций?

ответ

0

Так что Date.parse получает меня на полпути, но он дает мне миллисекунды с 01.01.1970 года, где google - дни с 12/30/1899. Поэтому я просто должен был использовать некоторую математику, которую я оставил бескомпромиссным для ясности.

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

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

0

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

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

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

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

+0

Это вызывает больше проблем на самом деле, мне нужно быть фактической датой/временем, а не только днем ​​месяца. Другая проблема заключается в том, что листы Google и javascript обрабатывают даты по-разному. 2/24 означает 2/24ths 1 дня или 2 часа, поскольку google обрабатывает время datetime как часть дня. В принципе, поскольку datetime в google - это просто количество дней с 1900 года, я просто хочу добавить к этому номеру, тогда листы интерпретируют это как дату снова. Но код хочет интерпретировать его как строку, а не число. – Stoopkid