Googleフォーム送信後にメール送信とカレンダーイベントに招待を自動化する

社内イベントを開催することがあり、申し込みや参加者の管理の方法を考えていました。
社内はG Suiteが導入されていて、イベントへの申し込みはGoogleフォームで、申し込みしてもらった人には手動でスケジュール登録してもらったり、イベントに招待したりしていました。

手動でスケジュール登録は一括で管理できず、イベントに一人一人招待するのは面倒だったので、申し込みしてくれた人に自動でカレンダーのイベントに招待と、その旨をメールで送るようにしたくて、試してみました。


##Googleフォーム作成
まずは、参加申し込み用のGoogleフォームを作成しました。
参考：[Googleフォームでアンケートを作ってみた](https://qiita.com/taketakekaho/items/a63e3c1bd0a75510ae04)

名前を入力して、送信ボタンを押すだけの簡単なものを用意しました。
![スクリーンショット 2018-02-20 9.49.19.png](https://qiita-image-store.s3.amazonaws.com/0/55407/c3243d4b-6b76-d7e8-15d9-00a6ccb06fcb.png)

カレンダーに招待するためにメールアドレスが必要なので、メールアドレスを収集する設定にします。
![スクリーンショット_2018-02-20_9_50_26.png](https://qiita-image-store.s3.amazonaws.com/0/55407/b587937b-0908-a49e-c84e-eec555b5ca55.png)

Googleフォームでする設定は終わりです。
Googleフォームのスクリプトからメールアドレスを取得してカレンダーのイベントへの招待とメール送信ができないかなぁと思ったのですが、やり方がわからず。撃沈。


##スプレッドシート作成
Googleフォームのスクリプトではできなかったので、今回はフォームと連携しているスプレッドシートを作成して、そこにスクリプトを作成します。「スプレットシートの作成」を押します。
![スクリーンショット_2018-02-20_9_59_40.png](https://qiita-image-store.s3.amazonaws.com/0/55407/e871a742-01c9-5551-4ece-b5f09a967fd5.png)

スプレッドシートを新規に作成するか、既存のものを使うか聞かれますが、私は新規にスプレッドシートが必要だったので、「新しいスプレッドシートを作成」を選び、作成しました。

##スクリプトを作成
作成されたスプレッドシートを開くと、タイムスタンプ、メールアドレス、名前の列があるスプレッドシートが完成しています。スプレッドシートのスクリプトエディタを開きます。
![スクリーンショット_2018-02-20_10_07_17.png](https://qiita-image-store.s3.amazonaws.com/0/55407/451c96f5-dd47-92f5-0679-2e5ebf708446.png)

コード.gsに、コードを書きます。
![スクリーンショット_2018-02-20_10_09_15.png](https://qiita-image-store.s3.amazonaws.com/0/55407/97f9a19c-68a5-5a89-a977-191c11726606.png)

```javascript:コード.gs
function addEvtSendMail() {
  //　変更しましょう　↓↓↓
  //特定のIDメールアドレスをセット
  var cal = CalendarApp.getCalendarById('***@google.com');
    
  //イベント開催日をセット
  var date = 'yyyy/mm/dd'
  
  //カレンダーのイベント名をセット（メールのタイトルにも使います）
  var myEvtTitle = 'カレンダーのイベント名'
  
  //メールに記載する連絡先をセット
  var strFrom = '質問などの問い合わせ先'
  
  //メールの差出人をセット
  var strSender = '差出人署名'
  //　変更しましょう　↑↑↑
  
  //開催日のイベントを取得
  var event = cal.getEventsForDay(new Date(date)); 
  
  //アクティブスプレッドシート
  var Sheet = SpreadsheetApp.getActiveSpreadsheet();
  
  //スプレッドシートのアクティブシート
  var sh = Sheet.getActiveSheet();
  
  //スプレッドシートの最終行
  var i = sh.getLastRow();
  
  //スプレッドシートの追加されたメールアドレス
  var mail = sh.getRange(i, 2).getValue();
  
  //スプレッドシートの追加された参加者名
  var strTo = sh.getRange(i, 3).getValue();
  
  //メールタイトルにイベント名をセット
  var strSubject = myEvtTitle;
  
  //メール本文を組み立て　「\n」が改行
  var strBody = strTo
  + ' 様\n' + 'この度は' + myEvtTitle + 'に申し込みいただき、ありがとうございます。' + '\n'
  + '何か不明点がありましたら、' + strFrom + 'までご連絡ください。' + '\n\n'
  + strSender;
  
  for each(var evt in event){    

    //myEvtTitleに入れたタイトルと一致するイベントで探す
    if(evt.getTitle() == myEvtTitle){
  
      //イベントにゲストを招待する
      evt.addGuest(mail);      
    
      //メールを送信する
      MailApp.sendEmail(
        mail,
        strSubject,
        strBody
      );
    }
  } 
}



```

コードを入力して、任意の値を設定したら、保存します。
![スクリーンショット_2018-02-20_10_16_57.png](https://qiita-image-store.s3.amazonaws.com/0/55407/f20431f0-21ba-37e3-4879-8715ae3287f1.png)

プロジェクト名は適当に設定します。

##スクリプトをテスト
できたら、テストデータを作って動きを確認します。
はじめに、招待するイベントをカレンダーに作成します。
![スクリーンショット 2018-02-19 14.50.42.png](https://qiita-image-store.s3.amazonaws.com/0/55407/63bd7307-4a07-5a1a-43ef-c09033b0feb8.png)

スプレッドシートにテストデータを入力します。メールアドレスは実際にメールがいくので、受け取れるメールアドレスを設定しましょう。
![スクリーンショット 2018-02-19 14.37.12.png](https://qiita-image-store.s3.amazonaws.com/0/55407/1c2e76b9-173f-3543-2587-e7679d0bb182.png)

スクリプトエディタにある三角ボタンを押します。
![スクリーンショット_2018-02-20_10_23_44.png](https://qiita-image-store.s3.amazonaws.com/0/55407/38ee0f5b-4d15-4594-7de1-6cbf9a4c5406.png)


承認が求められるので、確認して許可をします。
![スクリーンショット 2018-02-19 13.22.17.png](https://qiita-image-store.s3.amazonaws.com/0/55407/510f70be-419a-6f0a-7d86-16981b636603.png)

メールが送信されているか確認します。
![スクリーンショット 2018-02-20 10.23.15.png](https://qiita-image-store.s3.amazonaws.com/0/55407/f1bb6ae7-96c4-d445-51b1-3405b2895259.png)

カレンダーのゲストにテストデータのメールアドレスが追加されているか確認します。
![スクリーンショット_2018-02-20_15_17_03.png](https://qiita-image-store.s3.amazonaws.com/0/55407/d5efc617-3535-d2dc-502a-e8adf37ae052.png)

ここまでできれば、ゴールはもうすぐ:grinning:


##動作確認
今度はGoogleフォームに入力するところからテストをします。

準備をします。Googleフォームの送信ボタンを押された時にスクリプトが動くようにトリガーの設定をします。スクリプトエディタの時計のボタンを押します。
![スクリーンショット_2018-02-20_10_23_44.png](https://qiita-image-store.s3.amazonaws.com/0/55407/cb3030f7-f417-7549-b420-511f7c7e5c3f.png)


まだトリガーが未設定の場合、青文字のアンダーバーの部分を押します。
![スクリーンショット_2018-02-20_10_27_21.png](https://qiita-image-store.s3.amazonaws.com/0/55407/5efd1705-ade4-0b7a-5e51-79d24fb636b4.png)

フォームが送信された際に実行するように、トリガーを設定します。

| 実行       | イベント型 | 時間 |
|:-----------------|:------------------|:------------------|
|addEvtSendMail|スプレッドシートから | フォーム送信時 |

![スクリーンショット_2018-02-20_14_25_14.png](https://qiita-image-store.s3.amazonaws.com/0/55407/036ef3ee-2611-b223-44d9-833fd7999619.png)


トリガーの設定ができたら、最後にGoogleフォームから名前を入力して送信ボタンを押します。メールの送信とカレンダーのイベントへの招待が確認できれば、「申し込みしてくれた人に自動でカレンダーのイベントに招待と、その旨をメールで送る」ようにできました。


##とりあえず
心残りというか、できなかったこと。
1. イベントの出欠返信できるメールを送れなかった。（ただのお知らせメールのみ）
2. イベントを開くURLをメールに添付できなかった。
3. GoogleカレンダーのイベントをIDで探せなかった。（ID取れれば直接イベント開けたかも）

上記のとりあえずの応急処置として、送信するメールの中に、Googleカレンダーのイベント当日の予定を開くURLを書くことで対応しました。

```javascript:コード.gs
function addEvtMail() {
.
.
.

  //メールタイトルにイベント名をセット
  var strSubject = myEvtTitle;
  
  //メール本文を組み立て　「\n」が改行
  var strBody = strTo
  + ' 様\n' + 'この度は' + myEvtTitle + 'に申し込みいただき、ありがとうございます。' + '\n'

  //追加
  + 'カレンダーのイベントに招待しておりますので、ご確認をお願いします。'
  + '\n' + 'https://calendar.google.com/calendar/r/day/' + date + '\n\n'
  //追加

  + '何か不明点がありましたら、' + strFrom + 'までご連絡ください。' + '\n\n'
  + strSender;
  
  for each(var evt in event){    
 
.
.
.

}

```

申し込みしてくれた人に送るメールにURLが添付されます。URLを押すとGoogleカレンダーのイベントの日が開かれます。
![スクリーンショット_2018-02-20_11_32_08.png](https://qiita-image-store.s3.amazonaws.com/0/55407/6f81e7da-13df-53cf-b0a4-87c52af4c233.png)

あと、変数のセットを直書きではなく、Googleフォームから引き渡したりして、エラー処理とか書きたして、そして使ってみて改善箇所は少しづつ直していこうかと思います。


参考：
[初心者でも簡単！Google Apps ScriptでGmailを操作してメールを送る方法](https://tonari-it.com/gas-gmail-sendemail/)
[最終行を取得するGASスクリプト](http://www.relief.jp/docs/google-spreadsheet-gas-get-last-row-number-specified-column.html)