【Google Apps Script (GAS) 】企業との日程調整を簡略化

##日程調整を簡略化したい
最近流行りのカジュアル面談に私もお声がけ頂く機会が増えてありがたいのですが、
その際の日程調整のフローに時間を要するのが少し億劫に感じています。

できるだけメールのラリーを減らして、
**"お世話になっております。○○と申します。**
　**(省略)**
 **何卒宜しくお願い致します。"**
などの定型文付きの日程調整メール送信のフローを**失礼のない範囲**で省いていきたいものです。

##既にあるサービス

####[Googleカレンダーを連携して日程調整機能を使いたい](https://wantedly.zendesk.com/hc/ja/articles/115005148503-Google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E9%80%A3%E6%90%BA%E3%81%97%E3%81%A6%E6%97%A5%E7%A8%8B%E8%AA%BF%E6%95%B4%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)
Wantedly上でGoogleカレンダーと連携して日程を企業側が提案できるという内容のようです。

残念ながら求職者側から提案する機能はないようです。。。

---

####[日程調整ツール「調整アポ」が便利すぎる件について](https://liginc.co.jp/472341)
Googleカレンダーと連携して日程を提案できるサービスのようです。
もうこれでいいじゃんとも思いましたが、
無料期間が過ぎると有料になるので自分で簡易版を作ることにしました。

##実装
Googleフォームを利用して実装します。

イメージとしては下記画像のような仕組みです。
![GASImage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/79c8b4b3-67c3-1d6c-f286-eecf3b2b8335.png)


似たようなことをやっている方は既にいらっしゃいました。

[Googleフォームの問い合わせフォーム&自動返信メールの作り方と設置。GASはコピペでOK](https://sdblog35.com/googleform/)
[参加確認フォームを作ろう-Googleフォーム](https://qiita.com/moburo/items/343dec0e4ace87bf9072)

今回はこちらから日程案を複数提出して、
それに対して企業側が可否を答えるというフォームを作ります。
入力後、入力内容の確認メールが企業側、求職者側に届く仕組みにします。
最終的な確認のやり取りは敢えて自動化の対象から外しました。

##フォームを作る
この辺はGUIでポチポチやるだけなので特に詰まるポイントはないです。

ただし、フォームの入力欄の見出し文言は
後程GASで参照するので後から修正のないように考えた方が手間が省けます。

![QiitaView.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/5d165bd0-2c9b-41c2-573b-0ce2cd518e06.gif)


##スプレッドシート作成
フォームに入力した内容をスプレッドシートに記録します。
作成方法は、フォームの編集画面から回答を選択しスプレッドシートのマークを押します。


![シート.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/095cd775-8840-61df-7bc8-8b28aefc72cf.png)

##トリガーの設定
今回はフォームの送信と同時にメールを送信する機能を作るので
トリガーとして"フォームの送信"設定する必要があります。

参考リンクの丸パクリで申し訳ないのですが、私も記憶に定着させておきたいのでメモします。

まずはスプレッドシートの`ツール`から`スクリプトエディタ`を開きます。

そして、時計っぽいマークを押して、開いたページ先で`トリガーを追加`を選択します。
![GAS時計.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/2dd8e434-ceb0-467f-c9eb-d9987b91212a.png)

名前を付けろと言われるので、適当に名前を付けた後、下記画像のような設定画面が開くので、
イベントの種類を`フォーム送信時`に変更します。
![GASトリガー設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e951c2b3-bb52-312a-0909-65a4fdc6e741.png)

2回警告が出るので、2回とも最も左下にあるリンクを選択します。
![GAS警告.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/2412a00f-18f1-62f8-7740-44c7c504f577.png)

![GAS警告２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/ea7c8583-fbb4-e8b5-5332-93da249f5ef5.png)


##スクリプト

```javascript:適当。でも繊細。様のスクリプトを参考にさせて頂きました。
function sendMailGoogleForm() {
 //自動返信メールの件名
 var title = "尾上です。日程のご調整ありがとうございます"; 
 
 //自動返信メールの本文　\nは改行。 
 var body
 = "お世話になっております。尾上です\n"
 + "ご入力頂いた内容は下記の通りです。\n"
 + "内容を確認の上、あらためてご連絡致しますので、今しばらくお待ちください。\n\n"
 + "--------------------------------------\n\n"

 //入力項目はここに保存する
 var body2="\n\n";

 var body3
 = "--------------------------------------\n\n"
 + "48時間経過しても返信がない場合は、お手数ですが hogeまでお問い合わせください。\n"
 + "本メールに心当たりが無い場合は、その旨を記載の上ご返信くださいますようお願い致します。\n\n";
 
 //変数を設定
 var name = '所属名、お名前'; //フォームの項目名と同じにする
 var date = 'ご調整可能な日程'; //フォームの項目名と同じにする
 var mail = 'メールアドレス'; //フォームの項目名と同じにする
 var user_address = "";
 var my_addrees = "通知を受け取りたいメアド";
 var notification = "日程入力完了通知";
 
 var sheet = SpreadsheetApp.getActiveSheet();
 var row = sheet.getLastRow();
 var column = sheet.getLastColumn();
 var range = sheet.getDataRange();
 var TIMESTAMP_LABEL = 'タイムスタンプ';
 
 for (var i = 1; i <= column; i++ ) {
 
   //スプレッドシートの入力項目名
   var item = range.getCell(1, i).getValue(); 
   
   //スプレッドシートの入力値
   var value = range.getCell(row, i).getValue();
   
   //タイムスタンプ→お問い合わせ日時
   if ( item === TIMESTAMP_LABEL ) {
   item = 'ご回答日時';
   }
  
   //日付フォーマットの変換
   if ( item === 'ご回答日時' ) {
   value = Utilities.formatDate(value, 'Asia/Tokyo', "YYYY'年'MM'月'dd'日'HH'時'mm'分'ss'秒'");
   }
  
   //本文（body）にフォームの入力項目を追加 
   body2 += "■"+item+"\n";
   
   //本文にフォームの入力内容を追加
   body2 += value + "\n\n";
   
   //フォームの入力項目が「お名前」の場合は、「様」をつけて、本文の前に追加 
   if ( item === name ) {
   body = value+" 様\n\n"+body;
   }
   
   //フォームの入力項目が「メールアドレス」の場合は、変数addressに入れる
   if ( item === mail ) {
   user_address = value;
   }
 }
 
 //本文1に本文2、本文3を追加
 body += body2+body3;
 
 //自分宛てに通知
 GmailApp.sendEmail(my_addrees,notification,body2);
 
 //宛名＝address、件名＝title、本文=bodyで、メールを送る
 GmailApp.sendEmail(user_address,title,body);
}

```

仕組みとしては下記画像のように
フォームへの入力内容がスプレッドシートの対応した箇所に自動で入力されるようになってます。
![GASスプレッドシート.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/066978ee-e511-5c03-0fae-6b93bc891c6e.png)

この内容を下記コードで取得してきています。

```javascript

   //最後の行を取得
   var row = sheet.getLastRow();

   //スプレッドシートの入力項目名
   var item = range.getCell(1, i).getValue(); 
   
   //スプレッドシートの入力値
   var value = range.getCell(row, i).getValue();
```

あとはitemと任意の項目名が一致しているか判定し、それぞれに必要な処理を追加しています。

##受信メール

実際に送信すると下記のように自動で企業側、求職者側に通知が届きます。


####[企業側]
![MailGAS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/97ea7632-3064-9ad4-6d9b-10558f2152ef.png)

####[求職者側]
![notificaion.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/1306a2bc-aa1b-844c-ce56-b4094cef92a6.png)


##まとめ
自分で一から用意する必要がほぼなかったのでとても便利だと思いました。
ただ、実際に今回の成果物を使ったことはないので、もしかしたら重大な問題をはらんでいたり、
逆にめんどくさかったりするかもしれません。

ただ、今回簡略化したフローの無駄については、みんな感じていることだとは思うので
他にももっと良い簡略化が思いつけばどんどん試していきたいです。