Как получить актуальную дату и сравнить ее
Вопросов несколько.
Описание:
В Google sheets, apps script
Я с помощью цикла проверяю диапазон и ищу строку. Если она содержит имя, то я получаю его позицию в диапазоне. Рядом с этим именем в соседнем столбце есть дата соответствующая, и я с помощью getRange() получаю дату, которая соответствует найденному имени (строке). Дальше в отдельном условии за пределами цикла мне нужно сравнить, равняется ли дата, полученная в цикле, дате полученной в виде объекта в сценарии.
Вот тут вопросы:
Как получить актуальную date, но в формате
дд.мм.ггггбез времени. То есть чтобы было все как в обычном объекте new data, но безмин.сек.милсек.Как сравнить в if дату актуальную в формате
дд.мм.ггггс датой которую я получил в результате выполнения цикла. Дату из цикла нужно тоже желательно сделатьдд.мм.гггг, как я понимаю.
Код
function timeDay() {
var list1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Контроль");
var list2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Работники/данные/списки");
var infmail = list2.getRange(1, 4, 100, 1).getValues();
// Logger.log(infmail);
var infNameTime = list1.getRange(1, 4, 100, 1).getValues();
var infNameTime2 = list1.getRange(3, 4, 100, 1).getValues();
//Logger.log(infNameTime);
var email = Session.getActiveUser().getEmail();
var date = new Date(); //получаю дату
//Logger.log(date);
var malpz;
var mal = [];
var maillist = [];
for (var i = 0; i < infmail.length; i++) {
if (infmail[i].indexOf(email) !== -1) {
mal.push([i + 1]);
maillist.push(infmail[i]);
malpz = i + 1;
}
}
//Logger.log(malpz);
//Logger.log(mal);
//Logger.log(maillist);
var nameMail = list2.getRange(malpz, 2).getValues();
//Logger.log(nameMail);
var dd;
var tt;
var namepz = [];
var namelist = [];
for (var b = 0; b < infNameTime.length; b++) {
if (infNameTime[b][0].indexOf(nameMail) !== -1) {
namepz.push([b + 1]);
namelist.push(infNameTime[b]);
tt = b + 1;
dd = list1.getRange(tt, 3).getValue();
Этой строкой я получаю дату актуальную, но хочу получить в том формате как описал выше
var date = new Date();
А в этой строке находится дата относительно имени
dd = list1.getRange(tt,3).getValue();
Я ее получаю из строки в таком же формате как и
var date = new Date();
Но хочу получить в формате как описал выше, а потом применить условие, в ходе которого if сравнит и выполнит блок. Очень важно, чтобы даты не имели часов, минут, секунд, миллисекунд. По логике должны сравниваться только число, месяц, год.
Ответы (1 шт):
Самое простое - это сравнить две даты как числа
console.log(date1.getTime() === date2.getTime());
Сравнение по дням для Apps Script
const roundDate_ =
(date) =>
Utilities.formatDate(date, 'Europe/Moscow', 'yyyy-MM-dd');
console.log(roundDate_(date1) === roundDate_(date2));
Сравнение по по формату для Apps Script
const roundDateFormat_ =
(date, format) =>
Utilities.formatDate(date, 'Europe/Moscow', format);
// сравнивает только по месяцам
console.log(roundDate_(date1, 'yyyy-MM') === roundDate_(date2, 'yyyy-MM'));
Сравнение для JS вообще (добавлено)
const roundDate_ =
(date) =>
new Intl.DateTimeFormat('ru-RU').format(date);
console.log(roundDate_(date1) === roundDate_(date2));
и т.д. и т.п.
Для большого количества сравнений метод Utilities.formatDate может "провисать по времени". Тогда лучше использовать родные методы округления дат. Например,
const roundDate_ = date => {
const date_ = new Date(date);
date_.setHours(0 ,0 ,0 , 0);
return date_;
}
Далее сравнение проводить через getTime() как числа.
Обращайте внимание на часовые пояса проекта и Таблицы, они могут приводить к ошибкам смещения часового пояса в расчетах.