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,因为它不会被很好地格式化像一个谷歌发送电子邮件自动发送出去(例如,具有嵌入式日历邀请,出席者,描述,响应链接等,等,等)。
更新:
sendInvites密钥,但事实并非如此。即使对于sendInvites设置为 true 的事件,它也是空的。Sen*_*ful 12
正如 tehhowch 提到的,关键是您必须为此使用高级 Google API。但是,此页面上的文字说:
这会向与会者发送一封邀请电子邮件,并将活动放在他们的日历上。
……非常误导。它会发送电子邮件的唯一方法是,如果你设置sendUpdates到all的请求。
首先,您可以验证这sendUpdates是通过高级 API为新事件发送电子邮件的关键部分:
点击顶部的立即试用按钮。
这应该会显示一个包含以下信息的表单:
primaryall请求正文:
{
"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)将 更改your.email+1@example.com为您的电子邮件地址。
请注意,这不能是您登录时使用的确切电子邮件地址。否则脚本会注意到您正在尝试向自己发送电子邮件而不是发送。相反,如果您有 Google 电子邮件帐户,则应改用加号地址。
点击执行按钮。
授予它权限后,您将在收件箱中收到一封电子邮件,其中日历事件已完全填充,就像使用 Google 日历的 UI 时发送的一样。
sendUpdates一点很重要,请将其设置为空白而不是all。发送邀请。请注意,它没有到达您的收件箱。如果它不起作用,请确保您遵循以下注意事项:
sendUpdates设置为all。由于最初的问题已经展示了如何使用标准CalendarApp来完成我们上面所做的工作,因此我们还没有完成太多工作。既然我们知道这sendUpdates很重要,那么是时候考虑添加来宾了。
由于原来的问题指出,有没有办法来指定sendInvite(我们将与标准的日历API)或sendUpdates(这是我们与先进当使用日历API) CalendarApp。我们唯一的方法是addGuest()。
幸运的是,我们可以使用与上面类似的高级日历 API,并向事件发送更新(又名 PATCH)。我们可以使用 Google 对高级 API(又名Calendar)的漂亮包装器,而不是与原始 JSON 和高级日历 API 接口。
但是,由于我们使用的是高级 Calendar API,因此我们必须遵守以下注意事项:
注意:这是一项高级服务,必须在使用前启用。
这意味着在跳入代码之前有一些先决条件:
首先,在您的 Cloud Platform 项目中启用 Google Calendar API:
执行以下操作之一:
This script has an Apps Script-managed Cloud Platform project.,恭喜你,你已经完成了这一步!如果您看到This script is currently associated with project:,请执行以下操作:
点击下方链接 This script is currently associated with project:
这会将您带到 Google Cloud Platform 上的当前项目。
To use this API, you may need credentials. Click 'Create credentials' to get started.接下来,为脚本启用 Google Calendar API:
点击 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)
一些注意事项:
@google.comeventId 末尾的 。您必须先致电get以获取当前的受邀者列表。如果不这样做,您将不小心删除原来参加活动的所有人员。有关更多信息,请参阅此答案。
注意:patch很聪明,只会向实际添加的人发送电子邮件更新。例如,如果当前参加活动的人是[alice, bob],并且您发送带有 的补丁[alice, bob, charlie],则只会charlie收到一封电子邮件。这正是你想要的!
再次,关键是知道如何传递sendUpdates到insert()方法。我找不到关于补丁方法1 的任何文档,但自动完成显示有一个optionalArgs可以添加的参数。我随机尝试了你在上面看到的格式,它奏效了!
如果它不起作用,请确保您阅读了上面的所有警告。
注意:我很高兴这与 Google 的 API 一起工作,因为如果没有,则可能意味着需要手动发送电子邮件,并研究如何将日历元数据添加到邮件中,以便 Gmail 正确解析它。
1我们有通用补丁 API,但这仅在发送原始 JSON 时有用。我们正在使用Google 的Calendarwrapper,它的映射并不完全相同。
| 归档时间: |
|
| 查看次数: |
2613 次 |
| 最近记录: |