将单个谷歌日历事件导出到ICS


Exporting Single Google Calendar Events to ICS?

我目前正在研究在网页上显示多个谷歌日历中的事件列表的可能性。目前,我正在使用WordPress的谷歌日历事件插件来显示网站上的事件(防火墙后面的开发网站,所以我不能共享链接);但我想看看是否有任何简单的方法可以为每个单独的事件动态生成ICS文件。

我们希望允许网站访问者将单个事件添加到他们的日历中,但Google日历数据API似乎只提供以ICS格式下载整个日历的选项。我试着简单地在ICAL提要地址的末尾添加一个带有eid(事件ID)的查询字符串,但这仍然打开了标准的Google ICAL提要,其中包括日历上当前包含的所有事件。

我有点熟悉从头开始动态构建ICS文件,过去也做过一次,从本地Perl日历程序中提取事件,并为每个事件生成一个ICS文件;但是,如果有任何预先构建的API或PHP类已经设置为从单个Google日历事件构建ICS文件,我更喜欢使用它们。

它很简单,实际上只是一个页面,试试这个:(当然,你需要替换你自己的变量…)

<?php
    /*
    * generates calendar ics file
    */ 
if( 
    empty($_GET['summary']) || 
    empty($_GET['dtstart']) || 
    empty($_GET['dtend']) 
){
header ("Location: /diary/this-week") ;
exit();
} 
  header("Content-type: text/calendar");
  header("Content-Disposition: attachment; filename=".urlencode($_GET['summary']).'-'.time().".ics");
  header("Pragma: no-cache");
  header("Expires: 0");
  echo 'BEGIN:VCALENDAR
VERSION:2.0
PRODID:councilsites
METHOD:PUBLISH
BEGIN:VEVENT
URL:'. htmlentities( $_GET['url'] ) .'
UID:'. htmlentities( $_GET['url'] ) .'
SUMMARY:'. htmlentities( $_GET['summary'] ) .'
DTSTAMP:'. date('Ymd'THis'Z') .'
DTSTART:'. htmlentities( $_GET['dtstart'] ) .'
DTEND:'. htmlentities( $_GET['dtend'] ) .'
LOCATION:'. htmlentities( $_GET['location'] ) .' 
END:VEVENT
END:VCALENDAR';

?>

我通过谷歌挖掘到的一些PHP库,都是针对PHP的,我敢打赌还有更多:

  • Bennu-PHP iCalendar库
  • iCalcreator
  • iCalendar/vCard PHP解析器(SabreDAV)
  • PHP iCalendar

我意识到这是多么过时-但它在如何获得单个事件的ics的阴险搜索引擎排名中几乎名列前茅-以上所有内容对我来说都不起作用,也许不奇怪线程有多老。

我的解决方案-为导出单个事件创建一个特殊的日历-将您想要导出的事件复制到该日历-导出日历-然后删除事件,以便下次清理-我能够将单个事件导入T'bird。

我意识到,导出一个只有一个事件的日历与导出一个事件(或者,也许是)不太一样,但这似乎是一个有用的解决方案。

我还想为单个事件生成一个.ics文件。我不想搞砸PHP,所以我打算用grymala的提示。不幸的是,我不知道要导出的事件的日历ID,所以我导出了gcal的所有日历,并编辑了生成的文件,使其只包含日历标题、基脚和事件lsiting。我还删除了日历名称,我想我不知道这是否有必要。我从来没有像gymala建议的那样找到获取特定日历url的方法,但我确实是根据这个帮助文本找到的。

  1. 在页面左侧的日历列表中,移动鼠标在您要从中导出的日历上。

  2. 您将看到日历名称旁边出现一个下拉箭头。单击下拉箭头,然后选择日历设置。(或者,单击"我的日历"旁边的下拉箭头,选择"设置",然后从列表中单击相应的日历。)

  3. 单击页面底部"私人地址"部分的ICAL按钮,然后单击显示的URL。

  4. 将导出的文件保存到计算机上所需的文件夹中,可能是将该URL粘贴到另一个浏览器窗口中,复制窗口文本,然后将其粘贴到编辑器中。