指定した日の空いている時間すべてに予定を入れてくれるGoogle Apps Scriptです。予定を入れられたくないときにいかがでしょうか?
特にありません。スプレッドシートのコンテナバインド型プロジェクトとして実装しています。
空き時間を埋めたいカレンダーを指定します。
スクリプトの「事前設定エリア」にある変数「calendar_id」にカレンダーのIDをセットしてください。
カレンダーIDは、通常はメールアドレスと同じです。
セットしたら保存して、関数「onOpen」を実行しておいてください。
動作確認として何も予定が無い日と、複数のイベントがすでに入っている日でテストしてみます。
スプレッドシートに戻り、上のメニューにある「スクリプト実行」から「空き時間を埋める」を実行します。
プロンプトが表示されますので、空き時間を埋めたい日をyyyy/mm/dd形式で入力します。
少し待つと、カレンダーに予定が反映されました!
何も予定がなかった日なので、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();
}
}
}
}
年と月を指定すると、セルにカレンダーが出現するGoogle Apps Scriptです。カレンダーを入れたくなって調べてみたら標準機能にはなく、数式でやるにも結構面倒な感じだったので一発で作ってくれるGASを書いてみました。想像の3倍は面倒でした・・・。
指定した年の12ヶ月分のカレンダーを生成してくれるGoogle Apps Scriptです。前回作成した「指定した月のカレンダーを生成する」スクリプトをベースに、1年分出力するように変更してみました。横3 ✕ 縦4の形式で生成されます。
Googleが用意してくれている祝日カレンダーをもとに、1年間の祝日をスプレッドシートに出力するGoogle Apps Scriptです。 祝日は年によって変わったりするので確認が面倒なのと、国外との取引がある時にその国の祝日がわかれば便利だなと思い作成しました。
インターネット上にあるCSVファイルをシートに直接取り込むGoogle Apps Scriptです。オープンデータ等の取り込みが楽になるかもしれません。
Google カレンダーの予定を、スプレッドシートにまとめて出力するGoogle Apps Scriptです。カレンダーIDはダイアログボックスで入力できます。
スプレッドシートに入力した値を元に、カレンダーの予定をまとめて作成することができるGoogle Apps Scriptです。
Googleカレンダーの予定を全て非公開にするGoogle Apps Scriptです。組織内で使っているとカレンダー自体は共有されていますので、隠したい予定は個別に非公開化する必要があります。誤って公開している予定が大量にある時にどうぞ。
Googleカレンダーの今日の予定をSlackに通知してくれるGoogle Apps Scriptです。1日分の予定は朝にまとめて知りたいですよね。SlackのIncoming Webhookを使用しています。
シートにあるN日以前の行を自動的に削除するGoogle Apps Scriptです。シートにログを出力していると肥大化しがちなので作りました。
アクティブセルを起点に、Nヶ月後までの日付を出力するGoogle Apps Scriptです。日本の祝日も表示してくれますので、予定表やガントチャートを作るときにどうぞ。