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

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

【営業マンのための】google calendarの予定に応じて自動でメールを作成する【仕事効率化】

背景

たかだか1本のメール作成であっても、チリも積もれば山となり、バカにならないくらいの時間がかかってきます。
イレギュラーな内容のメールは仕方がないにせよ、御礼メールやリマインドメール、週報メールなどはある程度文章の方向性が決まっており、効率的にメール作成ができるはずだ、ということでやってみました。

やること

google calendarから予定を取得し、その予定に応じてメールを作成し下書きに保存する

使うもの

google app script, google calendar, gmail

実装

メールのテンプレートはスプレッドシートに保存しておきます。
メールの作成のタイミングでスプレッドシートを読みこみ、テンプレートを取得し下書きに保存します。

コードは以下の通り。

function myFunction() {
  var cal = CalendarApp.getCalendarById('メールアドレス');
  var events = cal.getEventsForDay(new Date());

  for(var i in events){
    var event = new Event(events[i])
    if(event.isGoOutTask()){
      createDraft(event.companyName(), "往訪");
    }
  }
}

function createDraft(companyName, mailType){
  var mail = new Mail(mailType, companyName, "spreadsheetのURL");

  GmailApp.createDraft('', mail.subject(), mail.body());
}


Event = function(event){
  this.event = event;
}

Event.prototype.isGoOutTask = function(){
  if(this.event.getTitle().match(/^往訪/)){
    return true;
  }
  return false;
}

Event.prototype.companyName = function(){
  var companyName = this.event.getTitle().match(/【(.*)】/);
  
  return companyName[1];
}


Mail = function(mailType, companyName, url){
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheet = spreadsheet.getSheetByName(mailType);
  var startrow = 1;
  var startcol = 1;

  var sheetdata = sheet.getSheetValues(startrow, startcol, sheet.getLastRow(), sheet.getLastColumn());
  this.companyName = companyName;
  this.subjectData = sheetdata[0][1];
  this.bodyData = sheetdata[1][1];
}

Mail.prototype.subject = function(){
  return this.subjectData;
}

Mail.prototype.body = function(){
  return this.companyName +  String.fromCharCode(10) + this.bodyData;
}

イベントの発火は時間駆動型とし、明け方1~4時の寝てる間くらいに実行されるようにセットしています。


発火するとmyFunction()が呼ばれ、google calendarからその日の予定(events)を取得してきます。

  var cal = CalendarApp.getCalendarById('メールアドレス');
  var events = cal.getEventsForDay(new Date());


そしてそのイベントが往訪であれば、gmailにメールを作成します。
以前もありましたが、予定入力のルールとして、予定名のプレフィクスに予定の種類を入力しています。
takaaki-z.hatenablog.com

MTGの予定なら「会議:ほげほげ打ち合わせ」みたいな感じです。
外出の予定の場合は「往訪:ほげほげ」と入力しているので、これをチェックし予定の種類を判別します。

    if(event.isGoOutTask()){
      createDraft(event.companyName(), "往訪");
    }

Event.prototype.isGoOutTask = function(){
  if(this.event.getTitle().match(/^往訪/)){
    return true;
  }
  return false;
}


メール作成はもともと用意されてるGmailオブジェクトのcreateDraftメソッドを叩くだけです。

function createDraft(companyName, mailType){
  var mail = new Mail(mailType, companyName, "spreadsheetのURL");

  GmailApp.createDraft('', mail.subject(), mail.body());
}


今回はメールの本文の宛名として相手の会社名を入れたいので、google calendarの予定のタイトルから宛名となる情報を取得してきます。
予定入力のルールとして、往訪する会社の名前を「【】」でくくって入力するようにしているので、こちらも正規表現で引っ張ってきます。

Event = function(event){
  this.event = event;
}

Event.prototype.companyName = function(){
  var companyName = this.event.getTitle().match(/【(.*)】/);
  
  return companyName[1];
}


メールの本文はスプレッドシートからテンプレを引っ張ってきてます。

Mail = function(mailType, companyName, url){
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheet = spreadsheet.getSheetByName(mailType);
  var startrow = 1;
  var startcol = 1;

  var sheetdata = sheet.getSheetValues(startrow, startcol, sheet.getLastRow(), sheet.getLastColumn());
  this.companyName = companyName;
  this.subjectData = sheetdata[0][1];
  this.bodyData = sheetdata[1][1];
}

Mail.prototype.subject = function(){
  return this.subjectData;
}

Mail.prototype.body = function(){
  return this.companyName +  String.fromCharCode(10) + this.bodyData;
}


件名と本文をあらかじめスプレッドシートに入力しておき、対象となるセルを参照し取得します。
件名はそのままひっぱってくればOK。
本文は、宛名のみgoogle calendarの予定に合わせて入力するので、整形したものを返します。
改行は文字コードを直接指定して入力するようにしました。


これで、朝起きたら御礼メールの下書きが作成されます。
あとは実際に往訪時に話した内容に合わせて少し編集すればメール作成が完了します。
さすがに往訪時の話の内容を自動入力するのは難しいので、ここは手動で編集します。
また送信先アドレスも今回は手動入力を想定しています。
往訪前にアドレスがわからないパターンもあるので、今回は自動化しませんでした。

実際に運用してみて

実際にこれを1週間運用してみましたが、想像以上にメール作成が楽になりました。
こういった細かいところからちょっとずつ自動化していき、より本質的な仕事に時間が割けるようにしていきます。
これも働き方改革