#date #google-apps-script #calendar #spreadsheet
#Дата #google-apps-script #Календарь #электронная таблица
Вопрос:
Мне нравится считывать дату из электронной таблицы Google, чтобы проверить записи в своем календаре Google. Но функция даты getEventsForDay( )
возвращает записи к предыдущей дате, как и ожидалось. Пример: мне нравится получать записи до 24.12.2020, но мой код возвращает записи до 23.12.2020
Это моя электронная таблица, ячейка 2,2 содержит дату 24.12.2020
Это мой календарь: календарь содержит записи на 23, 24 и 25.12.2020
Мой код:
function exampleDateIsOff() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range_date = sheet.getRange(2,2);
var date = new Date(range_date.getValue());
Logger.log("Date from cell: " Utilities.formatDate(date, SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(),'MMMM dd, yyyy'));
Logger.log("ScriptTimeZone: " Session.getScriptTimeZone());
Logger.log("SheetTimeZone: " SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone());
Logger.log("CalendarApp: " CalendarApp.getTimeZone());
var calendar = CalendarApp.getCalendarById(calendarId);
var events = calendar.getEventsForDay(date);
for (i = 0; i < events.length; i ) {
Logger.log(events[i].getTitle());
}
}
Вывод:
Info Date from cell: December 24, 2020
Info ScriptTimeZone: America/New_York
Info SheetTimeZone: Europe/Vienna
Info CalendarApp: Europe/Vienna
Info Dez 23
Комментарии:
1. Какова ценность
date.getTime()
?
Ответ №1:
Я ссылался на этот пост здесь: https://webapps.stackexchange.com/questions/73235/how-do-i-get-a-date-formatted-as-yyy-mm-dd-from-a-cell-for-using-in-a-script
Удалите updateConfig();
из второй строки, она не определена. Измените эти две строки:
var date = new Date(range_date.getValue());
Logger.log("Date from cell: " Utilities.formatDate(date,
SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(),'MMMM dd, yyyy'));
К этому:
var date = range_date.getValue();
var formattedStartDate = Utilities.formatDate(new Date(date),
ss.getSpreadsheetTimeZone(), "MMMM dd, yyyy");
Logger.log("Date from cell: " formattedStartDate);
Третий журнал, который у вас есть здесь:
Logger.log("SheetTimeZone: "
SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone());
может быть сокращено до этого:
Logger.log("SheetTimeZone: " ss.getSpreadsheetTimeZone());
поскольку у вас уже есть переменная ‘ss’ для вызова приложения и активной электронной таблицы.
Оставьте var events = calendar.getEventsForDay(date);
все как есть, это должно быть строковое значение.
Я думаю, что проблема заключалась в попытке слишком быстро изменить строковое значение в вашей ячейке, которое вы используете в скрипте, на элемент даты javascript, вам нужно иметь возможность вызывать строковое значение, которое у вас там есть. Кто-то, кто знает о Utilities.formateDate больше, смог бы ответить на этот вопрос лучше, но я думаю, что это изменит его, чтобы вы могли называть любую дату, которая есть у вас в ячейке. Я не знаю, к какому часовому поясу вы стремитесь, хотя в ваших журналах есть как Европа / Вена, так и Америка / Нью-Йорк.
Пример журналов для ввода «4/4/21» в ячейку B2:
4:31:59 AM Notice Execution started
4:31:59 AM Info Date from cell: April 04, 2021
4:31:59 AM Info ScriptTimeZone: America/Indiana/Indianapolis
4:31:59 AM Info SheetTimeZone: America/Indianapolis
4:31:59 AM Info CalendarApp: America/New_York
4:31:59 AM Info Easter Sunday
4:32:00 AM Notice Execution completed
Ответ №2:
Теперь я решил проблему, используя getEvents
<----
var events = calendar.getEventsForDay(date);
---->
var end_date = new Date(date);
end_date.setDate(end_date.getDate() 1)
var events = calendar.getEvents(date, end_date)
function exampleDateIsOff() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range_date = sheet.getRange(2,2);
var date = new Date(range_date.getValue());
Logger.log("Date from cell: " Utilities.formatDate(date, ss.getSpreadsheetTimeZone(),'MMMM dd, yyyy'));
Logger.log("ScriptTimeZone: " Session.getScriptTimeZone());
Logger.log("SheetTimeZone: " ss.getSpreadsheetTimeZone());
Logger.log("CalendarApp: " CalendarApp.getTimeZone());
var calendar = CalendarApp.getCalendarById(calendarId);
var end_date = new Date(date);
end_date.setDate(end_date.getDate() 1)
var events = calendar.getEvents(date, end_date)
for (i = 0; i < events.length; i ) {
Logger.log(events[i].getTitle());
}
}