Служба календаря скриптов Google Apps: получение только первых событий из всех повторяющихся (весь день) событий - PullRequest
1 голос
/ 10 марта 2020

В дополнение к этот вопрос Я хотел бы спросить, как эффективно извлечь только первые события из всех повторяющихся (за весь день) событий. Вызывать функцию findFirstEvent() для каждого отдельного события кажется нецелесообразным. Поэтому мой подход состоит в том, чтобы фильтровать массив всех событий.

var cal=CalendarApp.getCalendarById("Calendar Id");
var startTime=new Date(1850,0,1);
var endTime=new Date();
var events=cal.getEvents(startTime, endTime);
var firstEvents=events.filter(onlyFirstEvents);

function onlyFirstEvents() {
    ...
}

В конце концов мне действительно нужен массив с заголовками событий в качестве ключей и Date объектами в качестве значений.

1 Ответ

2 голосов
/ 11 марта 2020
  • Вы хотите получить все повторяющиеся события и события за весь день из календаря Google.
  • Особенно, вы хотите получить объект даты начала события повторяющегося события.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В этом случае используются методы isRecurringEvent() и isAllDayEvent().
  • getEvents() возвращает события в порядке убывания. Используя это, вы получите ожидаемый результат.

Когда вышеуказанные точки отражаются в вашем скрипте, он становится следующим:

Модифицированный скрипт:

От:
var firstEvents=events.filter(onlyFirstEvents);
Кому:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);

Результат:

При запуске вышеуказанного сценария возвращается следующее значение.

[
  {
    "eventTitle": "###",
    "eventId": "###",
    "startDate": ### date object ###,
    "endDate": ### date object ###
  },
,
,

]

Ссылки:

Если я неправильно вас понял вопрос, и это было не то направление, которое вы хотите, я прошу прощения.

Добавлено:

  • Таким образом, вы бы для l oop через массив результатов firstEvents, чтобы получить нужный массив с заголовки событий как ключи и объекты Date как значения?

Исходя из этого, я не могу понять, хотите ли вы массив или объект. Поэтому я хотел бы предложить 2 модели. В этом случае я подумал, что можно использовать firstEvents текущего сценария.

Pattern 1:

В этом шаблоне массив, который включает в себя заголовки событий и дату начала Объектом являются ключ и значение, соответственно, возвращается. Пожалуйста, измените следующим образом.

Сценарий:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);
firstEvents = firstEvents.map(function(e) {
  var obj = {};
  obj[e.eventTitle] = e.startDate;
  return obj;
});

Шаблон 2:

В этом шаблоне объект, который включает в себя, что названия событий и объект даты начала являются ключом и значением, соответственно , возвращается.

Сценарий:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);
firstEvents = firstEvents.reduce(function(obj, e) {
  obj[e.eventTitle] = e.eventTitle in obj ? obj[e.eventTitle].concat(e.startDate) : [e.startDate];
  return obj;
}, {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...