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

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

# 何をしたか
会社のGoogleCalendarを舐めて、直近1ヶ月だれと何回MTGしたか調べた。
また、回数を会議参加者数で重み付けした集計も行った。(1/参加者数、1on1が一番重くなる)
(とりあえず直近1ヶ月)

回数ベースじゃなくて、時間ベースの方が精度良くなるかも
(でも飲み会のweight上がりそうなんだよなあ…)

# 結果
## 単純な回数
これだけでも十分に一緒に仕事してるひとを表現できた。

```javascript

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が優先されるので、こっちのほうがよりしっくり来る。
ただ、飲み会とかランチも重み強くなるので、純粋に仕事って感じは減ってるかも。
上位はあまり変わらず。

```javascript
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は環境設定要らないので実行までがかんたん。やり方わからなければ聞いてください。

```javascript

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))//重み付け重要度
}
```