在电子邮件中嵌入RESTful网址以添加Google日历活动

时间:2013-12-26 04:50:36

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

我想发送一封包含链接的电子邮件,点击此链接后,会在我创建(并公开)的Google日历上创建新活动。

我在Google Developer的云控制台中创建了一个项目,并有api密钥等。它已连接到Calendar API。但我无法弄清楚如何做到我想要的。

有问题的日历旨在跟踪学生何时何地想要聚在一起完成家庭作业问题集。因此,电子邮件会通知他们在给定时间可用的房间。电子邮件中嵌入的链接会在点击时保留给定的学习室/时间(这意味着它会在Google日历上添加一个专门存储预订信息的活动)。

我在Google Apps的REST和OAuth文档中有点迷失;我已经尝试了许多不同的策略,但到目前为止没有一个工作得很好 - 所以我对发布任何失败的代码尝试犹豫不决。我已经尝试过使用Google提供的OAuth2游乐场,但是我不太确定如何将它提供的json与调用Calendar API一起放在一个URI中。

一个问题是OAuth基本上是为了获取用户访问其内容的权限。但在这种情况下,不是用户(即电子邮件收件人)需要授予任何权限。通过点击电子邮件中的链接,它/我/日历将会发生变化(虽然公开,但不是他们必须共享的日历)。

理想情况下,我可以嵌入某种授权,在他们点击的链接中进行这些更改,这样他们就不必看到任何OAuth方面的内容,或者被额外的提示所困扰。理想的应用程序流程很简单:获取可用时间的电子邮件,点击链接,接收预订已添加到日历中的注释。 (可能邀请加入该日历)

我已经在other SO posts上找到了并且感觉这可以做到,但是我没有足够的示例代码可以让我离开和文档,虽然有助于我的理解,似乎并没有为我提供我正在寻找的起点。

如果有人拥有示例URI,包括清除OAuth并在日历中插入新事件所需的所有参数/路径,我将非常感激。

1 个答案:

答案 0 :(得分:1)

首先,您无法通过链接创建活动,因为API需要http发布操作,而链接只需要获取。 或者,您可以创建ICS邀请并作为附件发送给您的客人。 请参见下面的示例:

function sendInvites() {
  var startDate = new Date(2013,11,26, 10,0);
  var endDate = new Date(2013, 11, 26, 10,30);
  var guestMail = "mymail@mymail.com";


  var event = CalendarApp.createEvent(eventTitle, startDate, endDate);
  event.setTitle("Event Title");
  event.setDescription("My description");
  event.setLocation("My Location");


  //OR
  //var event = CalendarApp.getEventSeriesById("event id");


var ics = "BEGIN:VCALENDAR\r\nPRODID:-//Google Inc//Google Calendar     70.9054//EN\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nBEGIN:VEVENT\r\n";
ics+= "DTSTART:"+Utilities.formatDate(startDate, "GMT", "yyyyMMdd'T'HHmmss'Z'")
    +"\r\nDTEND:"+Utilities.formatDate(endDate, "GMT", "yyyyMMdd'T'HHmmss'Z'")+"\r\n";
ics+= "UID:"+event.getId()+"\r\n";
ics+= "SUMMARY:"+event.getTitle()+"\r\nLOCATION:"+event.getLocation()+"\r\nDESCRIPTION:\r\n";
ics+= "SEQUENCE:0\r\nSTATUS:CONFIRMED\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";


MailApp.sendEmail(guestMail, "invite", "invite body",  {attachments: [Utilities.newBlob(ics, "text/calendar")]});
}

实时版here