LoginSignup
2
2

More than 5 years have passed since last update.

手近なHRTech 。最近俺は誰と仕事してるんだっけ…?

Last updated at Posted at 2018-06-02

背景

①週末暇だった
②コードを最近ずっと書いていなかった
③お前なにしてるかわからんという声をよく頂く

何をしたか

会社の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))//重み付け重要度
}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2