Как создать событие в календаре каждого участника организации?

#google-apps-script #google-calendar-api

#google-apps-script #google-calendar-api

Вопрос:

Мне нужно создать событие в календаре каждого участника моей организации. Это событие является напоминанием о действии, которое каждый должен выполнить до определенной даты, но эта дата не совпадает каждый месяц, поэтому я не могу проводить повторяющееся событие. Я не хочу добавлять всех в качестве участников, потому что я хочу, чтобы все сохраняли событие в календаре, а не просто отвечали «не участвую» и забывали делать то, что им нужно сделать в нужное время.

Для этого я уже написал код, который получает каждую активную учетную запись от организации, получает дату начала, дату окончания, название события и описание события из таблицы Google. Это работает для моего календаря и календарей людей, которых я добавляю вручную в свой список «другие календари» в календаре Google. Но скрипт не создает событие в повестках дня людей в моей организации, которых нет в моем списке «другой календарь».

 function getAllPeopleFromDirectory() {
 var pageToken;
 var page;
 var usersId = [];
 do {
   page = AdminDirectory.Users.list({
     domain:'mydomain.com',
     orderBy: 'givenName',
     maxResults: 400,
     query: "orgUnitPath=/ isSuspended=False",
     pageToken: pageToken
   });
   var users = page.users;

   if(users) {
     for (var i=0; i< users.length; i  ) {
       var user = users[i];
       usersId.push(user.primaryEmail);
     }
   } else {
     Logger.log('No users found.');
   }
   pageToken = page.nextPageToken;
 } while(pageToken);
  if (usersId.length != 0){
    setUpReminder(usersId);
  }
}

function setUpReminder(calendarIDs) {
  var ss = SpreadsheetApp.openById("SPREADSHEET_ID");
  var sheet = ss.getSheetByName('reminder');
  var range = sheet.getDataRange();
  var values = range.getValues();
  for (var i = 0; i < calendarIDs.length; i  ) {
    setUpCalendar(values, range, calendarIDs[i]);
  }
}

function setUpCalendar(values, range, calendarId) {
  var cal = CalendarApp.getCalendarById(calendarId);
  for (var i = 1; i < values.length; i  ) {
    var session = values[i];
    var date = new Date(session[1]);
    var now = new Date();
    if (date.getMonth() == now.getMonth()) {
      var title = session[4];
      var start = joinDateAndTime(session[1], session[2]); 
      var end = joinDateAndTime(session[1], session[3]);
      var options = {location: session[5], sendInvites: false, description: session[8]};
      var event = cal.createEvent(title, start, end, options).setGuestsCanSeeGuests(true);
    }
  }
  range.setValues(values);
}

function joinDateAndTime(date, time) {
  date = new Date(date);
  date.setHours(time.getHours());
  date.setMinutes(time.getMinutes());
  return date;
}
  

Когда я вызываю «CalendarApp.getCalendarById» для всех, кого нет в других моих календарях, функция возвращает null, поэтому cal.CreateEvent выдает ошибку…

У кого-нибудь есть идея, как это сделать правильно? Возможно, я смогу добавлять и удалять людей в свой другой календарь каждый раз, когда запускаю скрипт, это не лучшее решение, но если кто-то знает, как это сделать, это было бы здорово!

Ответ №1:

Вместо того, чтобы извлекать пользовательские (основные) календари и обновлять их событиями один за другим, лучшим подходом является создание пользовательского календаря (он же. дополнительный календарь), который является общим для всех пользователей в вашем домене GSuite.

Вот выдержка из справочной документации по API календаря:

… вы можете явно создать любое количество других календарей; эти календари могут быть изменены, удалены и доступны нескольким пользователям.

Итак, все, что вам нужно сделать, это обновить дополнительный календарь, и его события будут отражены в представлении календаря ваших пользователей (но только если у ваших пользователей включен пользовательский календарь).

Комментарии:

1. Спасибо, но проблема в том, что «только если у ваших пользователей включен пользовательский календарь». Мы хотим предотвратить отключение календаря, поэтому мы хотим создать событие во всех календарях.

2. Пользователи @nicar могут отключить любой из своих календарей, включая основной календарь. Таким образом, вы не можете запретить им отключить его, если они захотят.