每当我通过Google日历界面添加访客时,都会弹出以下对话框:
如果我选择“发送”,它会向用户发送格式正确的电子邮件,并且还可以选择响应日历事件:
当您手动使用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自动发送的格式(例如,带有嵌入式日历邀请,与会者,描述,回复)链接等等等)。
更新:
sendInvites
密钥,但事实并非如此。即使对于sendInvites
设置为true的事件,它也为空。答案 0 :(得分:0)
正如tehhowch所述,关键是您必须 使用高级Google API。但是,this page上的文字是:
这会向与会者发送邀请电子邮件,并将活动放置在他们的日历上。
...非常容易引起误解。发送电子邮件的唯一方法是将请求的sendUpdates
设置为all
。
首先,您可以验证sendUpdates
是通过高级API为 new 事件发送电子邮件的关键部分:
点击顶部的立即尝试按钮。
这应该显示一个包含以下信息的表单:
primary
all
请求正文:
{
"start": {
"date": "2029-04-04"
},
"end": {
"date": "2029-04-04"
},
"summary": "Test",
"attendees": [
{
"email": "your.email+1@example.com"
}
]
}
将your.email+1@example.com
更改为您的电子邮件地址。
请注意,这不能是您登录时使用的确切电子邮件地址。否则,脚本将注意到您正在尝试向自己发送电子邮件,而不发送。相反,如果您有Google电子邮件帐户,则应改用plus address。
点击“执行”按钮。
授予权限后,您将收到一封电子邮件,其中将完全填充日历事件,就像使用Google日历的用户界面发送日历事件一样。
sendUpdates
很重要,请将其设置为空白而不是all
。发送邀请。请注意,它没有到达您的收件箱。如果它不起作用,请确保遵循以下腔室:
sendUpdates
设置为all
。由于最初的问题已经说明了如何使用标准的CalendarApp
来完成我们在上面所做的事情,所以我们并没有取得太大的成就。现在,我们知道sendUpdates
很重要,是时候考虑添加一个来宾了。
正如原始问题指出的那样,无法指定sendInvite
(就像我们使用 standard 日历API一样)或sendUpdates
(就像我们使用使用CalendarApp
时高级日历API)。我们唯一的方法是addGuest()。
幸运的是,我们可以使用与上面类似的方式使用高级日历API,并向事件发送更新(也称为PATCH)。无需与原始JSON和Advanced Calendar API进行交互,我们可以在高级API(也称为Calendar
)周围使用Google的精美包装。
但是,由于我们使用的是advanced Calendar API,因此我们必须遵守以下说明:
注意:这是一项高级服务,必须在使用前启用。
这意味着在进入代码之前有一些先决条件:
首先,在您的Cloud Platform项目中启用Google Calendar API:
执行下列操作之一:
This script has an Apps Script-managed Cloud Platform project.
,congratulations, you're done with this step!如果看到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);
}
一些洞穴:
@google.com
。您必须先致电get
才能获取当前的受邀者列表。如果不这样做,您将不小心删除所有原本参加活动的人员。有关更多信息,请参见this answer。
注意:patch
很聪明,只会将电子邮件更新发送给实际添加的人员。例如。如果当前参加活动的人是[alice, bob]
,并且您发送了带有[alice, bob, charlie]
的补丁,则只有charlie
会收到一封电子邮件。这正是您想要的!
同样,关键是要知道如何将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” //这是客人
}
]
}。
此后,不再需要使用补丁方法,每次活动更新时,来宾将收到邀请。
干杯!