Дата сценария приложения дата на один день, если читать из таблицы Google

#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());
  }
}