Google Apps Scriptでカレンダーの空き時間を取得する

先日とある所から「Googleカレンダーを見て空いている時間帯を抽出するプログラムを作っていただけないですか?」と相談をいただき、軽く作ってみたのだけれども、それ以降の連絡が途絶えてしまい、「せっかく作ったのにもったいないなー」と思ったのでnoteにて公開することにします。

汎用性を持たせるためにコードの中身だけ公開することにします。
プログラムを起動する方法とか、アウトプットする先とかは全く決めていないので、利用する方の状況に合わせて組み替えてもらえればと思います。


使うツール

  • Google Calendar

今回作ってみたのはGoogle Calendarの予定を確認して、空き時間を取得するプログラム。Googleカレンダーの空き時間を見て日程調整をしてくれるツールはすでにたくさんあるので、それで済むなら便利な日程調整ツールを使った方が良いでしょう。

たとえば『You can book me』とか。

しかしメールの文面とかチャットツールに空き時間の候補を書き出す機会は意外と多く、いちいちカレンダーを開いて自分の予定を見て、空き時間を書き出して、、、とめんどくさい。プログラム実行してコピペで貼り付けるだけにしたい。

そんな痒い所に手が届くプログラムになっているかなと思います。

プログラム概要

【出力例】

【実行方法】

実行するコードは2行のみ。とっても簡単。

const calendarObj = new GoogleCalendar();
const blankTime = calendarObj.createTextContent();
console.log(blankTime);

/* => 
  5/13(月) 終日対応可能
  5/14(火) 9:00〜18:00,18:30〜20:00
  5/15(水) 終日対応可能
  5/16(木) 終日対応可能
  5/17(金) 終日対応可能
  5/20(月) 終日対応可能
  5/21(火) 9:00〜18:00,18:30〜20:00
*/

【設定の変更】

コードの前半で初期設定を指定できるようにしてある。
現時点での設定可能項目は以下。

  • 空き時間の取得開始時間の指定

  • 空き時間の取得終了時間の指定

  • 取得する日数(例:対応可能な日を5日分を取得)

  • 除外する曜日(例:土日は除外)

  • 祝日を除外するか、祝日も含めるかのフラグ

  • 終日対応の予定を反映させるか、無視するかのフラグ

/**
 * 空き時間取得に際しての初期設定
 */
const CALENDAR_GLOBAL_OPTIONS = {
  BLANK_START_TIME : '9:00', //検索開始時間
  BLANK_END_TIME : '20:00',  //検索終了時間
  GET_DATE_COUNT : 7,        //取得する日数
  NOT_SEARCH_DAY_NUM : [0, 6], //取得対象外の曜日(月-金)0 = 日曜, 6 = 土曜
  HOLIDAY_FLAG : true,   //祝日対応する場合はtrue
  ALL_BLOCK_FLAG : false //終日の予定を検索対象に含める場合はtrue(1日全て予定が埋まっている状態として扱う)
};

【その他の出力】

テキストだけではなく、オブジェクト形式での出力もできるようにしてある。この出力をしていただければ出力フォーマットも各々で組み換えて使えます。

const calendarObj = new GoogleCalendar();
const blankTimeObj = calendarObj.getBlankSchedule();
console.log(blankTimeObj);

/** => 
 [ 
  { date_string: '2024/04/22',
    date_string_mmdd: '4/22',
    day_string: '月',
    date_json: { y: 2024, m: 4, d: 22, timestamp: 1713711600000 },
    day_number: 1,
    blank: [ '終日対応可能' ] },
  { date_string: '2024/04/23',
    date_string_mmdd: '4/23',
    day_string: '火',
    date_json: { y: 2024, m: 4, d: 23, timestamp: 1713798000000 },
    day_number: 2,
    blank: [ '9:00〜18:00', '18:30〜20:00' ] },
  .
  .
  .
 ]
*/

利用するとしたらこんな形

例えばの参考として「こんな形で使えるんじゃないか?」をいくつか出しておきます。

doGetでブラウザで表示して使う

メモ帳にURLを書き出しておいて必要なときにGETを実行する感じでも良いし、ブックマークに追加しておいて実行する感じでも良い。

function doGet(e) {
  const calendarObj = new GoogleCalendar();
  const blankTime = calendarObj.createTextContent();

  /** レスポンスする結果 */
  const output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(blankTime);
  // return response-data
  return output;
}

iPhoneのショートカットから実行して使う

doGetの応用として、iPhoneやiPadなどApple製品にデフォルトでインストールされているショートカットのアプリから実行する方法もある。内容は至って簡単で、URLを開くを実行して通知を表示するだけ。

LINEで呼び出して使う

LINE Botを利用して、特定のメッセージを送付したときにカレンダーの空き時間を返信してくれるようなBotを作成することもできそう。

LINE Messaging APIを利用したBotの作成は昔自分も作って記事にしたことがあるので、以下の記事も参考にしてみるとよいでしょう。

SlackのSlash Commandsを実行して使う

Slackの機能として用意されているSlash Commandを設定して、GASからのレスポンスを返せるようにしておけば、Slack上でカレンダーの空き時間を返してくれるようなアプリを作ることもできる。

コード内容_2024-05_ver 1

次に紹介するコードをご自身で用意したGoogle Apps Scriptファイル内にコピペして利用してください。ご自身の使いやすい形でコード内容を組み換えてもらっても構いません。

コード内容は随時アップデート予定です。
意図しない挙動や、「こうした方がいいんじゃないですか?」みたいな提案や、ほしい機能などなど報告があった際にアップデートするかもしれません。

【改修予定】

  • 2024-05-13:予定の空きがない日があった場合にGET_DATE_COUNTに指定した日数分、取得ができない。

ここから先は

11,462字

¥ 2,500

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