Speee DEVELOPER BLOG

Speee開発陣による技術情報発信ブログです。 メディア開発・運用、スマートフォンアプリ開発、Webマーケティング、アドテクなどで培った技術ノウハウを発信していきます!

営業マンがGoogleカレンダーを読み込んで、メールを自動作成するスクリプト書いてみた

いつもお世話になっております。株式会社Speeeの上條です。
Speeeには様々な事業部があり、私はデジタルコンサルティング事業部に所属しています。
業務内容はクライアントのデジタルマーケティング領域においてSEO、Web広告の2軸で支援させていただいています。 私はその中でもWeb広告のアカウントプランナーとして従事しています。

一般的な職種として一番近しいのはルートセールスと言われる既存クライアントに訪問する営業職です。 ザクッとわかりやすく言うと「広告代理店の営業マン」です。

そんな営業マンの私が、技術者が中心となって作られているSpeee DEVELOPER BLOGにどんな内容を記載するのか・・・。
全世界が注目する中、キーボードを打つ手が震えながらも熱い想いと伝えなければいけないという使命感、営業職でもテクノロジーに歩み寄ろうとしている姿勢やら世界平和への願いやらそこら辺を総動員して自分を奮い立たせながら書いてます。

誰かの参考になれば幸いです。

営業職が抱えている「メール対応」という課題

クライアント先に訪問し、議事録や資料を送付する。
ルートセールスをやっている以上これらの仕事は通常業務だと思いますが、11時に訪問、13時に訪問、15時に訪問、17時に訪問、帰社後に訪問先にメールを送付するというスケジュールを送っており、流石に効率化出来ないかなと考えていました。
しかもその日程が週4日となると、その日中に処理しなければどんどんタスクが溜まっていきます。

そして送るメールも前回送ったメールを検索し、宛先、件名、本文をコピー&ペーストして微修正して送付といった単純作業。 これは自動化してサクサクっと終わらせる仕組みを導入して課題を解決しようと思いました。 この仕組は営業職だけでなく、メール多用する方々にとっての良いソリューションになると思っています。

例えば月末月初の見積書や発注書や請求書の送付メール。
大体毎回同じ宛先に送付していると思いますが、そのメールが

・宛先

・件名

・本文

が自動的に入った状態で後は少し書き換えて資料添付して送るだけという状態になったら最高じゃないですか?

そんな夢のような世界を作ることが出来る。そう、このツールならね。

概要

このツールは下記条件下で使用可能です。

・Gmailを使っている

・Googleカレンダーを使っている

この条件を満たしている場合、Googleカレンダーに予定を登録(例えば【メール】◯◯社見積送付とか【訪問】◯◯社とか)すれば、それらの予定に紐づくメールが自動的に作成されるというものです。

どうやって解決したか

①事前にメールの雛形(宛先、件名、本文)をSpreadsheetに作っておきます。
②Googleカレンダーの予定をGoogle Apps Scriptで読み込み、Spreadsheetに書き出します。
③カレンダーの予定とメールの雛形を紐付けます。
④GASでGmailに書き出します。

①事前にメールの雛形(宛先、件名、本文)をSpreadsheetに作っておきます。 f:id:yusuke-kamijo:20180131153258p:plain

②下記コードでGoogleカレンダーの予定をSpreadsheetに書き込みます。

/* 指定月のカレンダーからイベントを取得する */
function getCalendar() {
 
  var mySheet=SpreadsheetApp.openById('◯◯◯◯'); // 連携用SpreadsheetID ※※要更新:スプレッドシートのURLをチェックし、「 "…/d/" と "/edit#…" で囲まれた部分」がそのスプレッドシートID※※
   mySheet.getSheetByName('calendar').getRange('A1:D1000').clear(); // 既存のデータを削除
  var no=1; //No
 
  var myCal=CalendarApp.getCalendarById('◯◯◯◯@gmail.com'); //特定のIDのカレンダーを取得 ※※要更新:Gmailのアドレスを入れる※※
 
  var myEvents=myCal.getEventsForDay(new Date());//当日のカレンダーのイベントを取得
 
  /* イベントの数だけ繰り返してシートに記録 */
  for each(var evt in myEvents){
    mySheet.getSheetByName('calendar').appendRow(
      [
        no, //No
        evt.getTitle(), //イベントタイトル
      ]
    );
    no++;
  }
}

③カレンダーの予定とメールの雛形を紐付けます。

シートを新しく作成し、フィルター関数などを使って①と②を紐付けます。

④GASでGmailに書き出します。

function createDraftInGmail() {

  /* シートの呼び出し */    
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("◯◯◯◯");  //※※要更新:整形したデータが保存されているシート名を記載※※

  /* 列数を取得 */    
  var count = sheet.getRange(1,1).getValue();
  
  var forScope = GmailApp.getInboxUnreadCount(); // needed for auth scope

  for(i = 0; i < count; i++){ 

    
  /* 各データを準備 */
  var strTo = sheet.getRange(i+Y,X).getValue(); //Toが入ります。YとXにはTOの情報が入っているセルが選ばれるように修正してください。
  var strCC = sheet.getRange(i+Y,X).getValue(); //CCが入ります。YとXにはCCの情報が入っているセルが選ばれるように修正してください。

  /* メール本文を準備 */
  var strSubject = Utilities.base64Encode(sheet.getRange(i+Y,X).getValue(), Utilities.Charset.UTF_8); //件名が入ります。YとXには件名の情報が入っているセルが選ばれるように修正してください。
  var strBody = sheet.getRange(i+Y,X).getValue();  //本文が入ります。YとXには本文の情報が入っているセルが選ばれるように修正してください。

  var raw = [
       "To: "+ strTo,
       "Cc: "+ strCC,   
       "Subject: =?utf-8?B?"+ strSubject +"?=",
       "MIME-Version: 1.0",
       "Content-Type: text/plain; charset=UTF-8",
       "Content-Transfer-Encoding: 7bit",
       "",
          strBody
        ].join("\n").trim();    
    
      
  Logger.log(raw);  
    
  var draftBody = Utilities.base64Encode(raw, Utilities.Charset.UTF_8).replace(/\//g,'_').replace(/\+/g,'-');

  Logger.log(draftBody);  
  
  var params = {
    method      : "post",
    contentType : "application/json",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions:true,
    payload:JSON.stringify({
      "message": {
        "raw": draftBody
      }
    })
  };
  var resp = UrlFetchApp.fetch("https://www.googleapis.com/gmail/v1/users/me/drafts", params);
  Logger.log(resp.getContentText());  
  /* ここでメール作成完了 */
  } //forの終了タグ
  
} //functionの終了タグ

苦労したこと

本格的にGASを使ってスクリプトを書いてみましたが、まぁ動かない。
買い物に行って欲しいものの前から動かないうちの娘くらい微動だにしない。
うちの子はホントはこんな子じゃないです。優しくていい子なんです。って涙目になりながらスクリプト書き直しても動かない。
そもそもこのスクリプトが何を表しているかが分からない。
丸腰で受けたTOEICテストくらい、1問もわからないわけ。
嘘みたいだろ。一個もわからないんだぜ?

色んな人に聞きながら直し、動いた時は、成人式で晴れ着姿の娘を見たのと同じくらいの達成感と満足感でした。 まぁ、まだうちの子2歳半だけど。

あと、このスクリプトを動かすためにはGmailのAPI接続が必要です。
その情報がどこにも載って無くて、調べに調べてやっとたどり着き、ちゃんとスクリプトが動いた時は思わず歓喜の舞を三日三晩踊っていたとその情報を見つけた人が言ってました(僕は探していない)。
スクリプトエディタのリソース>Cloud Platform プロジェクトを選択
f:id:yusuke-kamijo:20180131162924p:plain

左側のAPIとサービスをクリックし、Gmail APIをクリックして有効にするをクリックしたらOK!

あとは苦労したことっていうわけではないですが、メール作成は自動化出来ましたが、工数不足で作られたメールを送れないという事象が発生しています。

僕のメール作成のGASはSlack連携のスクリプトも入れたので、「メール作成したよ!」という通知が鬼のように来ます。

本来使っているはずの仕組みに逆に使われているという一種の下克上みたいなことが起きています。 機械に支配されているターミネーターみたいな世界ですが、まぁ、乱世だなって思って一人で楽しんでいます。

おわりに

これからも何か効率化できそうなことがあればGASとかで作っていけたらなと思ってます。

長文読んでいただきありがとうございました!