CSV 形式のイベント一覧情報を Google カレンダーに一括登録する 2 つの方法 #GoogleAppsScript

## はじめに

Google カレンダーでイベントを一括登録する方法を 2 つ紹介します。

1. CSV をカレンダーにインポートする方法
2. Google Apps Script を用いてスプレッドシートから登録する方法

1 と 2 の方法によって、登録できる情報が異なります。 1 の方法で済むなら、 1 でやった方が手続きが楽だと思います。参加者を登録する必要があれば、 2 の方法を選択する必要があります。 

以下に詳細な手順を記載します。

## 1. CSV をカレンダーにインポートする方法

[公式ヘルプ](https://support.google.com/calendar/answer/37118?hl=ja) を参考に、 CSV ファイルを作成。

- Subject
  - 予定の名前（必須）
- Start Date
  - 予定の開始日（必須）
- Start Time
  - 予定の開始時刻
- End Date
  - 予定の終了日
- End Time
  - 予定の終了時刻
- All Day Event
  - 終日の予定であるかどうかを指定します。終日の予定の場合は「True」、そうでない場合は「False」と入力します
- Description
  - 予定の説明やメモ
- Location
  - 予定の場所
- Private
  - 予定を限定公開にするかどうかを指定します。限定公開の場合は「True」、限定公開でない場合は「False」と入力します

<img width="562" alt="スクリーンショット 2018-08-22 20.01.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/26321abf-d214-4a61-d864-c5f26056cc5f.png">
https://calendar.google.com/ にアクセスして、 + ボタンを選択。

<img width="573" alt="スクリーンショット 2018-08-22 20.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/1f5460ae-760b-16d7-fafd-5f92ca99fdd8.png">
メニューから `インポート` を選択。

<img width="1057" alt="スクリーンショット 2018-08-22 20.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/575407aa-90e3-e80f-673d-25465961229f.png">
`パソコンからファイルを選択` をクリックし、上記のフォーマットに従ったファイルを選択。

## 2. Google Apps Script を用いてスプレッドシートから登録する方法

以下のサンプルのスプレッドシートをもとに、イベント一覧を作成。コピーを自分のアカウントにコピーしてきていじってください。
https://docs.google.com/spreadsheets/d/1yoiwKPBs-FwGYq-zZkQza2B7VYpvvqcM0tCLDSyFiR8/edit#gid=0

<img width="524" alt="スクリーンショット 2018-08-22 20.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/6846d925-384b-73d4-0c48-97a573cb73ba.png">
https://script.google.com/ にアクセスして、新規スクリプトを選択。

<img width="532" alt="スクリーンショット 2018-08-22 20.28.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/16e28c29-ba83-b521-b62d-a73644087474.png">
https://github.com/tanabee/spreadsheet-to-calendar/blob/be1c6e755bbc2aa05fc739252bb1e76c1b9cfb90/main.js のスクリプトを Google Apps Script のエディタに貼り付け。

以下全文。

```JavaScript
// 設定
function getConfig() {
  return {
    spreadSheetId: '',// スプレッドシートの ID を入力。
    spreadSheetTabName: ''// スプレッドシートのタブ名を入力。
  }
}

// カレンダーにイベントを登録
function registerAll() {
  var config      = getConfig();
  var spreadSheet = SpreadsheetApp.openById(config.spreadSheetId);
  var sheet       = spreadSheet.getSheetByName(config.spreadSheetTabName);
  var eventIds = sheet
    .getDataRange()
    .getValues()
    .filter(function (e, i) {
      return i !== 0 && e[6] === '';
    }).map(function (e) {
      var calendarEvent = CalendarApp.getDefaultCalendar().createEvent(
        e[0], e[1], e[2],
        {
          description: e[3],
          location: e[4],
          guests: e[5]
        });
      return [calendarEvent.getId()];
    });

  if (eventIds.length === 0) return;

  sheet.getRange('G2:G' + (eventIds.length+1) ).setValues(eventIds);
}

// 登録されたイベントをキャンセルして、シートから削除
function cancelAll() {
  var range       = 'G2:G1000';
  var config      = getConfig();
  var spreadSheet = SpreadsheetApp.openById(config.spreadSheetId);
  var sheet       = spreadSheet.getSheetByName(config.spreadSheetTabName);
  sheet
    .getRange(range)
    .getValues()
    .filter(function (eventId) {
      return eventId[0] !== '';
    }).forEach(function (id) {
      CalendarApp.getDefaultCalendar().getEventById(id).deleteEvent();
    });
  sheet.getRange(range).clear();
}
```

spreadSheetId にスプレッドシートの ID を入力。
spreadSheetTabName にスプレッドシートのタブ名を入力。

<img width="420" alt="スクリーンショット 2018-08-22 20.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/9d9c96a0-34c4-64e2-1899-897491e556a6.png">
関数を選択 > registerAll を選択して ▶ ボタンをクリック。（取り消したいときは cancelAll を選択して実行）

<img width="919" alt="スクリーンショット 2018-08-22 20.38.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/2456591e-9db3-0fd6-cd5e-5b0954230be6.png">
これが

<img width="787" alt="スクリーンショット 2018-08-22 20.37.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/b5e21de8-3e34-3903-f1dd-6ee327b2989a.png">
こう登録されます。

GAS だと 50 行くらいでサクッとできて良いですね。以上。

## 関連記事
- [GAS ビギナーが GAS を使いこなすために知るべきこと 10 選](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4)
- [3 分で作る無料の翻訳 API with Google Apps Script](https://qiita.com/tanabee/items/c79c5c28ba0537112922)
- [Google Apps Script (GAS) で毎週 30 分の雑務を自動化した話](https://qiita.com/tanabee/items/e51f107f1e95a42cc636)