Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【営業向け】インサイドセールスでアポ取得できたときのお客様へのメールを自動生成する

やりたいこと&その理由

インサイドセールスをしていてお客様とのアポイントが取れたときに、打ち合わせ調整メールを送っている。しかし、1本でも多く電話をかける為に、メールを打っている時間を少しでも短縮したいと思っていた。
また、今後なん100通と同じようなメールを作るのは時間の無駄なので、自動化することで、コール数を最大化することが目的。

実装方法

1: 自分のGoogleカレンダーを取得
2: 現在から2か月先の予定を配列で取得
3: 2の配列の中で、一番最近に作られた予定を取得
4: メール送信の際に必要な情報を3から抜き出す
5: メールの下書きを作成

完成系

メール送信用のHTMLファイルと、GASのスクリプトを用意

gas.js
const CALENDAR_ID = '自分のカレンダーID';

function getCalendarEvents() {
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID); //自分のカレンダーを取得
  const startTime = new Date(); //現在の時刻
  const endTime = new Date();
  endTime.setMonth(endTime.getMonth() + 2); //現在から2か月先の時刻

  var newestEvent = getNewestEvent(calendar, startTime, endTime); //最新の予定を取得
  var emailInformation = getInformationForEmail(newestEvent); //メール送信時に必要な情報を予定から取得


  var template_index = HtmlService.createTemplateFromFile('body');
 template_index.arr = [emailInformation.companyName,
                       emailInformation.name,
                       emailInformation.mtgMonth + 1, //なぜ+1をしてるかは、しらんw getMonth()メソッドの仕様なので+1をしてあげないと、1か月後ろの月が表示されてしまう 
                       emailInformation.mtgDate,
                       emailInformation.mtgDay,
                       emailInformation.mtgHour,
                       emailInformation.mtgMinutes,
                       emailInformation.mtgUrl];

  var html = template_index.evaluate().getContent();

  if(newestEvent.getTitle().match(/WEBお打合せ/) && newestEvent.isOwnedByMe()){ //タイトルに”WEBお打合せ”という文字が入っていたら、下書きを生成する
    GmailApp.createDraft(emailInformation.toEmail, emailInformation.subject, html,{cc: emailInformation.ccEmail, htmlBody: html});
  }

}

function getNewestEvent(calendar, startTime, endTime){
  var events = calendar.getEvents(startTime, endTime); //指定した期間に存在する予定を配列で取得

  var arrUpDate = [];//更新日時を格納する用の配列を用意する

  for (var i = 0;i<events.length;i++){//用意した配列に追加していく
    arrUpDate.push(events[i].getLastUpdated().getTime());
  }

  var maxDay = Math.max.apply(null,arrUpDate);//更新日時が一番新しいものを特定
  var index = arrUpDate.indexOf(maxDay);//更新日時が一番新しい配列のインデックスの取得
  return events[index]; //インデックスを指定して、更新日時が一番新しいものを返す
}


function getInformationForEmail(newestEvent){
  var dayOfWeekStr = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];

  var titleWithArr    = newestEvent.getTitle().split(" ");
  var companyName     = titleWithArr[1];
  var name            = titleWithArr[2];
  var mtgMonth        = newestEvent.getStartTime().getMonth();
  var mtgDate         = newestEvent.getStartTime().getDate();
  var mtgHour         = newestEvent.getStartTime().getHours();
  var mtgMinutes      = newestEvent.getStartTime().getMinutes();
  if(mtgMinutes == 0){
    mtgMinutes = "00"; //仮に2時ピッタリから商談が始まる場合は、getMinutes()メソッドは0を返すので、テキストで”00”を返すようにしている
  }
  var mtgDay          = dayOfWeekStr[newestEvent.getStartTime().getDay()];
  var toEmail         = newestEvent.getGuestList()[0].getEmail();
  var ccEmail         = 'CCに入れたいメール';
  var subject         = name + ':お打合せの日程に関しまして/私だよ^^';
  var mtgUrl          = newestEvent.getLocation();
  return {
    "companyName": companyName,
    "name": name,
    "mtgMonth": mtgMonth,
    "mtgDate": mtgDate,
    "mtgHour": mtgHour,
    "mtgMinutes": mtgMinutes,
    "mtgDay": mtgDay,
    "toEmail": toEmail,
    "ccEmail": ccEmail,
    "subject": subject,
    "mtgUrl": mtgUrl
  };
}
body.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
<br>
<?= arr[0] ?><br>
<?= arr[1] ?><br>
<br>
いつも大変お世話になっております。<br>
わたしです^^<br>
<br>
先ほどはお電話でのご対応、<br>
誠にありがとうございました。<br>
<br>
改めまして、<br>
以下の日程でお打合せの時間をいただければと存じます。<br>
<br>
日程:<br>
<?= arr[2] ?><?= arr[3] ?>日(<?= arr[4] ?>) <?= arr[5] ?>:<?= arr[6] ?><br>
<br>
会議URL:<br>
<a href = "<?= arr[7] ?>"><?= arr[7] ?></a><br>
<br>
それでは以上となりますが、 <br>
今後とも何卒よろしくお願いいたします。<br>
<br>
  </body>
</html>

仕上げ

スクリプトが用意できたら、トリガーを準備。カレンダーが更新されるたびにスクリプトが走るようになる。

image.png

実際に作業をしてみる

電話をかけて、アポイントが取れたらGoogleカレンダーに予定を入力し、GoogleMeetのURLも画面から発行する。
なお、GoogleMeetのURLの取得だけはどうしても分からなかった。標準のメソッドでは用意がないと思う。
したがって、MeeetのURLに関しては手動でコピーして、打ち合わせ場所にペーストすることで取得する。
同時に、お客様のメールアドレスもインバイト先に入力をする。
また、予定のタイトル部分を全角スペースで区切り、『【確定】 会社名 お客様のお名前 WEBお打合せ』という入力規則で入力する。これをしないと会社名とお名前がうまく取得できないし、最後のif文で引っかかるようになっている。

image.png

アウトプット

無事に下書きも生成された。これで月間のコール数が30は増えたかもしれない。

コードに関しては、あえてメソッドを分けたけど、かえって分かりづらくなった気もする。

image.png

hirokobe26
WealthPark株式会社でインサイドセールスを担当しております。時間単位の生産性を高めるために、個人レベルのタスクを自動化することを心がけております。 というか、むしろ自動化すること自体が趣味になりつつあります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away