@aparuev

Почему неправильно рассчитывается дата?

Доброго времени суток!

В гугл таблицах у меня создан скрипт, который нужен чтобы автоматически высчитывать дату завершения заказа основываясь на дате отправки, конкретном исполнителе и виде работы. Скрипт на первый взгляд работает, однако проблема появляется когда изначальная дата выходит за пределы текущего месяца. Так, например, если суммарный срок выполнения заказа 5 дней, дата отправки - 31.08.2018 и текущий месяц у нас соответственно сентябрь, дата завершения рассчитается как 04.10(!).2018. И наоборот, при тех же параметрах и дате отправки 1.10.2018 дата завершения рассчитается как 06.09(!).2018

Я еще новичок в javascript и не могу понять почему так происходит. Подскажите пожалуйста в чем проблема.

Функция которая рассчитывает дату и вызывается в onEdit ячеек даты, исполнителя и вида работы:

function modifyDate(){

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Лаборатории');
  var datasheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Цены и сроки');
  var ColumnC = sheet.getRange(2, 3, sheet.getLastRow()-1, 1); //вид работы
  var cValues = ColumnC.getValues();
  var ColumnD = sheet.getRange(2, 4, sheet.getLastRow()-1, 1); //исполнитель
  var dValues = ColumnD.getValues();
  var ColumnA = sheet.getRange(2, 1, sheet.getLastRow()-1, 1); //дата отправки
  var aValues = ColumnA.getValues();
  //столбец N с отметкой о завершении заказа для проверки в условии
  var ColumnN = sheet.getRange(2, 14, sheet.getLastRow()-1, 1); 
  var nValues = ColumnN.getValues();
  var cdek = 6;

  var i2date = new Date();

 var Ivanov = datasheet.getRange('I1').getValue(); //фамилия исполнителя
 var R5 = datasheet.getRange('A2').getValue(); //вид работы
 var I2 = datasheet.getRange('I2').getValue(); //соответствующее количество дней

for (var i = 0; i < aValues.length; i++) {
    var aData = new Date(aValues[i][0]);
    var cData = new String(cValues[i][0]);
    var dData = new String(dValues[i][0]);
    var nData = new String(nValues[i][0]);

    if (cData == R5 && dData == Ivanov && I2!='' && nData == '') {i2date.setDate(aData.getDate()+cdek+I2);
    sheet.getRange(i + 2, 11, 1, 1).setValues([[i2date]])}
    else {}
}

function onEdit(event){

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Лаборатории');
  var range = event.range;

  if (range.getRow() >= 2 && range.getColumn() == 1){
  modifyDate();
  } else {}
}
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Ответ на этот вопрос дан на ruSO https://ru.stackoverflow.com/q/882107

Основная идея в том, чтобы использовать базовые единицы расчета дат (миллисекунды), а не их производные (дни, часы, минуты).

Хотелось бы добавить, что
>  new String('Hello world!') == 'Hello world!'
<· true
>  new String('Hello world!') === 'Hello world!'
<· false

И в данном контексте создание объекта строки неуместно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы