在CalendarEvent上调用addGuest时,如何发送标准邀请电子邮件?

时间:2019-01-01 04:10:13

标签: google-apps-script google-calendar-api

每当我通过Google日历界面添加访客时,都会弹出以下对话框:

  

enter image description here

如果我选择“发送”,它会向用户发送格式正确的电子邮件,并且还可以选择响应日历事件:

  

enter image description here

当您手动使用Google日历用户界面时,此功能可完美运行。问题是我正在尝试使用Google Apps脚本自动将人员添加到事件中。

我正在使用addGuest()通过编程方式将访客添加到CalendarEvent:

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

但是,似乎没有发送电子邮件的选项。

我能找到的最接近的是,当您programmatically create an event时,您可以设置sendInvites

  var event = CalendarApp.getDefaultCalendar().createEvent(
    'Test',
    new Date('April 5, 2029 20:00:00 UTC'),
    new Date('April 5, 2029 21:00:00 UTC'),
    {sendInvites: true, guests:"your.email+1@example.com"});
  Logger.log(event.getId());

这将正确发送格式正确的电子邮件。

但是,sendInvites选项仅在新创建事件时有效。如果以后再打给我:

  var event = CalendarApp.getEventById("insert_id_here");
  event.addGuest("your.email+2@example.com");

...它不会发送电子邮件更新(即使该事件是使用sendInvites=true创建的)。这意味着sendInvites是短暂的,不会在事件上持续存在。

在事件上调用sendInvites时有什么方法可以addGuest()?例如。 event.addGuest("user@example.com", {sendInvite: true})

是否还有其他解决方法可以产生与在上面的UI中单击“发送”按钮时发送的电子邮件相同的电子邮件?

注意:我不是要使用MailApp发送电子邮件,因为它的格式设置不如Google自动发送的格式(例如,带有嵌入式日历邀请,与会者,描述,回复)链接等等等)。


更新

  • 我刚刚在API中看到了getAllTagKeys,希望可以使用它来获取sendInvites密钥,但事实并非如此。即使对于sendInvites设置为true的事件,它也为空。

2 个答案:

答案 0 :(得分:0)

正如tehhowch所述,关键是您必须 使用高级Google API。但是,this page上的文字是:

  

这会向与会者发送邀请电子邮件,并将活动放置在他们的日历上。

...非常容易引起误解。发送电子邮件的唯一方法是将请求的sendUpdates设置为all


首先,您可以验证sendUpdates是通过高级API为 new 事件发送电子邮件的关键部分:

  1. 转到this link
  2. 点击顶部的立即尝试按钮。

    这应该显示一个包含以下信息的表单:

    • calendarId:primary
    • 发送更新: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电子邮件帐户,则应改用plus address

  4. 点击“执行”按钮。

    授予权限后,您将收到一封电子邮件,其中将完全填充日历事件,就像使用Google日历的用户界面发送日历事件一样。

  5. 如果您要明确证明sendUpdates很重要,请将其设置为空白而不是all。发送邀请。请注意,它没有到达您的收件箱。

如果它不起作用,请确保遵循以下腔室

  1. 不得将电子邮件发送到同一登录的Google帐户。例如。使用加号地址,或将其发送到其他帐户。
  2. 确保将sendUpdates设置为all
  3. 确保该事件是将来的某个时间。 Google绝不会为过去发送给活动的邀请发送电子邮件。即使您手动使用Google日历的界面也是如此。它会询问您是否要将更新发送给用户,您选择“是”,但是由于该事件是过去的,因此它实际上不会发送电子邮件。

由于最初的问题已经说明了如何使用标准的CalendarApp来完成我们在上面所做的事情,所以我们并没有取得太大的成就。现在,我们知道sendUpdates很重要,是时候考虑添加一个来宾了。

正如原始问题指出的那样,无法指定sendInvite(就像我们使用 standard 日历API一样)或sendUpdates(就像我们使用使用CalendarApp高级日历API)。我们唯一的方法是addGuest()

幸运的是,我们可以使用与上面类似的方式使用高级日历API,并向事件发送更新(也称为PATCH)。无需与原始JSON和Advanced Calendar API进行交互,我们可以在高级API(也称为Calendar)周围使用Google的精美包装。

但是,由于我们使用的是advanced Calendar API,因此我们必须遵守以下说明:

  

注意:这是一项高级服务,必须在使用前启用。

这意味着在进入代码之前有一些先决条件

  1. 首先,在您的Cloud Platform项目中启用Google Calendar API:

    1. 在您的脚本中,导航到资源> Cloud Platform项目...
    2. 执行下列操作之一:

      • 如果您看到This script has an Apps Script-managed Cloud Platform project.congratulations, you're done with this step
      • 如果看到This script is currently associated with project:,请执行以下操作:

        1. 点击This script is currently associated with project:下方的链接

          这将带您进入Google Cloud Platform上的当前项目。

        2. API和服务>仪表板
        3. 启用API和服务
        4. 添加Google Calendar API
        5. 点击“启用”按钮。
        6. 您可以放心地忽略警告:To use this API, you may need credentials. Click 'Create credentials' to get started.
  2. 接下来,为脚本启用Google Calendar API:

    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时,您需要在eventId的末尾删除@google.com
  2. 您必须先致电get才能获取当前的受邀者列表。如果不这样做,您将不小心删除所有原本参加活动的人员。有关更多信息,请参见this answer

    注意:patch很聪明,只会将电子邮件更新发送给实际添加的人员。例如。如果当前参加活动的人是[alice, bob],并且您发送了带有[alice, bob, charlie]的补丁,则只有charlie会收到一封电子邮件。这正是您想要的!

  3. 上面列表中的所有先前警告都适用。

同样,关键是要知道如何将sendUpdates传递给insert()方法。我找不到有关修补程序方法 1 的任何文档,但自动完成功能显示可以添加一个optionalArgs参数。我随机尝试了上面看到的格式,并且有效!

如果它不起作用,请确保已阅读上面的所有腔室

注意:我很高兴这可以与Google的API一起使用,因为如果不支持,则可能意味着需要手动发送电子邮件并查看how to add calendar metadata to a message so that Gmail parses it properly


1 我们有general patch API,但这仅在发送原始JSON时有用。我们正在使用Google's Calendar wrapper,它映射的并不完全相同。

答案 1 :(得分:0)

请参阅以下请求。

方法:开机自检

端点:https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all

在这里,sendUpdates表示当您添加任何访客时,他将获得根据方案使用的邀请邮件。

输入Json,例如:
    {             “ kind”:“ calendar#event”,             “ etag”:“ etag”,             “ status”:“已确认”,             “ summary”:“ JayKara”,             “ description”:“ eqwbdjhwhhwhhwrhjehrhejhfj”,             “ location”:“ America”,             “创建者”:{                 “电子邮件”:“ @ mail.com”,                 “自我”:真实             },             “组织者”:{                 “ email”:“ @ mail.com”,                 “自我”:真实             },             “开始”:{                 “ date”:“ 2019-12-23”             },             “结束”: {                 “ date”:“ 2019-12-24”             },             “ originalStartTime”:{                 “ date”:“ 2019-12-24”             },             “可见性”:“公开”,             “参与者”:[                 {                     “ email”:“ ****@mail.com” //这是客人                 }             ]         }。

此后,不再需要使用补丁方法,每次活动更新时,来宾将收到邀请。

干杯!