2022/09/21に更新

【GASでサボる】カレンダーの空き時間をすべて埋める

カレンダー小技

指定した日の空いている時間すべてに予定を入れてくれるGoogle Apps Scriptです。予定を入れられたくないときにいかがでしょうか?

こんな悩みを解決します


  • この日は絶対に会議を入れてほしくない。
  • とりあえずダミーの会議通知で埋めておこう・・・。

用意するもの


特にありません。スプレッドシートのコンテナバインド型プロジェクトとして実装しています。

このスクリプトで出来ること


  • 指定したカレンダーの特定の1日の空き時間を探し、その時間の全てにダミーの予定を登録します。
  • 日付はプロンプトで入力可能です。

使い方


1.事前準備

空き時間を埋めたいカレンダーを指定します。
スクリプトの「事前設定エリア」にある変数「calendar_id」にカレンダーのIDをセットしてください。
カレンダーIDは、通常はメールアドレスと同じです。
セットしたら保存して、関数「onOpen」を実行しておいてください。

動作確認として何も予定が無い日と、複数のイベントがすでに入っている日でテストしてみます。

2.スクリプトの実行

スプレッドシートに戻り、上のメニューにある「スクリプト実行」から「空き時間を埋める」を実行します。

プロンプトが表示されますので、空き時間を埋めたい日をyyyy/mm/dd形式で入力します。

3.結果の確認

少し待つと、カレンダーに予定が反映されました!
何も予定がなかった日なので、24時間の予定が作成されています。

複数の予定が入っている日でも実行してみました。
空き時間がすべて埋まってますね。これで会議通知はもう来ない・・・はず!

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00149/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('空き時間を埋める', 'fill_schedule');

  // メニューを画面に追加する
  menu.addToUi();
}


function fill_schedule() {

  // ########## 事前設定エリア ここから ##########

  // 埋めたいカレンダーのIDをセットしてください
  const calendar_id = '*****@*******';

  // ########## 事前設定エリア ここまで ##########


  // プロンプトを表示するためにUIオブジェクトを取得
  const ui = SpreadsheetApp.getUi();

  // 日付を入力させるプロンプトを表示する
  const response = ui.prompt('空き時間を埋めたい日付を入力してください', '例:2022/9/22', ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたらスクリプトを終了する
  if (response.getSelectedButton() == ui.Button.CANCEL) {
    return;
  }

  // 埋めるイベントの開始時刻と終了時刻を用意しておく
  // 今日の0時0分をセット
  let date_start = new Date(response.getResponseText());
  date_start = new Date(date_start.getFullYear(), date_start.getMonth(), date_start.getDate(), 0, 0, 0);

  // 今日の23時59分をセット
  let date_end = new Date(response.getResponseText());
  date_end = new Date(date_end.getFullYear(), date_end.getMonth(), date_end.getDate(), 23, 59, 0);

  // IDからカレンダーを取得
  const calendar = CalendarApp.getCalendarById(calendar_id);

  // カレンダーの今日のイベントをすべて取得する
  const events = calendar.getEventsForDay(date_start);

  // イベントの有無で分岐
  if (events.length == 0) {
    // 当日にイベントが1件もない場合

    // 0:00〜23:59までのイベントで埋める
    calendar.createEvent('ブロック', date_start, date_end);

  } else {
    // 1つでもイベントがあった場合

    // ループ内で使う変数を宣言。1つ前のイベントの開始と終了時刻を記録する
    let time_start, time_end;

    // 当日のイベントの数 + 1の数だけループ。
    // 空き時間はイベント数+1個存在するため。
    for (let i = 0; i <= events.length; i++) {

      if (i == 0) {
        // ループの1周目の場合

        // イベントの開始、終了時刻を取得する
        time_start = events[i].getStartTime();
        time_end = events[i].getEndTime();

        // 1つ目のイベントのときは、0:00からイベントの開始時刻までが空き時間となるが、
        // 既存イベントが00:00スタートの場合は空き時間の登録は不要になる
        if (time_start.getTime() != date_start.getTime()) {
          calendar.createEvent('ブロック', date_start, time_start);
        }

      } else if (i == events.length) {
        // 最後のループの場合
        // 最後のループは意図して追加したもので、既存のイベントは存在しない。

        // 1つ前のイベントの終了時刻から23:59までが空き時間となるが、1つ前のイベントの終了時刻が23:59の場合は空き時間がないことになるため、時刻を判定してからイベントを追加する。
        if (time_end.getTime() != date_end.getTime()) {
          calendar.createEvent('ブロック', time_end, date_end);
        }

      } else {

        // 1週目もしくは最終ループ以外は1つ前のイベントの終了時刻から今回のイベントの開始時刻までが空き時間となる
        // ただし、「1つ前のイベント終了時刻」が「今回のイベントの開始時刻」と同一の場合は、イベントの間に空き時間が存在しないため、時刻が同一でないことを判定してからイベントを作成する。
        if (time_end.getTime() != events[i].getStartTime().getTime()) {
          calendar.createEvent('ブロック', time_end, events[i].getStartTime());
        }

        // イベントの開始、終了時刻を取得する(次のループで使用する)
        time_start = events[i].getStartTime();
        time_end = events[i].getEndTime();

      }
    }
  }
}

関連するアプリ


【GASで時短】指定した月のカレンダーを生成する

年と月を指定すると、セルにカレンダーが出現するGoogle Apps Scriptです。カレンダーを入れたくなって調べてみたら標準機能にはなく、数式でやるにも結構面倒な感じだったので一発で作ってくれるGASを書いてみました。想像の3倍は面倒でした・・・。

【GASで時短】指定した年の12ヶ月分のカレンダーを生成する

指定した年の12ヶ月分のカレンダーを生成してくれるGoogle Apps Scriptです。前回作成した「指定した月のカレンダーを生成する」スクリプトをベースに、1年分出力するように変更してみました。横3 ✕ 縦4の形式で生成されます。

【GASで時短】様々な国の「国民の祝日」を取得する

Googleが用意してくれている祝日カレンダーをもとに、1年間の祝日をスプレッドシートに出力するGoogle Apps Scriptです。 祝日は年によって変わったりするので確認が面倒なのと、国外との取引がある時にその国の祝日がわかれば便利だなと思い作成しました。

【GASで時短】CSVファイルを直接シートに読み込む

インターネット上にあるCSVファイルをシートに直接取り込むGoogle Apps Scriptです。オープンデータ等の取り込みが楽になるかもしれません。

【GASで時短】カレンダーの予定をスプレッドシートに出力する

Google カレンダーの予定を、スプレッドシートにまとめて出力するGoogle Apps Scriptです。カレンダーIDはダイアログボックスで入力できます。

【GASで時短】カレンダーの予定を一括で作成する

スプレッドシートに入力した値を元に、カレンダーの予定をまとめて作成することができるGoogle Apps Scriptです。

【GASで時短】予定をすべて非公開にする

Googleカレンダーの予定を全て非公開にするGoogle Apps Scriptです。組織内で使っているとカレンダー自体は共有されていますので、隠したい予定は個別に非公開化する必要があります。誤って公開している予定が大量にある時にどうぞ。

【GASで便利に】本日の予定をまとめてSlackに通知する

Googleカレンダーの今日の予定をSlackに通知してくれるGoogle Apps Scriptです。1日分の予定は朝にまとめて知りたいですよね。SlackのIncoming Webhookを使用しています。

【GASで自動化】日付が古い行をまとめて消す

シートにあるN日以前の行を自動的に削除するGoogle Apps Scriptです。シートにログを出力していると肥大化しがちなので作りました。

【GASで時短】連続した日付(曜日、祝日付き)を生成する

アクティブセルを起点に、Nヶ月後までの日付を出力するGoogle Apps Scriptです。日本の祝日も表示してくれますので、予定表やガントチャートを作るときにどうぞ。

タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp