【问题标题】:Embedding a RESTful url in email to add a Google Calendar event在电子邮件中嵌入 RESTful url 以添加 Google 日历活动
【发布时间】:2013-12-26 04:50:36
【问题描述】:

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

我在 Google Developer 的 Cloud Console 中创建了一个项目,并且有 api 密钥等。它连接到日历 API。但我无法弄清楚如何做我想要的。

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

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

一个问题是 OAuth 基本上是为了从用户那里获得访问他们的东西的权限。但在这种情况下,需要授予任何权限的不是用户(即电子邮件收件人)。通过单击电子邮件中的链接,他们将更改 /my/ 日历(虽然是公开的,但不是他们必须共享的日历)。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先,您无法通过链接创建事件,因为 API 需要一个 http post 操作,而使用该链接您只能执行获取操作。 或者,您可以创建 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

    【讨论】:

    • 这很有帮助,谢谢。但是我不想创建一个活动然后发送附件 - 电子邮件本身列出了预订房间/时间的可能次数,收件人必须选择一个才能创建活动。如果我事先创建了所有事件,就好像他们已经保留了所有可能的空缺。我确实注意到插入方法是 POST,而不是 GET。因此,我尝试在电子邮件中嵌入一个 html 表单,并将 POST 参数作为隐藏元素包含在内。那是我遇到授权问题的时候。有嵌入式表单的解决方案吗?
    • 我猜你会遇到一些问题,比如存储令牌值。为什么不在应用程序脚本中创建一个表单并将其链接放入邮件中?
    • 嗯,我不太确定我在关注你。我确实在应用程序脚本中生成了所有电子邮件内容,然后他们收到的电子邮件只显示了一个可供单击的按钮。但你是对的,这是我试图绕过的令牌。公共日历是否绝对需要令牌?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多