これは、Google Apps Script Advent Calendar 2012の10日目の記事です。
フライングしてますが、前から欲しかったので一気に作ってみました。
今回はGoogle Calendarに登録してある予定(実績)から、かかった時間(=作業時間)を
計算するGoogle Apps Scriptを作ってみました。
実際の業務でも「XXX作業、?時間」という報告をすることもあるでしょう。
(えっ?今の時代にそんな事しない?)
そういう報告するためのデータをGoogle Calendarで管理して、勝手にGASで計算して、文面を整えて、メールで上司に飛ばしたら非常に便利だと思います。
ここでは、カレンダーから時間を計測する部分のみを紹介します。
作成したコード
function myFunction() {
var calendarName = "登録しているカレンダー名";
var title = "<取得したい作業名>";
// 今回は敢えて期間は長めに!
var startTime = new Date("2012/08/01");
var endTime = new Date("2013/01/01");
// カレンダーの名前からカレンダーオブジェクトを取得
// (複数の可能性があるので配列で返るよ!)
var calendars = CalendarApp.getCalendarsByName(calendarName);
for(var i = 0; i < calendars.length; i++) {
// 開始時間と終了時間を指定することで、特定の期間のイベントを全て取得。
var events = calendars[i].getEvents(startTime, endTime);
Logger.log("全イベント数 = %s", events.length);
var allTime = 0;
var targetCount = 0;
for(var count = 0; count < events.length; count++) {
// カレンダーのタイトルでの絞り込みはできないので
// 全てのイベントのタイトルで比較する。
if(events[count].getTitle() == title) {
targetCount++;
var event_start = events[count].getStartTime();
var event_end = events[count].getEndTime();
// 時間の計算はmoment.jsを使えばもう少し楽になるよ!(Google Apps Script Advent Calendar 2012 5日目参照)
Logger.log("イベント[%s] = %s", events[count].getTitle(), (event_end - event_start));
allTime += ((event_end - event_start) / 1000);
}
}
// ログに出力せず、Spreadsheetに出力すればもう少し見栄えが良いかも。
// 今回は作業時間が割り出したかったのでLoggerにしています。
Logger.log("イベント数 = %s, 全時間 = %s", targetCount, allTime / 3600);
}
}
レシピ
カレンダーの取得(戻り値は配列
)
CalendarApp.getCalendarsByName(カレンダー名)
予定の取得(戻り値は配列
)
Calendar.getEvents(開始時間, 終了時間)
イベントタイトルの取得
CalendarEvent.getTitle()
イベントの開始時間の取得
CalendarEvent.getStartTime()
イベントの終了時間の取得
CalendarEvent.getEndTime()
JavaScriptのDateオブジェクトで差分の計算
実行結果
...たくさんのログ...
イベント数 = 88.0, 全時間 = 191.0
結論
赤字か?!