Google Calendar API

using .NET

最近開始思考有什麼樣的需求可以當作小小的 side project 練習,剛好最近疫情的關係比較多人請假,我就把腦筋動到了請假系統身上。在目前的請假流程中,有一個部分是填寫 google 表單,送出之後會自動新增到 google calendar 上,只要有加入這個日曆的人都可以看到。所以決定以這個為主題,爬了一下文,順便紀錄一下使用 google calendar 的過程。

使用前的準備

Google API 都是透過 token 來操作的,所以在正式使用前需要先申請好 token,並跟我們自己的 google calendar 連動。

申請 Token

  1. 進入 Google Cloud Platform,預設會幫你建立一個新的專案,如果要更改可以點選畫面上方的 My First Project。不需要的話,直接點選畫面左側的選單,從 API 與服務 中選擇 程式庫

  1. 搜尋 Google Calendar API 並啟用,等 loading 跑完後會出現 管理 的按鈕,或是從選單的 API 與服務 中找到 憑證,點選畫面上方的 新增憑證,選擇 服務帳戶 的選項。

可以看到頁面最下方的服務帳戶列表,已經有我之前新增過的一筆憑證。

  1. 輸入 服務帳戶詳細資料 後按下送出,接著會回到憑證頁面,找到最下面的 服務帳戶 那一列,點選右側的編輯,找到畫面上方的 金鑰,點擊 新增金鑰,選擇 JSON 的格式後按下建立,瀏覽器會自動下載這份檔案,請不要隨意刪除,如果遺失了只能重新產生一份金鑰

或是參考畫面左側的標題和分類,從選單進入也可以。

建立 Calerdar

  1. 進入 Google Calendar 後選擇一個建立好的日曆,從 設定和共用 進入日曆的設定。

移動到日立上方的話會出現三個點,點下去找到設定和共用的選項。

  1. 找到 與特定使用者共用日曆 的選項,點選 新增邀請對象。這裡的 email 要輸入剛才那份金鑰 JSON 檔中,client_email_form 的欄位內容,權限要記得調整成 進行變更並管理共用設定

剛剛下載完成的那份金鑰 JSON 檔內容。

  1. 接著把網頁往下拉,找到 整合日曆 的區塊,記下這個 日曆 ID,接下來會使用到。

到目前為止,需要使用的部分都準備完成了,接下來要進入到程式的部分。

新增一個活動

新增好一個專案之後,從 Nuget 將 Google.Apis.Calendar.v3 新增到專案內,並加入下列程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Services;

const string jsonFile = "key.json";
const string calendarId = "id@group.calendar.google.com";

GoogleCredential credential;
using var stream = new FileStream(jsonFile, FileMode.Open, FileAccess.Read);
credential = GoogleCredential.FromStream(stream).CreateScoped(CalendarService.Scope.Calendar);

var service = new CalendarService(new BaseClientService.Initializer
{
    HttpClientInitializer = credential,
    ApplicationName = "test project",
});

var newEvent = new Event()
{
    Id = Guid.NewGuid().ToString().Replace("-", ""),
    Summary = "Anthea 外出(逢甲大學)",
    Start = new EventDateTime()
    {
        DateTime = new DateTime(2022, 05, 15, 09, 30, 0),
        TimeZone = "Asia/Taipei"  // Can refer to https://stackoverflow.com/questions/22526635/list-of-acceptable-google-calendar-api-time-zones
    },
    End = new EventDateTime()
    {
        DateTime = new DateTime(2022, 05, 15, 10, 30, 0),
        TimeZone = "Asia/Taipei"
    }
};

var insert = service.Events.Insert(newEvent, calendarId).Execute();

執行之後回到日歷的頁面,就會看到剛剛新增上去的活動了!

Debug 紀錄

Invalid resource id value

1
2
3
4
5
6
Google.Apis.Requests.RequestError
Invalid resource id value. [400]
Errors [
        Message[Invalid resource id value.] Location[ - ]
        Reason[invalid] Domain[global]
]

測試的過程中有出現這個 error,看了官方文件之後發現問題是出在 Event 上,於是選擇另用比較不容易重複的 GUID 去作為參數帶上去。另外,文件上有提到只能使用小寫的英文字母和數字,要記得注意。

https://developers.google.com/calendar/api/v3/reference/events/insert

小結

除了範例裡提到的 Insert 之外,基本的 CRUD 都有 API 可以接,但我目前的系統還沒有這部分的功能要實作,所以沒有特別研究。

另外,官方文件所提供的註冊方法,使用的憑證類別和範例中的不太一樣,我個人認為比較麻煩,所以選擇了服務帳戶的方法。雖然大部分的功能都可以使用,但像是 Event.Attendees 這個邀請參與者的部分,就需要另外設定好權限才可以使用。

以上就是這次的內容,如果有任何使用上的疑問,或是解釋上的錯誤,都歡迎跟我說喔!我們下次見。

參考文章

Built with Hugo
Theme Stack designed by Jimmy