カレンダーの予定をスプレッドシートに自動入力(GoogleCalendar × SpreadSheet)

# はじめに
本記事では、GoogleCalendarに登録されているイベントが持つデータをスプレッドシートに書き込む方法を紹介します。
以下の手順で、カレンダー上にある実行日のすべての予定から「タイトル・時間・時間」を取得します。

1. GoogleCalendarのIDを取得
2. GASスクリプトを作成
3. 実行確認

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/0fa72eb0-724d-7a82-60a6-1cb992a75711.png)


# 1. GoogleCalendarのIDを取得
### GoogleCalendarを表示
GASでカレンダーの情報を取得するためには、そのカレンダーを特定するためのIDが必要になります。
Googleアカウントにログインし、アプリからカレンダーを表示します。
![スクリーンショット 2021-09-26 14.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/195374c9-7d50-4b3d-8bda-bc0949c4425f.png)


### GoogleCalendarIDを表示
次にGoogleCalendarIDを確認する方法です。
右上の歯車アイコンから「設定」を選択し、クリックします(2021/09現在のレイアウト)。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/61663ac3-326b-dbbe-8019-1c9af245282f.png)

すると、下記の画面が表示されるので左欄の「マイカレンダー設定」にある自身のアカウント名を選択し、クリックします。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/c38ff6d0-137f-fc7c-ece3-740bb305740b.png)

プルダウン式に項目が表示されるので「カレンダーの統合」をクリックします。
表示された画面上にあるカレンダーIDがカレンダー情報を取得するためのキーとなります。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/bdfbf3d0-eafd-250a-56a5-c78c222c7d5a.png)

# 2. GASスクリプトを作成
カレンダーIDを取得したら、入力したいスプレッドシートを開き、スクリプトエディタを起動します。
以下のようにメインとなる関数と、オリジナルの日付フォーマットを行うための二つの関数を用います。
![スクリーンショット 2021-09-28 9.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/384bbaa9-c479-61d7-2132-7926c4e87551.png)

コードの内容は以下の通りです。

### timeFormater
引数から時間を受け取り、時単位と分単位で分けたあと、一桁の数字には先頭に０をつけて結果を返します

```javascript
function timeFormater(time) {
  let hour   = time.getHours();
  let minute = time.getMinutes(); 

  //時単位が一桁なら0埋め
  if (String(hour).length === 1)
    hour = '0'+hour;

  //分単位が一桁なら0埋め
  if (String(minute).length === 1)
    minute = '0'+minute;

  return(hour +':'+ minute);
}
```

### getGoogleCalendar
カレンダーから予定を、スプレッドシートからシートを取得し、実行日の予定をスプレッドシート上に書き出しています。

```javascript
function getGoogleCalendar() {
  //GoogleCalendar
  const id_calendar = '***********@gmail.com';                  // カレンダーのIDを取得
  const calendar    = CalendarApp.getCalendarById(id_calendar); // IDからカレンダーを取得  
  
  //SpreadSheet
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();    // アクティブなスプレッドシートを取得
  const sheet       = spreadsheet.getActiveSheet();             // 取得したスプレッドシートのアクティブなシートを取得

  //予定の取得
  const date   = new Date();                                    // 今日の日付を取得。dateに格納
  const events = calendar.getEventsForDay(date);                // 取得したカレンダーからdateの日付にあるカレンダーの予定を取得

  // イベント数分の繰り返し処理
  for (let e in events){
    let start_time = timeFormater(events[e].getStartTime());    // カレンダーに登録されたイベントの開始時刻を取得
    let end_time   = timeFormater(events[e].getEndTime());      // カレンダーに登録されたイベントの終了時刻を取得

    //タイトル + 時間 + 説明を表示
    let context = events[e].getTitle() +' '+ start_time +'-'+ end_time +'\n'+ events[e].getDescription();
    console.log(context);

    sheet.getRange('A'+(Number(e)+1)).setValue(context);
  }
}
```

### 3. 実行確認
このように、カレンダー上に設定された予定を取得し、いい感じな形に成形することができました。
さまざまな条件設定や、ボタンを配置することができれば時間にかかる予定表、日報も短時間でつくることができそうです。

![スクリーンショット 2021-09-26 14.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/354a251e-79cd-3f35-b350-a17df43ac9d3.png)
↑スクリプトエディタ上
![スクリーンショット 2021-09-27 20.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/942825d5-e69c-5df0-76f4-dcfd463e468c.png)
↑スプレッドシート上

# 参考URL
https://tonari-it.com/gas-calendar-location-description/