#javascript #datetime #google-apps-script #google-sheets
Вопрос:
Я получаю значение() с листа с датой вызова = 29/08/2021 09:30:00
Я получаю две другие даты из формы : от фромдта и Тодта
Я хочу проверить, находится ли дата звонка между fromdt и todt
Я пытался
function onFormSumbit(e) {
//Timestamp 1Name 1From Date 3.From Time 4To Date 5To Time 6Reason
var name = e.source.getActiveSheet().getRange(e.range.rowStart,2).getValue();
var fromdt = e.source.getActiveSheet().getRange(e.range.rowStart,3).getValue();
var fromtime = e.source.getActiveSheet().getRange(e.range.rowStart,4).getValue();
var todt = e.source.getActiveSheet().getRange(e.range.rowStart,5).getValue();
var totime = e.source.getActiveSheet().getRange(e.range.rowStart,6).getValue();
var reason = e.source.getActiveSheet().getRange(e.range.rowStart,7).getValue();
if ( todt=="") {todt=fromdt} ;
if ( fromtime=="") {fromtime=9} ;
if ( totime=="") {totime=19} ;
var empss = SpreadsheetApp.openById("xxx"); // service calls
var sltsht = empss.getSheetByName("Slots");
var vA =sltsht.getDataRange().getValues();//first column is a date with some time
for (k=1;k<vA.length;k ){
if (vA[k][3]==name amp;amp; vA[k][0].getTime() >= fromdt.getTime() amp;amp; vA[k][0].getTime() <= todt.getTime()){
//do something
}
}
Я хочу только сравнить даты. Я хочу не обращать внимания на время.
Приведенный выше код не может отображать соответствующие записи.
Комментарии:
1. Как вы запускаете эту функцию? Также, пожалуйста, добавьте более подробную информацию, например, некоторые примеры входных данных и ожидаемые результаты.
2. Вы пытались ввести в консоль один из журналов xx.getTime()? Или еще лучше… отладчик?
3. Вы должны научиться использовать объект события. Вы не знаете, как прочитать строку в электронной таблице с помощью вызова функции, потому что все эти значения уже находятся в e.values или e.namedvalues
4. Если вы хотите сравнить их численно, попробуйте получить их значения следующим образом:
let fromdatevvalue = new Date(e.values[2]).valueOf();
Вы можете использовать valueOf() или getTime() для численного сравнения дат.
Ответ №1:
Я проверил часовой пояс на листе и в сценарии (переключившись на устаревший редактор). И то, и другое-одно и то же.
только постоянная дата = новая дата(дата и время.toISOString().срез(0,10))
Не получилось. В результате были получены данные за предыдущий день.
Затем я попытался с
const fromdt = новая дата(lvvals[0][1].Количество часов(0,0,0,0));
Это сработало идеально.
Спасибо
Я даю ниже окончательный код
function test(){
var ss=SpreadsheetApp.getActive();
var lvvals = ss.getActiveSheet().getRange(12,2 , 1, 7 ).getValues();
//const fromdt = new Date(lvvals[0][1].toISOString().slice(0,10)); //returned the previous date
const fromdt = new Date(lvvals[0][1].setHours(0,0,0,0)); // worked correctly
if ( lvvals[0][3]=="") {lvvals[0][3]=lvvals[0][1]} ;
//const todt = new Date(lvvals[0][3].toISOString().slice(0,10));
const todt = new Date(lvvals[0][3].setHours(0,0,0,0));
var empss = SpreadsheetApp.openById("xxx"); // service calls
var sltsht = empss.getSheetByName("Slots");
var vA =sltsht.getDataRange().getValues();
for (k=1;k<vA.length;k ){
//sltdt = new Date(vA[k][0].toISOString().slice(0,10));
sltdt = new Date(vA[k][0].setHours(0,0,0,0));
if (vA[k][3]==lvvals[0][0] amp;amp; sltdt.getTime() >= fromdt.getTime() amp;amp; sltdt.getTime() <= todt.getTime()){
// do something
}
}
}
Ответ №2:
чтобы избавиться от части времени, вы можете использовать
const dateOnly = new Date(dateAndTime.toISOString().slice(0,10))
а затем сравните значения времени получения (). Будьте осторожны с часовыми поясами, убедитесь, что часовой пояс вашего скрипта (определенный в appsscript.json) совпадает с часовым поясом электронной таблицы (определенным в файле меню «Листы» > «Настройки»>).
Комментарии:
1. toISOString возвращает значения UTC, которые затем анализируются конструктором как локальные. Гораздо лучше использовать setHours :
date.setHours(0,0,0,0)
. 😉2. Спасибо @RobG. Сетхурс работал. На самом деле я уже пробовал это раньше, но потерпел неудачу. Теперь это работает
Ответ №3:
Если вам нужно просто проанализировать и сравнить даты в этом формате, быстрое и грязное решение находится здесь:
// 'DD/MM/YYYY hh:mm:ss' --> 'YYYYMMDD'
const parse_date = d => d.replace(/(dd)/(dd)/(d ). /, '$3$2$1')
const is_between = c => (c > fromdt) amp;amp; (c < todt);
var fromdt = parse_date('28/08/2021 09:30:00');
var todt = parse_date('30/08/2021 09:30:02');
var calldate = parse_date('29/08/2021 09:30:01');
console.log(is_between(calldate)); // true
var calldate = parse_date('27/08/2021 09:35:01');
console.log(is_between(calldate)); // false
Но лучше всего использовать объект данных, учитывать часовые пояса и т. Д.