VBA /自訂函數產生Google calendar render link

最近在師大的活動頁面中看到

透過點擊”加到行事曆”的按鈕

可以將活動加到google行事曆

仔細看網頁的內容可以發現是

利用google行事曆的eventedit功能透過超連結設定參數

(只是看不懂網頁為什麼還要再額外設計一個按鈕,不知道是要觸發什麼事件)

 

直接連結以下的超連結會連到google calendar 新增活動的頁面

https://calendar.google.com/calendar/u/0/r/eventedit

這個是網頁按鈕的超連結

https://calendar.google.com/calendar/u/0/r/eventedit?text=戰勝心魔篇:相信我,你也會愛上統計學!&dates=20210503T160000Z/20210512T070000Z&details=http://pr.ntnu.edu.tw/chirpy/ntnu_event.php?event=6510&location=圖書館總館B1國際會議廳

而設定行事曆的主要參數與功能如下

text=活動名稱

dates=開始時間/結束時間,格式是YYYYMMDDTHHMMSS,中間的T是用來分隔日期與時間的符號,系統預設的時區是使用者預設時區,所以不用像GAS還需要轉換時區

details=是活動內容,如果需要換行,使用的換行符號是%0A

location=地點

使用者可以自己決定加入到自己的哪個行事曆中

 

為了更簡便產生超連結標籤

我在Excel VBA利用自訂函數功能來串接html的字串

1
2
3
4
5
Public Function google_render(render As String, datatime As String, desc As String, location As String)

    google_render = "<a target=""" & "_blank""" & " href=""" & "https://www.google.com/calendar/event?action=TEMPLATE&text=" & render & "&dates=" & datatime & "&details=" & desc & "&location=" & location & "&trp=false""" & ">新增至行事曆</a>"

End Function

 

需要留意的是VBA使用的連結符號是&,字串只能用雙引號包起來,所以字串與變數的連結時

比較簡便的方式是把超連結裡的雙引號都改成單引號,這樣字串的分割與連結會比較單純

如果要在超連結裡使用雙引號的話,原本的1個雙引號就要變成2個雙引號,加上程式包圍字串的另1個雙引號,再用&連結其他字串

備註

後來在其他的程式碼看到,如果要輸出一個 “,只要連續兩個 “就可以達成

也就是不用特別針對這些原本程式碼裡的 “,再去分割連結字串

只要處理跟變數的連結即可

因此,程式碼可以改成

google_render = "<a target=""_blank"" href=""https://www.google.com/calendar/event?action=TEMPLATE&text=" & render & "&dates=" & datatime & "&details=" & desc & "&location=" & location & "&trp=false"">新增至行事曆</a>"

 

之後透過一個自訂程序,執行Application.MacroOptions來註冊這個自訂函數的說明內容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Sub RegUDF()
    Dim FuncName As String '自訂函數的名稱
    Dim FuncDesc As String '自訂函數的內容描述
    Dim Category As String '自訂函數的類別
    Dim ArgDesc(1 To 4) As String '參數內容的描述
    
    FuncName = "google_render"
    FuncDesc = "產生google render的超連結標籤"
    Category = "7" '7是文字類別
    ArgDesc(1) = "事件名稱"
    ArgDesc(2) = "起訖時間,時間格式為 YYYYMMDDTHHMMSS/YYYYMMDDTHHMMSS"
    ArgDesc(3) = "活動描述,使用 %0A 作為換行"
    ArgDesc(4) = "活動地點"
    
    Call Application.MacroOptions(Macro:=FuncName, Description:=FuncDesc, Category:=Category, ArgumentDescriptions:=ArgDesc)

End Sub

 

以下是實際使用的畫面

除了用html標籤之外,也可以用JavaScript的事件來設定按鈕觸發

See the Pen Google calendar render by 莊幸諺 (@trico109748007) on CodePen.

 
 

參考資料

google render

Link to add to Google calendar

自訂函數的說明設定

如何讓Excel的自訂函數顯示說明文字

Excel VBA 添加自定义函数的参数描述

Application.MacroOptions 方法 (Excel)