Как получить данные конференции текущего события после использования расписания конференции в Календаре Google - PullRequest
2 голосов
/ 03 апреля 2020

Фон: Календарь Google> нажмите кнопку Создать> введите страницу нового события> Добавить конференцию

Click here to schedule conference

Вопрос: Когда пользователь нажимает Добавить конференцию, чтобы запланировать конференции (сторонний сервис, а не видеовстречи), как я могу получить данные конференции текущего события? Я пытался использовать Calendar.Events.get API, но он вернул 404.

мои настройки appcripts здесь:

, когда пользователь планирует конференцию, он запускает onCalendarEventUpdate функцию

{
  "timeZone": "America/Los_Angeles",
  "addOns": {
    "calendar": {
      "eventUpdateTrigger": {
        "runFunction": "onCalendarEventUpdate"
      },
    }
  }
}

my onCalendarEventUpdate:

function onCalendarEventUpdate(context: any) {
  // I can get calendarId, evnetId
  const {
    calendar: { calendarId, id: evnetId }
  } = context;

  // when I try to get event conferenceData, it returns 404
  let event;
  try {
    event = Calendar.Events && Calendar.Events.get(calendarId, evnetId);
    if (!event) {
      Logger.log(`[getEventsCollectionByCalendarId]event not found`);
    }
  } catch (e) {
    Logger.log(`[getEventsCollectionByCalendarId]error: ${JSON.stringify(e)}`);
  }
}

Теперь сообщение об ошибке:

{
    "message":"API call to calendar.events.get failed with error: Not Found",
    "name":"GoogleJsonResponseException",
    "lineNumber":64,
    "details":{
        "message":"Not Found",
        "code":404,
        "errors":[{
            "domain":"global",
            "reason":"notFound",
            "message":"Not Found"
        }]
    }
}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Я нашел решение сейчас, надеюсь, оно будет полезным для других.

Первый файл манифеста обновления:

{
  "timeZone": "America/Los_Angeles",
  "oauthScopes": [
     "https://www.googleapis.com/auth/calendar.addons.current.event.read",
     "https://www.googleapis.com/auth/calendar.addons.current.event.write"
  ],
  "addOns": {
    "calendar": {
      "currentEventAccess": "READ_WRITE",
      "eventUpdateTrigger": {
        "runFunction": "onCalendarEventUpdate"
      },
    }
  }
}

Затем в onCalendarEventUpdate function

function onCalendarEventUpdate(context) {
  const { conferenceData } = context;

  console.log('[onCalendarEventUpdate]conferenceData:', conferenceData);
}

Вы можете успешно получить данные конференции здесь

Ссылка Do c: https://developers.google.com/apps-script/manifest/calendar-addons

0 голосов
/ 03 апреля 2020

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

Сначала запустите этот код, чтобы выполнить первоначальную синхронизацию c и получить nextSyncTokens для каждого календаря. Вам нужно выполнить это только один раз.

function initialSyncToSetNextSyncTokens() {
  const calendarIds = Calendar.CalendarList.list()["items"].map((item) => {
    return item["id"]
  });
  for (let calendarId of calendarIds) {
    let options = {maxResults: 2500, nextPageToken: undefined}
    let response = {}
    do {
      response = Calendar.Events.list(calendarId, options)
      options["nextPageToken"] = response["nextPageToken"]
    } while (options["nextPageToken"])
    PropertiesService.getScriptProperties().setProperty(calendarId, response["nextSyncToken"])
  }
}

Затем установите триггер для запуска этой функции и регистрации данных конференции. Обратите внимание, что мы также обновляем nextSyncToken, чтобы следующее выполнение работало правильно.

function onEventUpdated(context) {
  const calendarId = context["calendarId"]
  const nextSyncToken = PropertiesService.getScriptProperties().getProperty(calendarId)
  const response = Calendar.Events.list(calendarId, {syncToken: nextSyncToken})
  PropertiesService.getScriptProperties().setProperty(calendarId, response["nextSyncToken"])
  const event = response["items"][0] // assumes this code will run before another event is created
  const conferenceData = event["conferenceData"]
  console.log(conferenceData)
}

Ссылка на соответствующие документы:

https://developers.google.com/apps-script/guides/triggers/events#google_calendar_events

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...