Как отправить стандартное приглашение по электронной почте при вызове addGuest на CalendarEvent?

Всякий раз, когда я добавляю гостя через пользовательский интерфейс Календаря Google, появляется следующее диалоговое окно:

Если я выберу "Отправить", он отправит пользователю красиво отформатированное письмо с возможностью ответа на событие календаря. Это прекрасно работает, когда вы используете пользовательский интерфейс Календаря Google.

Проблема в том, что я пытаюсь использовать Google Apps Scripts для автоматизации добавления людей в события.

Я программно добавляю гостей в CalendarEvent с помощью addGuest ():

event.addGuest("user@example.com");

Тем не менее, похоже, что нет возможности отправить электронное письмо.

Самое близкое, что я могу найти, это то, что когда вы программно создаете событие, вы можете установить sendInvites:

var event = CalendarApp.getDefaultCalendar().createEvent('Apollo 11 Landing',
  new Date('July 20, 1969 20:00:00 UTC'),
  new Date('July 20, 1969 21:00:00 UTC'),
  {sendInvites: true});

Обновление: даже если эта опция включена, она не отправляет приглашения по электронной почте.

Проблема в том, что я не вижу, как установить это свойство для уже существующего события. Похоже, что он будет работать на только что созданном событии. На самом деле, я не вижу способа даже прочитать это свойство на событии. Так что, похоже, единственный способ узнать, addGuest отправит приглашение, чтобы попытаться добавить гостя, а затем спросить этого человека, получил ли он электронное письмо.

Есть ли способ сделать любое из следующего:

  1. Выберите, чтобы отправить приглашение при звонке addGuest?

    например event.addGuest("user@example.com", {sendInvite: true})

  2. Изменить sendInvites недвижимость на CalendarEvent ?

    например event.setOptions({sendInvites: true})

  3. Любой другой обходной путь, который произведет то же самое электронное письмо, которое отправлено, нажимая кнопку "Отправить" в пользовательском интерфейсе выше?

Обновить:

  • Я только что увидел getAllTagKeys в API и надеялся, что смогу использовать это для получения sendInvites ключ, но это не так. Пусто даже для событий, которые имеют sendInvites установить в true.
  • Я только что попробовал позвонить addGuest на недавно созданном событии, которое имеет sendInvites: true, но это не отправило письмо.
  • Проблема с использованием MailApp для отправки электронного письма заключается в том, что он не будет красиво отформатирован, как тот, который Google автоматически рассылает (например, со встроенным приглашением в календарь, посетителями, описанием, ссылками на ответы и т. Д. И т. Д. И т. Д.).

3 ответа

Как уже упоминалось, ключ к этому заключается в том, что вы должны использовать Advanced Google API для этого. Однако текст на этой странице гласит:

Это отправляет приглашение по электронной почте участникам и помещает событие в их календарь.

... очень вводит в заблуждение. Единственный способ, которым он будет отправлять электронную почту, это если вы установите sendUpdates в all по запросу.


Во-первых, вы можете проверить, что sendUpdates является ключевым элементом отправки электронной почты для новых событий через расширенный API:

  1. Перейдите по этой ссылке.
  2. Нажмите кнопку Попробовать сейчас вверх.

    Это должно показать вам форму со следующей информацией:

    • calendarId: primary
    • sendUpdates: all
    • Тело запроса:

      {
        "start": {
          "date": "2029-04-04"
        },
        "end": {
          "date": "2029-04-04"
        },
        "summary": "Test",
        "attendees": [
          {
            "email": "your.email+1@example.com"
          }
        ]
      }
      
  3. Изменить your.email+1@example.com на ваш адрес электронной почты.

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

  4. Нажмите кнопку Выполнить.

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

  5. Если вы хотите окончательно доказать, что sendUpdates важно, установите его пустым вместо all, Отправить приглашение. Обратите внимание, что он не пришел в ваш почтовый ящик.

Если это не работает, убедитесь, что вы выполните следующие предостережения:

  1. Вы не должны отправлять электронную почту на тот же вошедший в учетную запись Google. Например, используйте положительный адрес или отправьте его на другой аккаунт.
  2. Убедиться, что sendUpdates установлен в all,
  3. Убедитесь, что это событие в будущем. Google никогда не будет отправлять электронные письма с приглашениями, отправленными на события в прошлом. Это верно, даже если вы вручную используете интерфейс Календаря Google. Вам будет задан вопрос, хотите ли вы отправлять обновления пользователю (-ям), вы выбираете "да", но поскольку событие в прошлом, оно фактически не отправляет электронную почту.

Поскольку оригинальный вопрос уже показывает, как использовать стандарт CalendarApp чтобы сделать то, что мы сделали выше, мы еще не достигли многого. Теперь, когда мы знаем, что sendUpdates важно, однако, пришло время посмотреть на добавление гостя.

Как указывает оригинальный вопрос, нет никакого способа указать sendInvite (как мы сделали бы со стандартным Calendar API) или sendUpdates (как мы сделали бы с расширенным API Календаря) при использовании CalendarApp, Единственный метод, который у нас есть, это addGuest ().

К счастью, мы можем использовать API расширенного календаря, аналогично тому, как мы это делали выше, и отправлять обновление (также известное как PATCH) на событие. Вместо того, чтобы взаимодействовать с необработанным JSON и Advanced Calendar API, мы можем использовать красивую оболочку Google вокруг расширенного API (иначе Calendar).

Однако, поскольку мы используем расширенный API-интерфейс Calendar, мы должны соблюдать это примечание:

Примечание. Это расширенный сервис, который необходимо включить перед использованием.

Это означает, что есть некоторые предварительные условия перед тем, как перейти к коду:

  1. Сначала включите Google Calendar API в своем проекте облачной платформы:

    1. В вашем скрипте перейдите к Ресурсам> Проект облачной платформы...
    2. Выполните одно из следующих действий:

      • Если ты видишь This script has an Apps Script-managed Cloud Platform project. Поздравляю, вы сделали с этим шагом!
      • Если ты видишь This script is currently associated with project:, сделайте следующее:

        1. Нажмите на ссылку под This script is currently associated with project:

          Это приведет вас к текущему проекту на Google Cloud Platform.

        2. API и сервисы> Панель инструментов
        3. Включить API и сервисы
        4. Добавить API Календаря Google
        5. Нажмите кнопку включения.
        6. Вы можете смело игнорировать предупреждение: To use this API, you may need credentials. Click 'Create credentials' to get started.
  2. Затем включите API Календаря Google для скрипта:

    1. Вернитесь в сценарий, Ресурсы> Расширенные службы Google
    2. Нажмите "Вкл" рядом с Google Calendar API.

      Теперь вы готовы использовать расширенный API в скрипте.

С этими предпосылками вы можете создать функцию:

// Note: requires advanced API
function addGuestAndSendEmail(calendarId, eventId, newGuest) {
  var event = Calendar.Events.get(calendarId, eventId);
  var attendees = event.attendees;
  attendees.push({email: newGuest});

  var resource = { attendees: attendees };
  var args = { sendUpdates: "all" };

  Calendar.Events.patch(resource, calendarId, eventId, args);
}

Некоторые предостережения:

  1. Когда вы передадите eventId, вам нужно будет удалить @google.com в конце eventId.
  2. Вы должны позвонить get сначала получить текущий список приглашенных. Если вы этого не сделаете, вы случайно удалите всех людей, которые изначально присутствовали на мероприятии. Смотрите этот ответ для получения дополнительной информации.

    Замечания: patch умный и будет отправлять обновления по электронной почте только тем людям, которые были добавлены. Например, если текущие люди на мероприятии [alice, bob] и вы отправляете патч с [alice, bob, charlie], только charlie получит электронное письмо Это именно то, что вы хотите!

  3. Все предыдущие предупреждения в приведенном выше списке применяются.

Опять же, ключ зная, как пройти в sendUpdates к insert() метод. Я не смог найти никакой документации о методе исправления 1, но автозаполнение показало, что есть optionalArgs параметр, который можно добавить. Я случайно попробовал формат, который вы видите выше, и это сработало!

Если это не работает, обязательно прочитайте все предупреждения выше.

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


1 У нас есть общий патч API, но это полезно только при отправке необработанного JSON. Мы используем Google Calendar обертка, которая не отображается точно так же.

Просто обновление осмысленного ответа. Так как API был обновлен в последней версии.

Я изменил функцию на:

      const { google } = require("googleapis");

const calendar = google.calendar({ version: "v3" });

async function addGuestAndSendEmail(calendarId, eventId, newGuest) {
  try {
    const event = await calendar.events.get({
      calendarId,
      eventId,
    });
    // console.log("micheal ~ file: index.js ~ line 316 ~ addGuestAndSendEmail ~ event", event)
    const attendees = event.data.attendees;
    attendees.push({ email: newGuest });

    const resource = { attendees: attendees };
    const args = { sendUpdates: "all" };
    // resource, calendarId, eventId, args
    const res =  await calendar.events.patch({
      calendarId,
      eventId,
      sendUpdates: "all",
      requestBody: {
        attendees,
      },
    });

    return res
  } catch (err) {
    throw new Error(err.message);
  }
}

И я назвал это так:

      async function inviteAnEmail(id, attendee) {
  try {
    const res = await addGuestAndSendEmail("primary", id, attendee);

    console.log(res.data, "invite Email Data");
  } catch (err) {
    console.log(err.message);
  }
}

Обратитесь к следующему запросу.

метод: POST

конечная точка: https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all

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

Введите Json Like:

    {
            "kind": "calendar#event",
            "etag": "etag",
            "status": "confirmed",
            "summary": "JayKara",
            "description": "eqwbdjhwhhwhhwrhjehrhejhfj",
            "location": "America",
            "creator": {
                "email": "**@mail.com",
                "self": true
            },
            "organizer": {
                "email": "**@mail.com",
                "self": true
            },
            "start": {
                "date": "2019-12-23"
            },
            "end": {
                "date": "2019-12-24"
            },
            "originalStartTime": {
                "date": "2019-12-24"
            },
            "visibility": "public",
            "attendees": [
                {
                    "email": "****@mail.com" //this guys are the guest 
                }
            ]
        }.

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

Ура!

Другие вопросы по тегам