> ## Content Index
> Fetch the complete content index at: https://blog.anthea.day/llms.txt
> Use this file to discover other available public pages before exploring further.

# Google Calendar API 使用整理
- URL: https://blog.anthea.day/web-net-google-calendar-api/
- Published: 2022-05-14T10:29:38.000Z
- Updated: 2026-10-17T19:10:41.000Z
- Author: Anthea / 芫荽
- Tags: #Migrated-1792241843742, #Import 2026-10-17 12:57, Coding

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

系統沒有要規劃的很複雜，但讓我比較困惑的是 google calendar 有沒有辦法搭配道系統裡。查一查才知道原來 google 的功能好像甚麼都有 API 可以用 XD 所以爬了一下文，決定紀錄一下使用 google calendar 的過程。

---

### 使用前的準備

#### 申請 Token

- 進入 [Google Cloud Platform](https://console.cloud.google.com/?ref=blog.anthea.day)，預設會幫你建立一個新的專案，如果要更改可以點選畫面上方的 *My First Project*。不需要的話，直接點選畫面左側的選單，從 *API 與服務* 中選擇 *程式庫*。

![](https://cdn-images-1.medium.com/max/800/1*oFDE80H6eYyVvuIzkR1-sA.png)

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

![](https://cdn-images-1.medium.com/max/800/1*I2vrb2-_vtvd6tXZsaHvBQ.png)

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

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

![](https://cdn-images-1.medium.com/max/800/1*pBAi-GoCdbCiLuGsKgzJOA.png)

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

#### 建立 Calendar

- 進入 [Google Calendar](https://calendar.google.com/calendar?ref=blog.anthea.day) 後選擇一個建立好的日曆，從 *設定和共用* 進入日曆的設定。

![](https://cdn-images-1.medium.com/max/800/1*UveG9AOCvtRumxeWi3vwAQ.png)

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

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

![](https://cdn-images-1.medium.com/max/800/1*FTjZBt0lLweeNShEK_R12w.png)

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

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

![](https://cdn-images-1.medium.com/max/800/1*FOLeP-Zi60IddCaXl1Gjtw.png)

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

---

### 新增一個活動

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

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

![](https://cdn-images-1.medium.com/max/800/1*K1uBg_eNUiOP8nUoKyEAUw.png)

#### Event.Id

```
Google.Apis.Requests.RequestError
Invalid resource id value. [400]
Errors [
        Message[Invalid resource id value.] Location[ - ]
        Reason[invalid] Domain[global]
]
```

測試的過程中有出現這個 error，看了[官方文件](https://developers.google.com/calendar/api/v3/reference/events/insert?ref=blog.anthea.day)之後發現問題是出在 `Event` 上，於是選擇另用比較不容易重複的 GUID 去作為參數帶上去。另外，文件上有提到只能使用小寫的英文字母和數字，要記得注意。

![](https://cdn-images-1.medium.com/max/800/1*6sygAeR4yGoNW7-L7o0h_w.png)

[https://developers.google.com/calendar/api/v3/reference/events/insert](https://developers.google.com/calendar/api/v3/reference/events/insert?ref=blog.anthea.day)

#### EventDateTime.TimeZone

完整的清單可以參考[這裡](https://stackoverflow.com/questions/22526635/list-of-acceptable-google-calendar-api-time-zones?ref=blog.anthea.day)。

---

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

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

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

#### 參考文章

> [TimeZone List](https://stackoverflow.com/questions/22526635/list-of-acceptable-google-calendar-api-time-zones?ref=blog.anthea.day)  
> [Google Calendar Api with .NET](https://stackoverflow.com/questions/54066564/google-calendar-api-with-asp-net?ref=blog.anthea.day)  
> [At least one client secrets (Installed or Web) should be set](https://stackoverflow.com/questions/28825860/google-oauth-error-at-least-one-client-secrets-installed-or-web-should-be-set?ref=blog.anthea.day)