外部網頁新增 Google 日曆行程(URL模板)

 好的,從外部網頁新增 Google 日曆行程,最常用且最簡單的方法是使用 Google Calendar Event Publisher Guide 提供的 URL 模板。這種方法不需要複雜的 API 整合或使用者授權流程 (OAuth),只需要產生一個特殊格式的連結即可。

使用者點擊這個連結後,會被導向到他們自己的 Google 日曆,並看到一個預先填好資訊的新增行程頁面,他們只需要確認並儲存即可。

以下是詳細步驟和說明:

方法:使用 Google 日曆事件發布連結 (URL Template)

  1. 基本 URL 結構:

          https://www.google.com/calendar/render?action=TEMPLATE
        
  2. 添加參數以預填行程資訊:
    在基本 URL 後面加上 &參數名稱=參數值 來指定行程細節。重要的參數包括:

    • text: 行程標題 (必填)

      • 範例: &text=團隊會議

    • dates: 行程開始和結束時間 (必填)。格式非常重要,必須是 ISO 8601 格式,且強烈建議使用 UTC (世界標準時間),以避免時區混淆。

      • 特定時間格式: YYYYMMDDTHHMMSSZ/YYYYMMDDTHHMMSSZ (Z 表示 UTC)

        • 範例 (2024年7月26日 UTC 下午 2:00 到 3:00): &dates=20240726T140000Z/20240726T150000Z

      • 全天事件格式: YYYYMMDD/YYYYMMDD (結束日期是不包含的那一天的日期,所以通常是開始日期加一天)

        • 範例 (2024年7月27日全天): &dates=20240727/20240728

    • location: 行程地點

      • 範例: &location=台北101會議室

    • details: 行程說明或備註。可以包含換行符號 (\n)。

      • 範例: &details=討論下一季專案規劃。\n請攜帶筆記型電腦。

    • sprop: 來源網站資訊 (可選,但建議加入)。

      • 範例: &sprop=name:我的網站名稱&sprop=url:https://www.mywebsite.com

    • add: 邀請的賓客 Email (可選)。用逗號分隔多個 Email。

      • 範例: &add=user1@example.com,user2@example.com

  3. URL 編碼 (URL Encoding):
    所有參數的值都必須進行 URL 編碼,尤其是包含空格、換行符、特殊符號 (如 : / &) 的文字。大部分程式語言都有內建的 URL 編碼函式 (例如 JavaScript 中的 encodeURIComponent())。

    • 範例 (未編碼):
      https://www.google.com/calendar/render?action=TEMPLATE&text=團隊 會議&dates=20240726T140000Z/20240726T150000Z&location=台北 101 會議室&details=討論下一季專案規劃。\n請準備資料。

    • 範例 (已編碼):
      https://www.google.com/calendar/render?action=TEMPLATE&text=%E5%9C%98%E9%9A%8A%20%E6%9C%83%E8%AD%B0&dates=20240726T140000Z/20240726T150000Z&location=%E5%8F%B0%E5%8C%97%20101%20%E6%9C%83%E8%AD%B0%E5%AE%A4&details=%E8%A8%8E%E8%AB%96%E4%B8%8B%E4%B8%80%E5%AD%A3%E5%B0%88%E6%A1%88%E8%A6%8F%E5%8A%83%E3%80%82%0A%E8%AB%8B%E6%BA%96%E5%82%99%E8%B3%87%E6%96%99%E3%80%82
      (注意:\n 被編碼為 %0A)

  4. 在網頁中實作:
    將這個產生好的、經過 URL 編碼的連結,放在 HTML 的 <a> 標籤的 href 屬性中。

          <!DOCTYPE html>
    <html>
    <head>
        <title>新增行程到 Google 日曆</title>
        <meta charset="UTF-8">
    </head>
    <body>
    
        <h1>重要活動</h1>
        <p>活動名稱:團隊會議</p>
        <p>時間:2024年7月26日 UTC 14:00 - 15:00</p>
        <p>地點:台北 101 會議室</p>
        <p>說明:討論下一季專案規劃。請準備資料。</p>
    
        <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=%E5%9C%98%E9%9A%8A%20%E6%9C%83%E8%AD%B0&dates=20240726T140000Z/20240726T150000Z&location=%E5%8F%B0%E5%8C%97%20101%20%E6%9C%83%E8%AD%B0%E5%AE%A4&details=%E8%A8%8E%E8%AB%96%E4%B8%8B%E4%B8%80%E5%AD%A3%E5%B0%88%E6%A1%88%E8%A6%8F%E5%8A%83%E3%80%82%0A%E8%AB%8B%E6%BA%96%E5%82%99%E8%B3%87%E6%96%99%E3%80%82&sprop=name:My%20Website&sprop=url:https%3A%2F%2Fwww.mywebsite.com" target="_blank" rel="noopener noreferrer">
            <img src="https://www.google.com/calendar/images/ext/gc_button1_en.gif" alt="Add to Google Calendar">
            <!-- 或者使用文字連結 -->
            <!-- 新增到 Google 日曆 -->
        </a>
    
        <script>
        // 如果需要動態產生連結 (例如,從表單或 API 取得資料)
        // 可以使用 JavaScript 來建立 URL 並進行編碼
    
        function generateGoogleCalendarLink(eventData) {
            const baseUrl = 'https://www.google.com/calendar/render?action=TEMPLATE';
            const params = new URLSearchParams(); // 自動處理編碼
    
            params.append('text', eventData.title);
            // 注意:日期時間需要先轉換成正確的 ISO 8601 UTC 格式
            params.append('dates', eventData.dates); // e.g., '20240726T140000Z/20240726T150000Z'
            if (eventData.location) {
                params.append('location', eventData.location);
            }
            if (eventData.details) {
                params.append('details', eventData.details);
            }
            if (eventData.websiteName && eventData.websiteUrl) {
                params.append('sprop', `name:${eventData.websiteName}`);
                params.append('sprop', `url:${eventData.websiteUrl}`);
            }
    
            return `${baseUrl}&${params.toString()}`;
        }
    
        // 範例使用
        /*
        const myEvent = {
            title: '動態產生會議',
            dates: '20240727T090000Z/20240727T100000Z', // 假設這是已轉換好的 UTC 時間
            location: '線上會議室',
            details: '這是用 JavaScript 動態產生的連結。\n包含換行。',
            websiteName: '我的動態網站',
            websiteUrl: 'https://dynamic.example.com'
        };
    
        const dynamicLink = generateGoogleCalendarLink(myEvent);
        console.log(dynamicLink);
        // 可以將 dynamicLink 設定給 <a> 標籤的 href
        // document.getElementById('myCalendarLink').href = dynamicLink;
        */
        </script>
    
    </body>
    </html>
        

重點注意事項:

  1. 時區 (Timezone): 這是最容易出錯的地方。強烈建議在 dates 參數中使用 UTC 時間 (結尾加 Z)。如果你提供的是本地時間,Google 會嘗試根據使用者的日曆設定來解釋,但這可能導致不一致。在伺服器端或客戶端生成時間字串時,務必轉換為 UTC。

  2. URL 編碼: 確保所有參數值都經過正確的 URL 編碼,否則連結可能會失效或資訊顯示不完整。

  3. 使用者體驗: 使用 target="_blank" 在新分頁開啟 Google 日曆,避免使用者離開你的網頁。清楚標示按鈕或連結的用途 (例如 "新增到 Google 日曆")。

  4. 測試: 徹底測試你產生的連結,確認所有資訊都正確地預填到 Google 日曆頁面。

替代方案 (較複雜):

  • Google Calendar API: 如果你需要更深度的整合,例如在背景直接新增行程 (需要使用者授權 OAuth 2.0)、讀取使用者日曆、或管理日曆資源,就需要使用 Google Calendar API。這通常需要後端程式碼,並且涉及複雜的驗證流程。對於僅僅是讓使用者方便地將 你的 活動加到 他們 的日曆中,URL 模板方法通常是更好、更簡單的選擇。

  • 第三方服務 (如 AddEvent, AddToCalendar): 有些服務提供整合多種日曆 (Google, Outlook, Apple Calendar 等) 的按鈕或小工具,可以簡化跨平台支援,但可能需要付費或依賴外部服務。

對於你的需求,使用 URL 模板方法是最直接且推薦的方式。

留言

這個網誌中的熱門文章

Offscreen Canvas

計算 Canvas 文字最大字體