奥さんからの依頼
我が家では僕と奥さんのカレンダーをGoogleカレンダーでお互いの予定が確認できるようにしています。
その中で二人が見れる(&編集もできる)「Family」というカレンダーでは毎月「記念日」というタイトルでイベントが登録されています。
しかし、ある日奥さんから依頼が。
「ねー、記念日ってタイトルだったら◯年◯ヶ月なのか分からないから、タイトルに表示させてよ」
普通にカレンダー登録で「毎月末」とするのは決まったタイトルでないといけないわけで、「◯年◯ヶ月」という動的に名前を変えないといけないんですね。
というわけで、Google Apps Scriptで「◯年◯ヶ月記念日」というタイトルでカレンダーに登録させてみました。
実装
// Definition
var ANNIVERSARY_YEAR = 2012;
var ANNIVERSARY_MONTH = 5;
var ANNIVERSARY_DAY = 21;
var CALENDAR_ID = 'カレンダーのID';
/**
* 記念日の情報を設定する
*/
function createAnniversaryEvent() {
// 登録するカレンダーを設定
var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
// 今年を指定
var year = new Date().getFullYear();
// 1月〜12月までをループしてイベント情報を設定
for(var month = 1; month <= 12; month++) {
var yearNum = 0
var monthNum = 0;
// ○年○ヶ月の設定
if(month < ANNIVERSARY_MONTH) {
yearNum = year - ANNIVERSARY_YEAR - 1;
monthNum = month + (12 - ANNIVERSARY_MONTH);
} else {
yearNum = year - ANNIVERSARY_YEAR;
monthNum = month - ANNIVERSARY_MONTH;
}
var title = yearNum + '年' + monthNum + 'ヶ月記念日';
var date = new Date(year, month - 1, ANNIVERSARY_DAY);
Logger.log(title);
Logger.log(date);
// イベント登録実行
_addToCalendar(calendar, title, date);
}
}
/**
* カレンダーにイベント登録を実行する
*
* @param calendar 登録するカレンダー
* @param content 登録イベント情報
* @param date 登録イベント日時
*/
function _addToCalendar(calendar, title, date) {
// 終了日時
var endTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59);
// その日のイベント
var eventsForDay = calendar.getEvents(date, endTime);
var exsists = false;
// 既存のイベントに存在するか確認する
for (var l = 0; l < eventsForDay.length; l++) {
// 存在したらフラグを立ててループを抜ける
if (title === eventsForDay[l].getTitle()) {
exsists = true;
break;
}
}
// 既存のイベントが存在しなかった場合のみイベントを登録する
if (!exsists) {
var event = calendar.createAllDayEvent(title, date);
// 1時間前にリマインダーを設定
event.addPopupReminder(60);
}
}
注意点
カレンダーIDはGoogleカレンダーの設定画面で下記のように書かれています。
xxxxxxxxxxxxx@group.calendar.google.com
@マーク以下も全部含めてコピーし、カレンダーIDとして定数に入れておきましょう。
GitHubにもソースコード載せておきました。
https://github.com/hidetoshi-nagayasu/Create-Anniversary-Event/blob/master/main.gs