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

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

#実装方法
１：　自分のGoogleカレンダーを取得
２：　現在から2か月先の予定を配列で取得
３：　2の配列の中で、一番最近に作られた予定を取得
４：　メール送信の際に必要な情報を3から抜き出す
５：　メールの下書きを作成


#完成系
メール送信用の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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/159af9a3-fc16-15ae-cfb8-35f8858deef7.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/dbff94a9-4603-7199-80cf-091142ac0b40.png)


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/efe1b334-30f7-a8bc-2fbd-0fbba39e31e8.png)