Skip to content

Instantly share code, notes, and snippets.

@takahi5
Last active November 2, 2018 08:24
Show Gist options
  • Save takahi5/ce3f1b21bffd0c9844145fd4f39cb551 to your computer and use it in GitHub Desktop.
Save takahi5/ce3f1b21bffd0c9844145fd4f39cb551 to your computer and use it in GitHub Desktop.
var YEAR = '2018';
var MONTH = '10';
var EMAILS = [
'yamamoto@gmail.com',
'hasegawa@gmail.jp'
]
// カレンダータイトルが対象のものかチェック
function isTargetTitle(title) {
if(title.match(/データ入力/)
|| title.match(/文章校正/)
){
return true;
}else{
return false;
}
}
// Googleカレンダーを読み込む
function readCalendar(email) {
var results = [];
//特定のIDのカレンダーを取得
var calendar = CalendarApp.getCalendarById(email);
//対象期間を指定
var date = YEAR + '/' + MONTH + '/01 00:00:00'; 
var startDate=new Date(date);
var endDate=new Date(date);
endDate.setMonth(endDate.getMonth()+1);
//カレンダーのイベントを取得
var events = calendar.getEvents(startDate,endDate);
for each(var evt in events){
var title = evt.getTitle();
if(isTargetTitle(title)){
results.push({
startTime: evt.getStartTime(),
endTime: evt.getEndTime(),
title: title,
email: email,
});
}
}
return results;
}
// カレンダー読み込み結果から合計時間のサマリーを作る
function summarizeResult(results) {
var summaries = [];
EMAILS.forEach(function(email){
var totalTime = 0;
var interviewCount = 0;
results.forEach(function(result){
if(result.email === email){
totalTime += (result.endTime - result.startTime) / (1000 * 60 * 60);
}
})
summaries.push({
email: email,
totalTime: totalTime
})
})
return summaries;
}
// 空のスプレッドシートを作成
function createSpreadsheet(title){
var id = SpreadsheetApp.create(title).getId();;
var spreadsheet = SpreadsheetApp.openById(id);
return spreadsheet;
}
// スプレッドシートにカレンダー読み込み結果を出力
function exportResultToSpreadsheet(spreadsheet, results){
var sheet = spreadsheet.getActiveSheet();
var array = [];
array.push(['開始', '終了', '時間', 'タイトル', 'ユーザー']);
results.forEach(function(result){
array.push([
Utilities.formatDate(result.startTime, "JST", "YYYY'-'MM'-'dd' 'HH':'mm"),
Utilities.formatDate(result.endTime, "JST", "YYYY'-'MM'-'dd' 'HH':'mm"),
(result.endTime - result.startTime) / (1000 * 60 * 60),
result.title,
result.email
])
})
var rows = array.length;
var cols = array[0].length;
sheet.getRange(1,1,rows,cols).setValues(array);
}
// カレンダーにサマリーを出力
function exportSummaryToSpreadsheet(spreadsheet, summaries){
var sheet = spreadsheet.insertSheet('summary');
var array = [];
array.push(['email', '合計時間']);
summaries.forEach(function(summary){
array.push([
summary.email,
summary.totalTime,
])
})
var rows = array.length;
var cols = array[0].length;
sheet.getRange(1,1,rows,cols).setValues(array);
}
// メイン関数
function main(){
var results = [];
// カレンダーを読み込む
EMAILS.forEach(function(email){
var _results = readCalendar(email);
results = results.concat(_results);
})
// サマリーを作る
var summaries = summarizeResult(results);
// スプレッドシートに出力する
var spreadsheet = createSpreadsheet('カレンダー集計 '+ YEAR + '/' + MONTH);
exportResultToSpreadsheet(spreadsheet, results)
exportSummaryToSpreadsheet(spreadsheet, summaries);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment