【问题标题】:Google Calendar errors on importing .ics file导入 .ics 文件时出现 Google 日历错误
【发布时间】:2014-01-22 06:16:04
【问题描述】:

我很难让我的订阅日历与 Google 日历一起使用。以下 URL 可在 Outlook 和 Apple 日历 (iCal) 中正常工作,但我从 Google 收到错误消息 - “您提供的地址不包含有效 iCal 或 GData 格式的日历。”

我的网址通过了以下验证器(icalvalid.cloudapp.net/ 和 severinghaus.org/projects/icv/)的验证

谁能提供任何想法是什么问题?这是网址: https://beta.vcallboard.com/calls/exportcalendar.php?userID=Mg%3D%3D&token=MjB6N2E0OTk%3D

我已经尝试过的理论: - 不适用于 https - (我将 .ics 文件作为文件保存并上传到我的服务器根目录中,并且该 URL 有效 - 似乎它与自动生成有关) - 某些字段的空白值无效(如果我将其作为 .ics 文件上传,它会起作用)

【问题讨论】:

  • 我加了一个'.'描述后的字符:和位置:所以它们不会是空白值。现在 Google 将允许我导入日历,但它实际上不会显示任何事件。
  • 我也试过这个解决方案:devnet.superoffice.com/Developer/Blog/…没用。
  • 我的第一个建议是转到:icalendar.org/validator.html 并验证您的文件/内容。这对我帮助很大。

标签: google-calendar-api icalendar


【解决方案1】:

您没有定义您在 ICS 文件中引用的时区。您有如下几行:

DTSTART;TZID=America/Chicago:20140121T010000

但要使用这些,您需要定义您的时区,例如:

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Test calendar
X-WR-TIMEZONE:Indian/Reunion
BEGIN:VTIMEZONE
TZID:Indian/Reunion
TZURL:http://tzurl.org/zoneinfo/Indian/Reunion
X-LIC-LOCATION:Indian/Reunion
BEGIN:STANDARD
TZOFFSETFROM:+034152
TZOFFSETTO:+0400
TZNAME:RET
DTSTART:19110601T000000
RDATE:19110601T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
...

获取时区定义文件的好地方是tzurl.org

【讨论】:

  • 由于此 URL devnet.superoffice.com/Developer/Blog/…,我曾尝试转到时区 - 但它实际上破坏了 Outlook 中的日历。于是我又回到了以前。你可以再看看。现在我只是将 DTSTART/DTEND 设置为 GMT 格式。
  • 您在上面放置的 ICS 可以很好地导入到 Google 日历中,并且事件会显示出来。
  • 是的 - 这就是让我难过的原因。我可以很好地导入该 ICS,但如果我选择“通过 URL 添加”并提供引用的 URL,它将不会显示事件(尽管日历实际上并没有出错)
  • 如果您需要准确的时间和时区,这非常重要!有用的工具:icalendar.org/validator.html
【解决方案2】:

我对我的问题感到困惑,因为我可以手动导入脚本输出的 .ics 文件,并且 Google 日历可以毫无问题地读取该文件。所以我认为 iCal 文件的实际格式没有问题 - 我认为它必须是标题或某些服务器配置的问题。于是我做了几个实验……

长话短说,我可以通过执行以下操作使其在 Google 日历上运行:

  1. 使用所有 iCal 数据、从数据库中提取、站点常量等加载一个变量。确保使用 \r\n 在验证器中进行更好的验证。

    $iCal = "BEGIN:VCALENDAR\r
    VERSION:2.0\r
    PRODID:-//VirtualCallboard//".SITENAME."//EN\r
    CALSCALE:GREGORIAN\r
    METHOD:PUBLISH\r";
    while ($r=mysql_fetch_assoc($result))
    {
        // i do a bunch of stuff here to get variables ready for the output
        $iCal .= "BEGIN:VEVENT\r
    DTSTAMP:".gmdate("Ymd\THis\Z")."\r
    DTSTART:".date("Ymd\THis\Z", strtotime($r[tdstart]))."\r
    DTEND:'.date("Ymd\THis\Z",   strtotime($r[tdend]))."\r
    SUMMARY:$r[title]\r
    UID:$r[callid]@".$_SERVER['HTTP_HOST']."\r
    DESCRIPTION:$r[notes].\r
    LOCATION:$r[location_name].\r
    STATUS:CONFIRMED\r
    END:VEVENT\r\n";
    }
    $iCal .= "END:VCALENDAR";
    
  2. 转义特殊字符(我现在只知道逗号)。然后(这是秘密)-使用 file_put_contents 将 iCal 变量中的字符串写入缓存目录中扩展名为 .ics 的文件中

    //escape special characters.
    $iCal = str_replace(",","\,",$iCal);
    
    //output to a file
    $filename = 'site/cache/'.date("YmdHis").'.ics';
    file_put_contents($filename,$iCal);
    
  3. 调用标题:

    //set correct content-type-header
    header("Content-Type:text/calendar");
    header("Content-Disposition:inline;filename=my_ical.ics");
    
  4. 使用 file_get_contents 从文件中读取 .ics 数据并将其输出到浏览器。

    print file_get_contents($filename);
    
  5. 清理我在缓存目录中创建的 .ics 文件。

    unlink($filename);
    exit;
    

出于某种我无法解释的原因,这使得完全相同的文件在 Google 日历中工作。因此,它与 Outlook、Google 日历和 Apple 日历兼容。

【讨论】:

  • 通过使用 HEREDOC 语法,您的解决方案不一定是可移植的。 iCal 文件应该有 \r\n (CR+LF) 行结尾。在您的 HEREDOC 字符串中,您有 \r 以及您的操作系统正在使用的任何内容。如果您通过 FTP 将文件传输到不同的操作系统并允许您的 FTP 软件修改行尾,那么它可能会中断,具体取决于您的操作系统。
  • 非常有帮助,如果使用 .net,您可以执行以下操作: contenidoArchivoICS.AppendLine("BEGIN:VCALENDAR"); contenidoArchivoICS.AppendLine("VERSION:2.0"); contenidoArchivoICS.AppendLine("PRODID:-//COMPANY//APP NAME//ES"); contenidoArchivoICS.AppendLine("CALSCALE:GREGORIAN"); contenidoArchivoICS.AppendLine("METHOD:PUBLISH");
【解决方案3】:

可能值得记住的是,Google 会缓存日历 URL,并且仅每 x 小时(12 小时?)刷新一次。因此,如果您在使其正常工作之前尝试添加您的 URL,它可能仍会显示旧版本,这可能什么都没有。

尝试对您的 URL 添加一个不相关的更改,例如,在末尾添加一个查询 (?foo=1),或者尽可能更改服务器上的地址。

https://www.binarysludge.com/2012/02/01/how-to-force-refresh-google-calendar/

(缓存是一种问题,在我弄乱标题和 ics 格式的最后几个小时里,我从未想到过。人们倾向于认为自己的更改至少会产生影响。)

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2016-12-27
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多