Не удается прочитать свойство ‘getEvents’ с нулевым значением -> Когда не владелец календаря пытается удалить событие

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

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

Вопрос:

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

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

 "TypeError: Cannot read property 'getEvents' of null at UpdateCalendar(Code:209:31)"
 

Строка 209 относится к:

 var events = CallCalendar.getEvents(fromDate, toDate); //create array of events of full month for given calendar
 

Полный раздел кода приведен ниже:

 //Cycle through each Calendar and delete the events
  for (var x = 0; x < CallCalendars.length; x  ) {//Cycle through each Different calendar
    var CallCalendar = CalendarApp.getCalendarById(CallCalendars[x].ID); //Get ID of each Calendar
    var events = CallCalendar.getEvents(fromDate, toDate); //create array of events of full month for given calendar
    for(var i = 0; i < events.length; i  ){ //Cycle across array of full month of events to delete each one
      var ev = events[i]; //instantiate each event
      Logger.log("ev.getTitle(): "   ev.getTitle()); // show event name in log
      ev.deleteEvent(); //Delete instantiated event
    }
  }
 

Я предполагаю, что это проблема с разрешениями в некотором роде. Я был бы очень признателен за рекомендации.

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

1. Код автоматически завершается сбоем CalendarApp.getCalendarById(CallCalendars[x].ID) . Откуда CallCalendars берется?

2. Извините, CallCalendars — это массив объектов, который включает имя пользователя в CallCalendars [x] . Имя и идентификатор их календаря в CallCalendar [x].ID.

3. Вы проверили, что не владелец имеет доступ к этому массиву?

4. @ Diego — Этот массив определен выше в коде.

5. Я думаю, вам нужно будет выполнить некоторую отладку с этим пользователем. Если у них есть доступ к идентификаторам, но CalendarApp.getCalendarById() возвращает null , то это означает, что у них нет доступа к календарям.

Ответ №1:

Объяснение / проблема:

Похоже, вы передаете какой-то неправильный календарь IDs или IDs у вас нет разрешения на доступ.

  • Одним из обходных путей было бы использовать оператор try … catch, поэтому всякий раз, когда ваш код сталкивается с ними IDs , переходите к continue следующей итерации.

Решение:

 //Cycle through each Calendar and delete the events
  for (var x = 0; x < CallCalendars.length; x  ) {//Cycle through each Different calendar
    var CallCalendar = CalendarApp.getCalendarById(CallCalendars[x].ID); //Get ID of each Calendar
    try{
    var events = CallCalendar.getEvents(fromDate, toDate); //create array of events of full month for given calendar
    }
    catch(e){continue;}
    for(var i = 0; i < events.length; i  ){ //Cycle across array of full month of events to delete each one
      var ev = events[i]; //instantiate each event
      Logger.log("ev.getTitle(): "   ev.getTitle()); // show event name in log
      ev.deleteEvent(); //Delete instantiated event
    }
  }
 

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

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