Поиск и чтение календарей ресурсов в Admin Directory

Контекст
При отправке формы POST для бронирования отеля я сначала хочу проверить, есть ли у нас свободные номера в наших апартаментах. Я создал календари ресурсов (со зданиями и т. д.) через панель администратора GSuite.

Теперь я немного тестирую код, который нашел на этом сайте. Он находит календари ресурсов, и я просто фильтрую их по имени (чтобы избавиться от всех конференц-залов). Но теперь хотелось бы "читать" сам календарь. Но похоже, что resourceId не является идентификатором соответствующего календаря ресурса.

Как я могу проверить доступность в календаре ресурсов?

do {
  var arguments = {
    maxResults: 200,
    pageToken: pageToken
  }; 
  calendars = AdminDirectory.Resources.Calendars.list("my_customer", arguments);
  if (calendars.items && calendars.items.length > 0) {
    for (var i = 0; i < calendars.items.length; i++) {
      var calendar = calendars.items[i];
      if (calendar.buildingId.substr(0, 9).toUpperCase() === "APARTMENT" ) {
        Logger.log('YES %s (ID: %s) (%s),', calendar.resourceId, calendar.resourceName, calendar.buildingId);  

        // 
        // The code below doesn't work (null reference). But I would to do something like this.
        //
        var resourceCalendar = CalendarApp.getCalendarById(calendar.resourceId);
        Logger.log("I found the following calendar %s ", resourceCalendar.getName() );

      }
    }
  } else {
    Logger.log('No calendars found.');
  }
  pageToken2 = calendars.nextPageToken;
} while (pageToken); 

person Jeroen    schedule 22.08.2018    source источник
comment
Вы хотели установить pageToken как calendars.nextPageToken? или pageToken2, который иначе никогда не используется (в этом коде)?   -  person tehhowch    schedule 22.08.2018
comment
Я думаю, что вам не следует смешивать API календаря и функцию CalendarApp, они не используют одну и ту же структуру идентификаторов. А еще ИМХО он вам не нужен, так как API умеет все.   -  person Serge insas    schedule 22.08.2018


Ответы (1)


Я попробовал этот код, и он работает.

Обратите внимание, что я использовал ресурс электронной почты в качестве идентификатора для CalendarApp.

function myFunction() {
  var pageToken;
  do {
    var arguments = {
      maxResults: 200,
      pageToken: pageToken
    }; 
    calendars = AdminDirectory.Resources.Calendars.list("my_customer", arguments);
    if (calendars.items && calendars.items.length > 0) {
      for (var i = 0; i < calendars.items.length; i++) {
        var calendar = calendars.items[i];
        Logger.log('ressource name : '+calendar.resourceName);  

        //Logger.log('ressource data : '+JSON.stringify(calendar)+'\n');// this is useful to see what we get  

        var resourceCalendar = CalendarApp.getCalendarById(calendar.resourceEmail);
        if(resourceCalendar){
          Logger.log("I found the following calendar %s \n", resourceCalendar.getName() );
        }else{
          Logger.log('ressource skipped- undefined ----------------');
        }
      }
    }
  } while (pageToken); 
}
person Serge insas    schedule 22.08.2018
comment
Спасибо. Это сработало. Хороший совет. И нашел другую причину. Ресурсы были новыми, и события еще не были созданы. После того, как я создал событие, был возвращен resourceCalendar. - person Jeroen; 22.08.2018