背景
①週末暇だった
②コードを最近ずっと書いていなかった
③お前なにしてるかわからんという声をよく頂く
何をしたか
会社のGoogleCalendarを舐めて、直近1ヶ月だれと何回MTGしたか調べた。
また、回数を会議参加者数で重み付けした集計も行った。(1/参加者数、1on1が一番重くなる)
(とりあえず直近1ヶ月)
回数ベースじゃなくて、時間ベースの方が精度良くなるかも
(でも飲み会のweight上がりそうなんだよなあ…)
結果
単純な回数
これだけでも十分に一緒に仕事してるひとを表現できた。
function summarizeInSimple(nogByEvent){
nameOfGuests = flatten(nogByEvent);
var counts = {};
for(var i=0; i<nameOfGuests.length; i++) {
var num = nameOfGuests[i];
counts[num] = counts[num] ? counts[num] + 1 : 1;
}
return counts;
}
会議参加者数で重み付け
人数少なめのMTGが優先されるので、こっちのほうがよりしっくり来る。
ただ、飲み会とかランチも重み強くなるので、純粋に仕事って感じは減ってるかも。
上位はあまり変わらず。
function summarizeByImportance(nogByEvent){
var scores = {};
for(var i=0; i<nogByEvent.length; i++) {
var e = nogByEvent[i]; //イベントごとに
var numOfParticipants = e.length //自分を除く参加者数
for(var j=0; j<numOfParticipants; j++){
scores[e[j]] = scores[e[j]] ? scores[e[j]] += 1/numOfParticipants: 1/numOfParticipants;
}
}
return scores;
}
応用可能性
- 360°評価導入時の、評価者選定やその評価の重み付け ← 結構ありえそう
- 個人から全社員に拡張すれば、ネットワーク分析が可能。
- シャッフルランチの効率化
- ネットワーク量少ない社員のフォローアップ
- きつそうだけど、chatWorkやSlackも分析したら面白そう
最後に
こういう身近でちょっとしたことから、無邪気にTechnologyDrivenして 楽しい感じにしたい。
付録:Script
loggerで吐いたログを圧倒的Excel力()で編集してるので、良しなに修正いただきたい所存。
GoogleAppsScriptは環境設定要らないので実行までがかんたん。やり方わからなければ聞いてください。
function gatCalendar(id){
var cals = CalendarApp.getCalendarById(id); //特定のIDのカレンダーを取得
return cals;
}
function subsetNMonth(date, month) {
var tmp_date = date
tmp_date.setMonth(tmp_date.getMonth() - month);
return tmp_date;
}
function getGuestNameListsByGuestLists(guestList, mySelf){
var nameList = [];
for(var i=0; i<guestList.length; i++){
var g = guestList[i];
var email = g.getEmail();
if(email.match(/@resource.calendar.google.com/) == null && email != mySelf){ //会議室と自分自身を除く
name = email.replace('@yourCompanyDomain', '') //よしなに変更してください
nameList.push(name);
}
}
return nameList;
}
function getNameOfGuestsByEvents(events, mySelf){
var nameOfGuestsByEvents = [];
for(var i=0; i<events.length; i++){ //gasってfor...of...ってかけないぽい
var e = events[i];
guestList = e.getGuestList();
nameOfGuests = getGuestNameListsByGuestLists(guestList, mySelf);
nameOfGuestsByEvents.push(nameOfGuests)
}
return nameOfGuestsByEvents;
}
function flatten(array2D){
flattenArray = []
for(var i=0; i<array2D.length; i++){
var a = array2D[i];
for(var j=0; j<a.length; j++){
var e = a[j];
flattenArray.push(e);
}
}
return flattenArray;
}
function summarizeInSimple(nogByEvent){
nameOfGuests = flatten(nogByEvent);
var counts = {};
for(var i=0; i<nameOfGuests.length; i++) {
var num = nameOfGuests[i];
counts[num] = counts[num] ? counts[num] + 1 : 1;
}
return counts;
}
function summarizeByImportance(nogByEvent){
var scores = {};
for(var i=0; i<nogByEvent.length; i++) {
var e = nogByEvent[i]; //イベントごとに
var numOfParticipants = e.length //自分を除く参加者数
for(var j=0; j<numOfParticipants; j++){
scores[e[j]] = scores[e[j]] ? scores[e[j]] += 1/numOfParticipants: 1/numOfParticipants;
}
}
return scores;
}
function main() {
const ID = 'xxx@yourCompanyDomain';
const TODAY = new Date();
const START_DATE = subsetNMonth(new Date(), 1);
var cal = gatCalendar(ID);
events = cal.getEvents(START_DATE, TODAY);
nogByEvent = getNameOfGuestsByEvents(events, ID);
//Logger.log(nogByEvent);
Logger.log(summarizeInSimple(nogByEvent))//単純回数
Logger.log(summarizeByImportance(nogByEvent))//重み付け重要度
}