音楽とお酒とものづくりと

営業マンが元webエンジニアの経験を生かしてあれやこれやするやつ

【営業マンのための】営業活動を分析するために日々の予定をスプレッドシートに吐き出す【仕事効率化】

もはや週末の趣味になりつつあります。
営業マンのための仕事効率化シリーズ第3弾です。

背景

営業チームが今週何をして、どんな進捗があったのかを報告するために、
日々の営業活動を明らかにする必要があります。
例えば新規提案の打ち合わせが何件あったのか、社内の打ち合わせは何件あったのかなどなど。

1週間ごとにサマって報告しているのですが、
1週間分のスケジュールを目視で確認し、どういうアクションが何件あったのかを把握するのは意外と面倒です。

そこでgoogle calendarから予定を取得し、それがどういうアクションだったのかをスプレッドシートに書き出し、
それぞれのアクションを週次、Qごと、合計値で算出するGASを書いてみました。

実装

function myFunction() {
  var cal = CalendarApp.getCalendarById('メールアドレス');
  var events = cal.getEventsForDay(new Date());
  
  var spreadsheet = SpreadsheetApp.openByUrl("スプレッドシートのURL");
  var sheet = spreadsheet.getSheetByName("マスタ");
  
  for(var i in events){
    if(isAttending(events[i].getMyStatus())){
      addScheduleData(sheet, events[i]);
    }
  }
}

function addScheduleData(sheet, event){
  sheet.appendRow([dateFormat(event.getStartTime()), event.getTitle()]);
}

function dateFormat(scheduleDate){
  date = new Date(scheduleDate);
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  
  return year + "/" + month + "/" + day;
}

function isAttending(status){
  if(status == "YES" || status == "OWNER"){
    return true;
  }
  
  return false;
}


特に難しいことはしていません。
これまでやったことを組み合わせて実装できました。

  var cal = CalendarApp.getCalendarById('メールアドレス');
  var events = cal.getEventsForDay(new Date());
  
  var spreadsheet = SpreadsheetApp.openByUrl("スプレッドシートのURL");
  var sheet = spreadsheet.getSheetByName("マスタ");

メールアドレスに紐づくカレンダー情報を取得し、今日の予定を取得してきます。
そして予定を書き出すスプレッドシートのURLとシートを指定します。

  for(var i in events){
    if(isAttending(events[i].getMyStatus())){
      addScheduleData(sheet, events[i]);
    }
  }

そしてそれぞれのイベントに対し、自分が出席するイベントのみスプレッドシートに書き出します。
自分が出席するもののみ書き出すのは、他の人に同期だけされた予定を自分の営業活動としてカウントしないためです。


function addScheduleData(sheet, event){
  sheet.appendRow([dateFormat(event.getStartTime()), event.getTitle()]);
}

スプレッドシートに追記しいてくのはこちら。
最後の行にどんどん追加していきます。


function dateFormat(scheduleDate){
  date = new Date(scheduleDate);
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  
  return year + "/" + month + "/" + day;
}

スプレッドシートには、その予定の日付と予定名を書き出します。
event.getStartTime()では日付だけでなく時刻まで取得してきます。
今回は時刻は必要ないので、YYYY/MM/DDの形式で書き出すようにフォーマットしています。


function isAttending(status){
  if(status == "YES" || status == "OWNER"){
    return true;
  }
  
  return false;
}

こちらは自分が出席するイベントかどうかを判別する関数です。
それぞれのイベントに対し、自分の参加ステータスが決められています。
Enumで定義されているようで、それぞれ以下のように定義されています。
他人に同期され、出席と回答したもの:YES
他人に同期され、欠席と回答したもの:NO
自分が作成したイベント:OWNER
同期されたが出席とも欠席とも回答していないもの:INVITED
未定と回答したもの:MAYBE

自分が出席するイベントは、YESとOWNERが該当するため、この二つのステータスを持つイベントのみスプレッドシートに書き出す対象としています。


これでスプレッドシートに予定が書き出されていきます。
あとはスプレッドシート側で予定をサマっていき、週次、クォーターの報告として活用します。
スプレッドシートには以下のように追記されていきます。
f:id:takaaki_z:20180317160333p:plain


本当は予定を書き出した段階でその予定がどのカテゴリに入るのかまで判別できれば良いのですが、他の人に同期された予定名はプレフィックスのルールがバラバラだったりするので、予定のクラスタリングだけは手動でやるようにします。
該当するカテゴリのところに1を入力していきます。


このデータを元に、集計する数式を埋め込みます。
完成系はこんな感じ
f:id:takaaki_z:20180317160659p:plain


今週のアクション数を出すところは、WEEKDAY()を利用します。

=TODAY() - weekday(now(), 3)

2018/3/12のところは上記の関数を埋め込みます。
2018/3/17のところはTODAY()でOKです。
週次の報告を上げるのは基本金曜日なので、いったんTODAY()で運用します。
これで今週の日付も自動で変わっていってくれるので、便利ですね。

そうして月曜日を起点にし、今週の月曜日以降、金曜日までの日付に該当する予定の各合計数を算出します。
これはSUMIFS()を使えば1発です。

sumifs('各カテゴリの列', '予定の日付列', ’月曜日以降' , '予定の日付列', ’今日まで')

こんな感じですね。

最後に

自動化楽しい!