自作カレンダーにGoogleカレンダーのデータを一瞬で反映させる方法　(Googleカレンダー→GAS→スプレッドシート→EXCEL)

# はじめに
Googleカレンダーのデータを一気にオリジナル様式のカレンダーや予定表に流し込みたい事案が発生したため、Googleスプレッドシートにデータを自動でインポートする仕組みを作ってみました。
予定表やシステム手帳の様式等自由な様式に予定データを表示できて、Excelに変換もできるので、色々使い道があると思います。

[GAS（GoogleAppsScript）](https://www.google.com/search?biw=1440&bih=770&ei=9plXXO-3Lon08gWh_IHYBQ&q=Google+Apps+Script&oq=Google+Apps+Script&gs_l=psy-ab.12...0.0..675...0.0..0.0.0.......0......gws-wiz.PLOu1S94-O8)で[Googleスプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/#start)にデータを頂き、スプレッドシートの関数を利用してカレンダーを作りました。

<img width="841" alt="005.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/efce0938-0339-a1ba-b251-4dc265d54c50.jpeg">
**GoogleカレンダーからGoogleスプレッドシートで作成した複数の様式のカレンダーにデータを出力している写真**

## 今回のゴール
Googleカレンダーの予定が入ったGoogleスプレッドシートのカレンダーを作る。
<img width="595" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e1bc7708-d38c-b94d-472e-adf81be4e69d.jpeg">

頑張れば、システム手帳の予定表や日記帳、イベントの出欠調整表の自作も可能です。
<img width="840" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/6d4ba83a-f067-b6b6-8d75-08c10af5211a.jpeg">


##  必要なもの
### Googleアカウント
持っていない人は作成してください。
###　https://support.google.com/accounts/answer/27441?hl=ja

##  Googleスプレッドシート作成
###  https://docs.google.com/spreadsheets/u/0/
↑URLから作成できます。
<img width="527" alt="kankyoukanshiimg30.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/349931/7b7590b7-2707-1a68-7bf7-05e54d32423b.jpeg">

Googleスプレッドシートが開きます。
<img width="400" alt="kankyoukanshiimg31.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/349931/9b26db2c-8e5d-1fae-b024-3769982f4831.jpeg">

###  シート作成
<img width="307" alt="7.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/99d447e0-075b-1e9e-ed83-8d66f238cc46.jpeg">
スプレッドシート名は任意で大丈夫です。
まず、設定シートを作成します。
A1にカレンダーID、A2に設定　年、A3に設定　月、A4に取得開始日、A5に取得終了日、A7に今日、A8に設定日を入力して表題を作成します。
設定　年と設定　月は、オリジナルカレンダーの年月を指定します。
取得開始日と取得終了日は、Googleカレンダーからデータを取得したい日にちの開始日と終了日を入力します。後の設定で、祝日も自動で取得したいと思います。
今日は、B7に`=now()`と入力し、今日の日付を設定します。
設定日は、B8に`=DATEVALUE(B2&"/"&B3&"/1")`と入力し、カレンダーの初めの日を設定します。
<img width="576" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/a6c25325-cf47-456f-4725-e3ce8c22c9ab.jpeg">
B7の表示形式を数字、日付の順にクリックし、yyyy/mm/ddの形式に変更します。
B8も同様に表示形式を日付に変更します。
<img width="197" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/81dd2f3a-b9cf-47c1-20b0-ed931697ffb9.jpeg">

<img width="358" alt="kankyoukanshiimg33.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/349931/93294cfe-5605-e036-1a4b-44043c6654cd.jpeg">
シート名を**設定**に変更しておきます。

####GoogleカレンダーID取得
**https://calendar.google.com/calendar/**
<img width="376" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/6fe01660-b8dd-5f09-9b29-20824b5a23e5.jpeg">
<img width="359" alt="4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/5a2c32cb-810c-2a8e-0214-e9e823b1998a.jpeg">

Googleカレンダーにアクセスし、右上の歯車のマーク、設定の順にクリックします。

<img width="578" alt="5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/1f8a0117-9e05-7846-adbe-3549624496ae.jpeg">
左側でマイカレンダーの設定から、カレンダーを選択し、右側を下にスライドすると、カレンダーIDと表記された箇所があります。
デフォルトはGoogleアカウントが入っていると思います。複数カレンダーを作成されている方は、ユニークIDが表示されます。これをコピーします。

Googleスプレッドシートに戻って貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/31bbe10a-6c2f-bf72-969b-1d371f3b141e.png)


シート名を**設定**にします。
<img width="564" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/8b61f384-55e1-23c5-9af0-4b6914d1c2e0.jpeg">
シート名「シート1」をダブルクリックすると編集できます。

シートを追加していきます。
左にある「+」をクリックすると新たなシートが作成されます。
先ほどと同じ方法でシート名を**予定取得**に変更します。
<img width="681" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/2da8ad55-42fb-b756-6d58-bbaae9b9cae1.jpeg">

同じようにシートを追加していき、**予定設定**、**祝日**、**記念日**、**月間**、**年間**、**予定表**の順に作成します。
※今回は、月間のカレンダーの作成方法を紹介します。
<img width="631" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/958c9be3-9414-fa5c-27eb-c41b7fb99e6d.jpeg">

##  GASでGoogleカレンダーの予定を取得する
さっそくカレンダーの予定を取得します。
と、その前に
・・・GASって何？
簡単に言うと、Googleが開発した軽量アプリケーション開発用のスクリプト言語です。
[Google Apps Script 入門](https://qiita.com/t_imagawa/items/47fc130a419b9be0b447)

###  GASを作成
シートのツール、スクリプトエディタの順にクリックします。
<img width="663" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e545de54-67f2-86e8-2104-914dff78b8d1.jpeg">

すると、GASのスクリプトエディタが起動します。

<img width="386" alt="kankyoukanshiimg36.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/349931/a39d05d6-ac88-c645-cb87-f73d1852cec9.jpeg">
次のソースコードを入力します。

### ソースコード
```js
/* 指定月のカレンダーからイベントを取得する */
function getCalendar() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
  var msheet= sheet.getSheetByName('設定'); //設定シートを取得
  var range = msheet.getRange("B1");//メインシート（カレンダーID）
  var value = range.getValue();//valueが取得したいカレンダーID
  var myCal=CalendarApp.getCalendarById(value); //特定のIDのカレンダーを取得
  
/* 予定取得シートデータクリアからの流し込み準備 */
  var ysheet=sheet.getSheetByName('予定取得'); //予定取得シートを取得
  ysheet.getRange('A:C').clear(); //予定取得シート内をクリア
  var maxRow=ysheet.getDataRange().getLastRow(); //最終行を取得 

/* 設定 */
  var rng1 = msheet.getRange("B4");//メインシート（取得開始日）
  var startDate = new Date(rng1.getValue());//取得開始日
  var rng2 = msheet.getRange("B5");//メインシート（取得終了日）
  var endDate = new Date(rng2.getValue());//取得終了日

/* カレンダーのイベントを取得 */ 
  var myEvents=myCal.getEvents(startDate,endDate); //いつからいつまで
 
/* イベントの数だけ繰り返してシートに記録 */
  for each(var evt in myEvents){
 
    ysheet.getRange(maxRow+1,1).setValue(evt.getStartTime()); //イベントの開始時刻
    ysheet.getRange(maxRow+1,2).setValue(evt.getTitle()); //イベントのタイトル
    maxRow++;
  }
}
```

よくわかんないや！ってかたは、とにかくソースコードを貼り付けます。
貼り付ける時は最初入っているコードごと上書きしてください。
<img width="652" alt="kankyoukanshiimg36.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/349931/7c496656-d8a2-5513-feac-769750754b33.jpeg">

こんな感じになると思います。
<img width="617" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/1ab60f3e-e222-a33b-ac81-5e44e15ae030.jpeg">

任意の名前を付けます。
<img width="506" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/64a2301d-d03f-8942-da97-9ec0ce2c2d3c.jpeg">
ちなみに今回は**カレンダー**にしてみました。

###  GASを実行
GoogleカレンダーのデータをGoogleスプレッドシートに流し込む準備が整いました。
今、画面にスプレッドシートを開いている場合はスクリプトエディタを再度開いてください
エディタの上の方に三角の再生ボタンがありますよね。
いきなり実行してみてください
<img width="687" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/fa592673-a461-36ab-e846-40ae711624b0.jpeg">

###  承認
すると、承認が必要です画面がポップアップされるので、許可を確認をクリックします。
<img width="341" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/da10a2f0-5269-01fa-9e22-c538f7d5a096.jpeg">


アカウントを選択します。
<img width="613" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/1434a439-1325-f9ef-865f-a9d63bbcc2d0.jpeg">


このアプリは確認されていません
当然今作っているので確認されてたらおかしいのですが、とりあえず**詳細**を選択。
<img width="692" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/68913f3b-278b-0be3-0da9-2b2856f19b9a.jpeg">


つづいてカレンダー（安全ではないページ）に移動を選択。
<img width="532" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/01e78dcf-ba5c-a7b1-04a2-4fa5500b570a.jpeg">


アカウントへのアクセスを許可
許可を選択します。
<img width="276" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/ff623b63-5d98-d910-9b43-2b488dcffc33.jpeg">

するといきなりエラーが発生します。
<img width="671" alt="6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/46d94cbb-0c98-150b-fb8c-aa0342f047c3.jpeg">
これはデフォルトが「myFunction」になっているためです。

**getCalendar**を選択していることを確認し、保存、実行の順にクリックします。
<img width="407" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/1c96b81f-cb69-09b7-7868-f53094dea2c9.jpeg">

これで実行されたかと思います。
確認してみましょう。

###  スプレッドシートを確認
カレンダーの内容が入っていれば成功です。
<img width="299" alt="7.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/96e855f6-b3b3-13d5-3bd7-4cfb464760ed.jpeg">

###  予定設定
予定取得シートのデータを編集します。
オリジナルカレンダーに表示できるようにします。
GASで書式からデータ編集までしちゃえばいいのだけれでも、生データの方が加工の幅が広がる（本当はめんどくさい）ので、あえてGoogleスプレッドシート側の関数を利用します。

まず、予定設定シートに移動し、表題を**年月日**、**予定編集**、**予定数**、**予定**の順に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/8aa07e1d-8107-580d-a0e6-dc6dd1b3d261.png)

**A2**に`=ARRAYFORMULA('予定取得'!A2:A)`と入力します。
この[ARRAYFORMULA](https://www.google.com/search?q=ARRAYFORMULA&oq=ARRAYFORMULA&aqs=chrome..69i57j69i59j0l4.439j0j7&sourceid=chrome&ie=UTF-8)。発想がクレイジーで、一発目に使用すれば、数式を配列形式で表示します。Excelに無い概念ですね。


A列に数値が入ります。
17行目からは元のデータが無いためエラーになっています。
<img width="531" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/af2a0247-5303-1786-4827-db3e75ba81c8.jpeg">
A列をクリック、表示形式、数字、日付の順でクリックします。
<img width="193" alt="4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/46d63eae-28fa-b4c9-7d18-02efbd4f426a.jpeg">
西暦表示に変わります。

続いて、
**B2**に`=ARRAYFORMULA(if(C2:C=1,D2:D,if(C2:C=2,D2:D&CHAR(10)&D3:D,if(C2:C=3,D2:D&CHAR(10)&D3:D&CHAR(10)&D4:D,""))))`
**C2**に`=ARRAYFORMULA(COUNTIF(A2:A,A2:A))`
**D2**に`=ARRAYFORMULA('予定取得'!B2:B)`
と入力します。
まず、予定取得からA列とD列に年月日と予定を持ってきます。この時、年月日については、後でカレンダーに表示するために日付形式に変更し、セルの書式設定も変更。
C列は同じ日にある予定の数を計算し、2件又は3件なら改行（`CHAR(10)`を利用）して予定を表示できるように関数でトッピングします。
多すぎるとカレンダーに表示しきれなくなるので3件までにしました。
また、カレンダー側に表示するときにVlookupを利用しますが、Vlookupの性質上、重複した場合、一番上のデータを引っ張るといった特性を利用した作りにしました。
なので、同じ日にちの予定が3つ並んだ時、予定編集の一番上のデータのみカレンダーに表示するといった感じです。
<img width="375" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/a1db73c6-6693-babb-8a83-9f1fe9b69693.jpeg">

###  祝日
自作カレンダーに祝日を表示したいと思います。
せっかくなので。GASを使って自動で取得してみたいと思います。
祝日シートを選択して、上部ツール、スクリプトエディタの順にクリックします。

すると、先ほどのGASのスクリプトエディタが起動します。
左側に**コード.gs**といった文字があります。先ほど作成したスクリプトファイルです。
右側の▼をクリックし、**予定取得**に名前を変更します。
<img width="552" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/9fafb81e-d7ac-322e-178b-f24341a9f42a.jpeg">

祝日を取得するスクリプトファイルを作成したいので、上部ファイル、新規作成、スクリプトファイルの順でクリックします。
<img width="661" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/0d7e6ebb-69b7-25b4-fb72-14104c8677ee.jpeg">

ファイルを作成のポップアップが表示されるので、**予定取得**と入力して**OK**ボタンをクリックします。
<img width="395" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/8424f38a-de1b-135c-6648-708249819daf.jpeg">

新たなスクリプトファイルが作成されます。
<img width="341" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/c8f68551-163c-3bb8-7b09-de29bb605512.jpeg">

次のソースコードを入力します。
### ソースコード
```js
/* 設定シートの開始日と終了日を取得 */
function holiday_main() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
  var msheet=sheet.getSheetByName('設定'); //設定シートを取得
  var rng1 = msheet.getRange("B4");//設定シート（取得開始日）
  var startDate = new Date(rng1.getValue());//取得開始日
  var rng2 = msheet.getRange("B5");//設定シート（取得終了日）
  var endDate = new Date(rng2.getValue());//取得終了日

/* 祝日を取得 */
  var holidaysheet = getholidaysheet();
  var holidays = getHoliday(startDate, endDate);

  var lastRow = holidaysheet.getLastRow();
  var startRow = 1;

  // シートが空白で無いとき、取得した祝日配列の先頭の日付と一致するカラムの位置を探索
  if (lastRow > 1) {
    var values = holidaysheet.getRange(1, 1, lastRow, 1).getValues();
    for(var i = 0; i < lastRow; i++) {
      if(values[i][0].getTime() == holidays[0][0].getTime()) {
        break;
      }
      startRow++;
    }
  }

  holidaysheet.getRange(startRow, 1, holidays.length, holidays[0].length).setValues(holidays);
}

/**
 * SHEET_URLで指定したドキュメント内のSHEET_NAMEのシートを取得する
 * SHEET_NAMEのシートが存在しない時は、シートを作成する
 */
function getholidaysheet(){
  try{
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var holidaysheet = sheet.getSheetByName('祝日');
  holidaysheet.clear();
  }catch(e){
    Browser.msgBox(e);
  }

  return holidaysheet;
}

/**
 * startDate〜endDateまでの祝日をgoogleカレンダーの「日本の祝日」から取得
 * [日付,祝日名]の多次元配列にした上で返す
 */
function getHoliday(startDate, endDate) {
  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");

  var holidays = cal.getEvents(startDate, endDate);
  var values = [];

  for(var i = 0; i < holidays.length; i++) {
    values[i] = [holidays[i].getStartTime(), holidays[i].getTitle()];
  }

  return values;
}
```

いきなり実行
<img width="735" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/4990af97-5f16-a317-86bd-d62a6bdf100b.jpeg">

エラーきました。
これは、関数をきちんと選択していないエラーです。
<img width="834" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/d61a7821-3c26-624d-08e1-7112a3bdc638.jpeg">

関数を選択で**holiday_main**を選択します。
<img width="815" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/3e0d31a6-b0b2-ff0d-28a8-40488146b37c.jpeg">

保存して、再度実行します。
<img width="636" alt="4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/c5c7cc98-5c40-46ea-78f1-938379bb7946.jpeg">

特にエラーメッセージが無いようでしたら、ブラウザのタブから、Googleスプレッドシートの**カレンダー**を選択します。
<img width="524" alt="5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/f616b25c-7fa9-29a6-cc6c-68dfc209f027.jpeg">

**祝日**シートを確認してみましょう。
**設定**シートで指定した間の祝日が入力されています。
<img width="371" alt="6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/6000fc4d-5525-3987-6e58-60f749f2803b.jpeg">

###  記念日
続いて、記念日の設定をします。
**記念日**シートを選択し、A1、B1、C1、D1、E1の順に**年**、**記念日**、**月**、**日**と入力します。
<img width="575" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e4478635-525d-ed74-4a12-6edf30b9269d.jpeg">

適当にC2からE5までに記念日やイベントを入力します。
<img width="432" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/837c1c94-1ac9-35c6-6a6d-d19dbb412247.jpeg">

A2に`=ARRAYFORMULA('設定'!$B$2&"/"&D2:D&"/"&E2:E)`と入力します。
続いて、B2に`=ARRAYFORMULA(TEXT(DATE((YEAR(A2:A)),(MONTH(A2:A)),(DAY(A2:A))),"mmdd"))`と入力します。
すると、記念日の表記が月日になります。これを後で記念日として利用します。
<img width="499" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/cba43ee7-e559-8148-8c09-4ee2c3c9d0a7.jpeg">

###  月間(カレンダー)
いよいよカレンダーを作っていきます。
**月間**シートを選択します。
A1、A2を選択し、表示形式→セルを結合→すべて結合、の順にクリックすると、セルが結合されます。
<img width="531" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e2ff3fd4-4109-b4bf-7ca9-8797c0400214.jpeg">

結合したセルA1に`='設定'!B8`と入力します。
<img width="207" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/087c8d26-6c82-600f-b98b-bebf6901796a.jpeg">

書式を設定して、カレンダーの月を表示したいと思います。
表示形式→数字→表示形式の詳細設定→その他の日付や時刻の形式
の順に選択します。
<img width="620" alt="0.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/48902b4d-1ef7-b6fe-bbe6-f467017c84e8.jpeg">

年（1930）の横に開くマークがあるので、クリックして選択しを展開します。
<img width="625" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/51b751a1-69b5-703e-afe0-d6d3bb6da27c.jpeg">

**削除**を選択します。
<img width="467" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/66f7a616-443b-012b-3f77-72135e0a9e0b.jpeg">

同じように日にちも削除します。
<img width="330" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/2306a0d9-2fff-a851-09ff-599c14167812.jpeg">

すると、月の両端に**-**が残っているので、こちらも削除します。
<img width="260" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/c35d86c3-84e1-76d2-59a3-edb84c2f25b8.jpeg">

こんな感じです。
適用をクリックします。
<img width="644" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/6128618b-98b5-f730-60f8-acf51cfd51bc.jpeg">

セルA1が月表示に変わりました。
続いてフォントサイズを変えたいと思います。
A1を選択した状態で、メニュー下にあるフォントサイズを選択し、直接**50**と入力します。
<img width="731" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/248d65f7-aa72-5856-76ba-86b9d5234da4.jpeg">

カレンダーの月を作成した方法と同じように、年を表示させたいと思います。
セルG2に`=A1`と入力し、先ほどと同じ方法（表示形式→数字→表示形式の詳細設定→その他の日付や時刻の形式）で、次は**月、日、-** を削除して年を表示させます。
フォントサイズは**24**にしてみました。
<img width="729" alt="4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/4d751f22-3418-6344-02fe-a081b9be9f4e.jpeg">

セル内のデータをセル中央（上下）に配置したいと思います。
左上の写真部分をクリックして全てのセルを選択した状態で、上下位置調整のメニューから中央を選択します。
<img width="823" alt="5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/43ec99e3-cdfe-3572-8bdd-9632498d9341.jpeg">

**A3**から**G3**に日から土までの曜日を入力します。
カレンダーの曜日部分を目立たせるために、塗りつぶしの色から、セルと文字に着色していきます。
文字を白、セルを黒にしてみました。

<img width="591" alt="2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e896afcd-e38f-3d2c-86bd-8b74101009b7.jpeg">
<img width="176" alt="3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/4dc04658-59f4-66f1-1e6c-ff093cac827e.jpeg">

文字を中央寄せします。
<img width="238" alt="4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e6a8f493-78af-69a6-087d-ec09695bd3d4.jpeg">

#### 日にちを表示
A5に`=IF(WEEKDAY($A$1, 1)=1,A1,"")`と数式を作成。
B5に`=IF(A5<>"",A5+1,IF(WEEKDAY($A$1, 1)=2,$A$1,""))`と数式を作成。
C5に`=IF(B5<>"",B5+1,IF(WEEKDAY($A$1, 1)=3,$A$1,""))`と数式を作成。
D5に`=IF(C5<>"",C5+1,IF(WEEKDAY($A$1, 1)=4,$A$1,""))`と数式を作成。
E5に`=IF(D5<>"",D5+1,IF(WEEKDAY($A$1, 1)=5,$A$1,""))`と数式を作成。
F5に`=IF(E5<>"",E5+1,IF(WEEKDAY($A$1, 1)=6,$A$1,""))`と数式を作成。
G5に`=IF(F5<>"",F5+1,IF(WEEKDAY($A$1, 1)=7,$A$1,""))`と数式を作成。
セルの書式がそのままだと、月が表示されるので、
表示形式→数字→表示形式の詳細設定→その他の日付や時刻の形式
の順に選択し、さきほど書式を**月**にしたのと同じ方法で**日**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/449778e3-8340-4a6a-6402-99c31e142153.png)


※重要なのは、IF文とTEXT関数などで、曜日をddd指定しないことです。後で、Excel形式でダウンロードしたときに、関数が働きません。Googleスプレッドシートの曜日関数はdddなのですが、Excelはaaaだからです。

次にA9に`=G5+1`、B9に`=A9+1`と式を入力し、
B9のセルを選択すると、右下に小さな四角の点が出てくるので、カーソルを上に合わせて、右方向G9セルまでドラッグ&ドロップします。
すると、数式がコピーされます。
<img width="572" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/245ea9f5-b14d-16af-bc87-fc938e0ebcbf.jpeg">

13行目、17行目も同じ方法で数式を入力します。
<img width="575" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/45347e64-db1e-374f-c36f-e2873dea7374.jpeg">

A21に`=IF(MONTH(G17)=MONTH(G17+1),G17+1,"")`
B21に`=IF(A21="","",IF(MONTH(A21)=MONTH(A21+1),A21+1,""))`
を入力します。
先ほどと同じ方法で、B21の数式をG21までドラッグ&ドロップでコピーします。

A25に`=IF(G21="","",IF(MONTH(G21)=MONTH(G21+1),G21+1,""))`
B25に`=IF(A25="","",IF(MONTH(A25)=MONTH(A25+1),A25+1,""))`
B25の数式をC25にコピーします。
<img width="579" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/d36d2791-4b14-8365-bb69-fa77b797974b.jpeg">

#### 祝日を表示
A6に`=IFERROR(VLOOKUP(A5,'祝日'!$A:$B,2,FALSE),"")`を入力します。
※`=IF(ISERROR(VLOOKUP(A5,'祝日設定'!A:B,2,FALSE)),"",VLOOKUP(A5,'祝日設定'!A:B,2,FALSE))`でも同じなのだけど、IFERROR関数がExcel 2007から追加されてからは数式を短くできるので、こちらがおススメです。
この数式をG6までコピー(ドラッグ&ドロップ)します。
<img width="264" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/ee5eaefb-4762-3475-2361-f5d204d4e4d4.jpeg">

同じように、A10からG10、A14からG14、A18からG18、A22からG22、A26からC26までコピーします。
これで祝日のデータを表示できるようになりました。
<img width="406" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/9439fa1e-ffb4-d7d8-e098-e9fd9b5f4754.jpeg">

#### 予定データを表示
続いて、Googleカレンダーから取得した予定データを表示するセルの設定をします。
A7に`=IF(IFERROR(VLOOKUP(TEXT(A5,"mmdd"),'記念日'!$B:$C,2,FALSE),"")="",IFERROR(VLOOKUP(A5,'予定設定'!$A:$B,2,FALSE),""),IF(IFERROR(VLOOKUP(A5,'予定設定'!$A:$B,2,FALSE),"")="",IFERROR(VLOOKUP(TEXT(A5,"mmdd"),'記念日'!$B:$C,2,FALSE),""),IFERROR(VLOOKUP(TEXT(A5,"mmdd"),'記念日'!$B:$C,2,FALSE),"")&"
"&IFERROR(VLOOKUP(A5,'予定設定'!$A:$B,2,FALSE),"")))`
と数式を入力します。
記念日のデータがあればもってきて、なおかつ予定を下に表示。なければ予定を表示的な感じです。
![Screenshot 2019-12-01 at 17.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/a93fc6aa-4f00-76ec-ed54-918a9c980f2f.png)

A7とA8を選択して表示形式→セルを結合→すべて結合の順にセルを結合します。
![Screenshot 2019-12-01 at 17.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/3e428db0-01ca-146c-f6d5-16b0cb72c8a0.png)

A7（A7,A8結合セル）をコピーしてB7からG7に貼り付けます。
同じようにA11からG11、A15からG15、A19からG19、A23からG23、A27からC27まで貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/a89a5669-e26a-1e4a-c544-e59bbe8ebb22.png)

A5からA8を選択して、枠線で囲みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/5895635a-d600-7152-e7cb-b0668adb3cda.png)

A6からA8を選択して、表示形式→テキストの折り返し→折り返すの順位選択します。
※フォントサイズ等については、好みに合わせて設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/02165d4d-c23b-9ea2-e30e-9f821a9574f8.png)

#### 書式を整える
祝日の日にちを赤色にしたいので、セルA5で右クリックして、条件付き書式を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/94f2da36-8cc4-ec93-578d-0123f9107e46.png)

書式ルールの条件で*カスタム数式*
式に`=A6<>""`と入力します。
スタイルで、フォントを赤色、塗りつぶしを透明にして完了をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/a0c00ad0-e478-e29f-f620-423224e0c8a5.png)

A5からA8をコピーして、A5からG28を選択（A5を選択し、Shiftを押したままG28）
右クリックから*特殊貼り付け*→*書式のみ貼り付け*を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/98ea1813-28d0-a9db-4142-875ea204f44c.png)

枠線、書式がもろともコピーされるので、続いて、土日の日にちと祝日の文字を赤色のフォントに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/ea74707d-f07b-61d7-aa80-a985f059773e.png)

月間カレンダーができあがりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/5dce70c4-9fd9-d918-5d46-ef4a4eac6a30.png)

### 印刷する
印刷で、*印刷形式*→*グリッド線の表示*のチェックを外せばきれいに印刷できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/7c8773d7-4d0b-0daf-3d18-42f79fe739cf.png)

### エクセルでダウンロードする
Excel形式でダウンロードして、Excelとしても利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/e67ef2ca-cc0d-c213-5dc8-fa68ef158386.png)

# まとめ
今回は月間カレンダーの作成例を紹介させていただきました。
個人的にシステム手帳（A5）の様式を作ってパンチで穴を開けて利用したり、予定表を共有したり、年間カレンダーなんかもつかっています。
忘年会の日程調整にも利用したりできます。
多くの友人や知人から、作り方を教えてほしいとの声をいただきましたので、Qiitaで公開してみました。
便利なデジタルコンテンツがたくさんできても、「オイラ、手帳と共に歩み続ける！」って方もいらっしゃいますよね。
<img width="505" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/188e157f-296d-092c-4512-31e911304f0c.jpeg">

IMAGE関数を利用して、毎月自動で写真が切り替わる家族カレンダーを作ってもいいかもですね。
もしよかったら、自分好みに色々カスタマイズして使ってみてください。
長々と、お付き合いありがとうございました！
<img width="381" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349931/9ce90920-d01a-ac7f-7f99-cccda0d3a8c7.jpeg">

## 参考
- [google spread sheetに自動更新される日本の祝日シートを作る](https://qiita.com/ik-fib/items/6c35640954c2b04a9287)
- [Google Apps Scriptで特定月のカレンダーのイベント情報を取得する](https://tonari-it.com/gas-calendar-getevents/)