見出し画像

【便利!】Googleカレンダーから共有カレンダーを自動で作成する方法【GAS+スプレッドシート】

「いつ空いてる?」の日程調整は意外と難しい


シフト制の仕事であったり、不定期に予定が入りやすかったりする人にとっては、「飲み会に行きたいけど都合が合わせづらいから行く機会が少ない」ことはあるかと思います。

だからといって、予定がぎっしり書いている手帳やGoogleカレンダーを共有するか?といわれると、仕事の打ち合わせやら趣味の予定やら公開してはいけない情報やらがたくさんあるのでそういうわけにはいけません。

そこで、今回は「Googleカレンダーから「何かしらの予定がある」情報だけを取得して、シンプルなカレンダーを自動で作成する」方法を紹介します。

これはGAS(Google Apps Script)を使ってスプレッドシートに出力する方法になります。
少々プログラミングを使用していますが、なるべくサンプルコードをコピペで使えるようにしています。

この記事の完成図(サンプル)

1. スプレッドシートでカレンダーの見た目を作る

スプレッドシートでカレンダーを作成する方法はいくつかあります。
好きなデザインを作ってみましょう!
今回は以下のリンクの記事を参考に作成しました。


2. GASでGoogleカレンダーのデータを取得する

スプレッドシートの「拡張機能」→「Apps Script」を選択してください。
すると、コードが入力できるページに遷移しますので、そこで以下のコードを入力します。
コードについての簡単な説明はサンプルコードの後に記述します

サンプルコード


const CALENDAR_ID_DEF = '***********';//一般予定(カレンダーID)
const CALENDAR_ID_HOBBY = '***********'; //趣味の予定(カレンダーID)
const CALENDAR_ID_WORK = '*****************';//会社の予定(カレンダーID)

//スプレッドシートに書き込み
const get_sheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = get_sheet.getSheetByName('シート1');

//カレンダーの情報を取得する
function getCalendarSchedule() {
  const calendar_def = CalendarApp.getCalendarById(CALENDAR_ID_DEF);
  const calendar_hobby = CalendarApp.getCalendarById(CALENDAR_ID_HOBBY);
  const calendar_work = CalendarApp.getCalendarById(CALENDAR_ID_WORK);

  const startTime = new Date('2023/02/01 00:00:00');
  const endTime = new Date('2023/05/01 00:00:00');
   
  const events_def = calendar_def.getEvents(startTime, endTime);
  const events_hobby = calendar_hobby.getEvents(startTime, endTime);
  const events_work = calendar_work.getEvents(startTime, endTime);

  var range_num = 2;

  for(const event of events_def){
    spreadSet(range_num, event.getStartTime(), "×");
    range_num++;
  }

  for(const event2 of events_hobby){
    spreadSet(range_num, event2.getStartTime(), "×");
    range_num++;
  }

  for(const event3 of events_work){
    spreadSet(range_num, event3.getStartTime(), "△");
    range_num++;
  }
 
}

function timeForDay(date){ 
  return Utilities.formatDate(date,'JST','dd');//日のみ取得
}

function timeForMonth(date){ 
  return Utilities.formatDate(date,'JST','MM');//月のみ取得
}

function spreadSet(num, time, status){
  var r_str_month = 'A'+num;
  var range = sheet.getRange(r_str_month);
  var values = range.setValue(timeForMonth(time));

  var r_str_day = 'B'+num;
  var range = sheet.getRange(r_str_day);
  var values = range.setValue(timeForDay(time));

  var r_str_genre = 'C'+num;
  var range_genre = sheet.getRange(r_str_genre);
  var values = range_genre.setValue(status);

}

コードの簡単な説明

今回は、Googleカレンダーで登録している3つのマイカレンダーを取得しています。

1つのマイカレンダーを例に説明します。
まず、Googleカレンダーの「マイカレンダーの設定」→「カレンダーの統合」にある「カレンダーID」をコードに登録します。

const CALENDAR_ID_DEF = '***********';//一般予定(カレンダーID)

登録したカレンダーIDは、getCalendarById(マイカレンダーID)で使用可能となります。
getEvents(取得する最初の日付, 取得する最後の日付)を使用して、取得したい日付の範囲を設定します。
今回のサンプルコードでは、2023/02/01の0時から2023/05/01の0時までの3か月間にあるイベントを取得しています。

const calendar_def = CalendarApp.getCalendarById(CALENDAR_ID_DEF);

const startTime = new Date('2023/02/01 00:00:00');
const endTime = new Date('2023/05/01 00:00:00');
   
const events_def = calendar_def.getEvents(startTime, endTime);

続いて、取得したイベントをスプレッドシートに書き込みます。
書き込む先のシート名をgetSheetByName('シート名')で登録します。
シート名は任意のもので大丈夫ですが、今回は初期名の「シート名」としています。

//スプレッドシートに書き込み
const get_sheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = get_sheet.getSheetByName('シート1');

spreadSet(登録する行数, イベントの開始日, スプレッドシートに表示するテキスト)という関数を利用してスプレッドシートに書き込みます。
今回は予定があるかどうかはアバウトに設定したいので、「×」「△」「〇」が表示されるようにしています。
event.getTitle()を使用すると、具体的な予定のタイトルも取得できるので便利です。

var range_num = 2;

  for(const event of events_def){
    //console.log(event.getTitle());
    spreadSet(range_num, event.getStartTime(), "×");
    range_num++;
  }

3. GASを実行してスプレッドシートに書き込む

書き込んだ例は以下のようになります。
A1には「月」、B1には「日」、C1には「予定」と事前に記入していたため、range_numは2から開始するようにしています。

今回の例の場合だと、2行目は「2/23に一般予定がある」、3行目には「2/25に一般予定がある」…という感じです。

GASからスプレッドシートに出力された結果

4. カレンダーに登録する

「×」「△」「〇」と記載されるところに、以下の関数を使用します。(もう少し綺麗に書けると思いますが、とりあえず現状はこれで設定しています。)

=IF(COUNTIFS('シート1'!$B:$B,VALUE(E4), 'シート1'!$A:$A, VALUE(SUBSTITUTE($C$1, "月", ""))), XLOOKUP(VALUE(E4), 'シート1'!$B:$B, 'シート1'!$C:$C), "〇")

E4は以下の図の場合だと、「1」にあたります。

上記の関数は、「2月1日に予定があったら、そのときの予定を書いてね。そうじゃない場合は「〇」と設定してね。」という意図の設定です。

この関数は、どこかひとつのセルに登録して、セルの右下をドラッグすれば他のセルにも適用されます。

この記事の完成図(サンプル)

おわりに

最近、外に出て会う機会もまた少しずつ増えだした気がします。
個人で使用するために作ってみたのですが、「アバウトなカレンダー」は意外と日程調整に便利だなと感じています。
自動で登録しておいて、「予定はないけど、ちょっとこの日は空けときたいな」みたいなときは手動で登録することもできるので、外向けのカレンダーとして使ってみてはいかがでしょうか?


参考記事

以下の記事を参考にさせていただきました。ありがとうございました


この記事が気に入ったらサポートをしてみませんか?