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

Sen*_*ful 3 google-calendar-api google-apps-script

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

在此处输入图片说明

如果我选择“发送”,它会向用户发送一封格式良好的电子邮件,并提供响应日历事件的选项:

在此处输入图片说明

当您手动使用 Google 日历 UI 时,这可以完美运行。问题是我正在尝试使用 Google Apps 脚本来自动将人员添加到事件中。

我正在使用addGuest()以编程方式将客人添加到 CalendarEvent :

event.addGuest("user@example.com");
Run Code Online (Sandbox Code Playgroud)

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

我能找到的最接近的是,当您以编程方式创建事件时,您可以设置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());
Run Code Online (Sandbox Code Playgroud)

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

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

  var event = CalendarApp.getEventById("insert_id_here");
  event.addGuest("your.email+2@example.com");
Run Code Online (Sandbox Code Playgroud)

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

sendInvites调用addGuest()事件时有什么办法吗?例如event.addGuest("user@example.com", {sendInvite: true})

是否有任何其他解决方法会产生与点击上面 UI 中的“发送”按钮时发送的电子邮件相同的电子邮件?

注:我希望使用MailApp,因为它不会被很好地格式化像一个谷歌发送电子邮件自动发送出去(例如,具有嵌入式日历邀请,出席者,描述,响应链接等,等,等)。


更新:

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

Sen*_*ful 12

正如 tehhowch 提到的,关键是您必须为此使用高级 Google API。但是,此页面上的文字说:

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

……非常误导。它会发送电子邮件的唯一方法是,如果你设置sendUpdatesall的请求。


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

  1. 转到此链接
  2. 点击顶部的立即试用按钮。

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

    • 日历 ID: primary
    • 发送更新: all
    • 请求正文:

      {
        "start": {
          "date": "2029-04-04"
        },
        "end": {
          "date": "2029-04-04"
        },
        "summary": "Test",
        "attendees": [
          {
            "email": "your.email+1@example.com"
          }
        ]
      }
      
      Run Code Online (Sandbox Code Playgroud)
  3. 将 更改your.email+1@example.com为您的电子邮件地址。

    请注意,这不能是您登录时使用的确切电子邮件地址。否则脚本会注意到您正在尝试向自己发送电子邮件而不是发送。相反,如果您有 Google 电子邮件帐户,则应改用加号地址

  4. 点击执行按钮。

    授予它权限后,您将在收件箱中收到一封电子邮件,其中日历事件已完全填充,就像使用 Google 日历的 UI 时发送的一样。

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

如果它不起作用,请确保您遵循以下注意事项

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

由于最初的问题已经展示了如何使用标准CalendarApp来完成我们上面所做的工作,因此我们还没有完成太多工作。既然我们知道这sendUpdates很重要,那么是时候考虑添加来宾了。

由于原来的问题指出,有没有办法来指定sendInvite(我们将与标准的日历API)或sendUpdates(这是我们与先进当使用日历API) CalendarApp。我们唯一的方法是addGuest()

幸运的是,我们可以使用与上面类似的高级日历 API,并向事件发送更新(又名 PATCH)。我们可以使用 Google 对高级 API(又名Calendar)的漂亮包装器,而不是与原始 JSON 和高级日历 API 接口。

但是,由于我们使用的是高级 Calendar API,因此我们必须遵守以下注意事项:

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

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

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

    1. 在您的脚本中,导航到资源 > Cloud Platform 项目...
    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
        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);
}
Run Code Online (Sandbox Code Playgroud)

一些注意事项

  1. 当您传递 eventId 时,您需要删除@google.comeventId 末尾的 。
  2. 您必须先致电get以获取当前的受邀者列表。如果不这样做,您将不小心删除原来参加活动的所有人员。有关更多信息,请参阅此答案

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

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

再次,关键是知道如何传递sendUpdatesinsert()方法。我找不到关于补丁方法1 的任何文档,但自动完成显示有一个optionalArgs可以添加的参数。我随机尝试了你在上面看到的格式,它奏效了!

如果它不起作用,请确保您阅读了上面的所有警告

注意:我很高兴这与 Google 的 API 一起工作,因为如果没有,则可能意味着需要手动发送电子邮件,并研究如何将日历元数据添加到邮件中,以便 Gmail 正确解析它


1我们有通用补丁 API,但这仅在发送原始 JSON 时有用。我们正在使用Google 的Calendarwrapper,它的映射并不完全相同。