Googleフォームで勤怠連絡を作ってみる

# はじめに
「会社に行くときに電車が遅れた」ってそんな時に携帯で上司にメールするのってめんどくさくありませんか？
だったらボタンを数か所押して送信ボタン押したら、勤怠連絡できるものを作っちゃおう！ってのが本ページの目的です。

「でもプログラムとか全然やったことないからそんなの作れないよ。。。」って人の為に、GoogleフォームとスプレッドシートとGASを使って簡易Webシステムを作れるように教えていこうと思います！

なので作りやすさを重視するので、いろいろ穴がありますがそこは目をつぶってくださいね

# 目次
* 大まかな作りの説明
    * 完成図
    * どのような流れで動くのか
    * 必要なもの
* 具体的に作ってみよう
    * Googleフォームを作成してみる
    * スプレッドシートに必要な項目を用意する
    * スクリプトを書いてみる
    * テストしてみよう
    * 実際に動かしてみよう
* 最後に一言

## 大まかな作りの説明
### 完成図
今回作るものは以下のようなアンケートを入力して送信ボタンを押すと指定されたメールにテンプレート通りメールが送信されるというものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/582fa697-f065-66cc-6251-2fb2213e727c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/f2ff9529-cd2d-7aa6-f6d5-10e19e8893c2.png)

作り方がわかればいろいろカスタマイズも簡単にできると思うので自分好みにアレンジしていってみるといいですね！

### どのような流れで動くのか
ざっくりと書くとアンケートに答えて、その答えた内容をGmailからメールを送っちゃうというものです。

まずGoogleフォームというアンケートフォームを簡単に作れる機能があり、そこでアンケートフォームを用意します。
そのアンケートで送信された内容をGoogleスプレッドシート（エクセルみたいなの）に保存していきます。
最後にスプレッドシートに追加された内容をGoogle Apps Script（GAS）というプログラムを使ってGmailからメールを送信する。
流れとしてはこれだけ！

### 必要なもの
* Googleのアカウント
* 上司の許可
    * 勝手にこういうのを使っちゃうとまずい会社とかもあると思うので、許可をもらってからやりましょう！

## 具体的に作ってみよう
### Googleフォームを作成してみる
まずはアンケートフォームを作っていきましょう！
1. Googleドライブに入り、新規作成ボタンからGoogleフォームを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/48eb805f-ebdc-b93b-c87b-cba1f30a0be9.png)
2. 「無題のフォーム」となっている部分がファイル名なので、「勤怠連絡」（なんでもいい）に変更しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/f5676fa0-930b-0a4a-7ad4-547d68e59cf2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/13849620-c434-d50d-17a1-62501f38d934.png)
3. 次に「無題の質問」で遅刻理由の質問項目を作っていきましょう。
「オプション１」となっているところに遅刻の理由を記載します。
「選択肢を追加」をクリックすると理由を何個も用意できます。
「その他」を追加をクリックすると自由に入力できるその他項目を用意しておくこともできます。
遅刻理由は必ずいると思うので、右下の「必須」をONにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/92544d8e-3fc5-4473-e68b-655c79ddd282.png)
4. 画面右側にある「⊕」ボタンでもう一つ質問項目を作り、休暇形式の項目を作っていきましょう。
全休、午前・午後半休、遅刻を選べるようにしておきましょう。
ここも「必須」にしておくと良いですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/58082a10-faca-9669-a3f7-4bede9af96ec.png)
5. もう一つ質問項目を作り、「ラジオボタン」となっている部分を「時刻」に変えて出勤時間の項目を作りましょう。
ここは「必須」はOFFにしておくと良いかと思います。
「電車遅延」とかは何時に着けるかわからなかったりしますしね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/f67f35e1-548d-79e2-70eb-514afbe9202b.png)
6. 次に真ん中上部に「回答」というところを押し、回答ページに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/abbfe300-1d84-be81-7cc0-7474ce93ad75.png)
7. 右側にある緑色のボタン（スプレッドシートの作成）を押し、新しいスプレッドシートを作成しましょう。これでGoogleフォームの準備は完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/c94fb81c-3f0a-80e0-ba25-2f86f68e7549.png)

### スプレッドシートに必要な項目を用意する
次にアンケートの結果を保存しておく場所に、メールのテンプレートなどを用意していきましょう！
1. 先ほどのスプレッドシートの作成が完了すると以下のようなページが開きます。
ここにアンケートの結果を保存していくので、このシートはなるべくいじらないようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/7bdf3970-53ec-7b40-9048-f4267ee380ff.png)
2. 左下の「＋」ボタンを押し、新しいシートを作成します。
「シート2」となっている部分をダブルクリックするとシート名が変えられるので「inputs」という名前にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/e264f673-6961-f4fc-883c-a0b0a89be148.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/433ec9c2-0090-d336-1931-cfc3d9c1ceca.png)
3. 「inputs」のシートにメールの送信先やメールのテンプレートを準備します。
各項目には以下の内容を入れていきます。
<dl>
  <dt>to</dt>
  <dd>メールの送信先を記載します。カンマ（,）区切りで複数のメールも指定可能。
最初は自分のメールアドレスを入力しておこう！あとで試しに動かすときに自分のメールアドレスに届いたかを確認できるようにしてます。</dd>
  <dt>cc</dt>
  <dd>メールの送信先を記載します。カンマ（,）区切りで複数のメールも指定可能。</dd>
  <dt>タイトル</dt>
  <dd>メールのタイトルを記載します。タイトルはチームや部署で共通のタイトル＋名前とかにしておくとメールフィルタしやすくて良いですね！</dd>
  <dt>送信主名</dt>
  <dd>Gmailとかでメールを受け取るとFromの部分が日本語名が入ってたりしますよね。あれをつけるための項目です。</dd>
  <dt>本文</dt>
  <dd>送信されるメール本文のテンプレートになります。
重要なのは「@遅刻理由」「@休暇形式」「@時間本文」の3か所！
ここにアンケートで入力された内容やこの後の時間本文の文章が表示されるようになります。</dd>
  <dt>時間本文</dt>
  <dd>本文にあった「@時間本文」にいれる文章のテンプレートです。
アンケートで出勤時間を入力された時だけ「@出勤時間」に出勤時間を入れて、本文に表示する処理を入れます！</dd>
</dl>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/6a6c6073-bffb-a82d-7c5c-adb5530658f5.png)
4. ここまで準備できたらスプレッドシートの準備は完了だぁ！

### スクリプトを書いてみる
最後にメールを送信する機能をGASというプログラムを使って作成していくぞ！
1. スプレッドシートから「ツール」>「スクリプトエディタ」を選択しよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/4fa18eee-721f-d326-306a-3048342a8758.png)
2. まずはこれにも名前を付けよう。
プロジェクトの名前とファイルの名前を勤怠連絡用に着けよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/48d0f518-5eb3-4faf-63c5-bbdab99cdaae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/01741b4d-cc2c-d696-307f-f4586f48a2c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/62606ee5-59bb-c345-7df7-15f4b65ab379.png)
3. 次に以下のプログラムをコピペして、Ctrl+Sキーで保存だ！
ざっくりと解説するとアンケート送信されてきたら「execute」メソッドが動かして、アンケートに入力された内容を取得します。
その後「executeAttendanceContact」メソッドでスプレッドシートに記載されたテンプレート情報にアンケートの内容を置換していきメール本文を作成して、Gmailにてメールを送信しています。

```javascript:AttendanceContact.gs
/** スプレッドシートに書き込まれたときにメール送信するためのメソッド */
function execute(e) {
  // アンケートのセットされた内容を取得する。（アンケートに記載されている文言がそのまま入ってくるよ！）
  var reason = e.namedValues["遅刻理由"];
  var subdivision = e.namedValues["休暇形式"];
  var commutingtime = e.namedValues["出勤時間"];
  executeAttendanceContact(reason, subdivision, commutingtime);
}

/** Apps Script上でテストが行うためのメソッド */
function test() {
  var reason = "テスト１";
  var subdivision = "テスト２";
  var commutingtime = "テスト３";
  executeAttendanceContact(reason, subdivision, commutingtime);
}

/** メール送信機能 */
function executeAttendanceContact(reason, subdivision, commutingtime){
  // inputsシートを取得する。
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName("inputs");

  // inputsシートから必要な項目を取得する。
  var to = sheet.getRange("A2").getValue();
  var cc = sheet.getRange("B2").getValue();
  var subject = sheet.getRange("C2").getValue();
  var name = sheet.getRange("D2").getValue();
  var body = sheet.getRange("E2").getValue();
  var timebody = sheet.getRange("F2").getValue();

  // メール本文を置換する。
  body = body.replace("@遅刻理由", reason);
  body = body.replace("@休暇形式", subdivision);

  // 出勤時間の入力がある時だけ時間本文を表示するようにする。
  if(commutingtime == ""){
    body = body.replace("@時間本文", "");
  }
  else{
    timebody = timebody.replace("@出勤時間", commutingtime);
    body = body.replace("@時間本文", timebody);
  }
  Logger.log("mail send param.[to:"+to+", cc:"+ cc+", subject:"+subject+", name:"+name+", body:\r\n"+body+"]");

  // メールを送信する。
  MailApp.sendEmail({to:to, cc:cc, subject:subject, name:name, body:body});
}
```
### テストしてみよう
4. 「test」メソッドを選択して、「実行」ボタンをクリックしよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/75f8e34d-df96-7302-480c-666529898e35.png)
2. Gmailからの承認を求められるので、権限を確認していこう。

「権限を確認」を押すと別画面でアカウントを選択する画面が表示されるので、メールの"送信元"となるGoogleアカウントを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/e7acd8b5-d1a6-2f38-cb35-3baf8ec5d0cc.png)

その後「このアプリはGoogleで確認されていません」という画面が表示されるので「詳細」>「勤怠連絡（安全ではないページ）に移動」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/38edb890-75ee-fc22-0411-33dcc561fb5e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/0a57c1d9-c200-b8a7-5d0e-a06669d992b3.png)

その後アクセスのリクエストを「許可」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/1bcbd4f5-c742-4f7e-678a-8bd71747b14a.png)
3. これでGmailが送信される準備はできたので、再度「test」メソッドを実行してみるとメールがテスト文言で送られるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/27ffbc69-a818-f96c-23c5-14c326887ad3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/5b5e9fe8-d4af-232f-02b3-be9bb1ca22cb.png)
4. 最後にスプレッドシートが書き込まれたら、先ほど作った「execute」メソッドを実行するようにトリガーを追加します。
まず左側の「トリガー」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/5a6cfcbe-bd5a-9b19-348f-b18fb9e602be.png)
右下の「トリガーを追加」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/70941790-15b5-b31c-1d67-2fe1df0de4eb.png)
「実行する関数を選択」が「execute」になっていることを確認。
「イベントのソースを選択」が「スプレッドシートから」になっていることを確認。
「イベントの種類を選択」を「フォーム送信時」に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/5046eb8a-3b32-055c-ac29-8dfe98bd357f.png)

保存ボタンを押すと先ほどのアクセスのリクエストと同じような画面（英語かも）が出てくるので、同じようにGoogleアカウントを選択→「詳細」>「勤怠連絡（安全ではないページ）に移動」を選択→「許可」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/9cf7e9eb-d73c-11b9-7c27-3315f2891461.png)
5. これで準備は完了だ！

### 実際に動かしてみよう
1. Googleフォームからアンケートフォームを携帯などのメールアドレスに送信しよう。
メールアドレスを収集するはOFFにしておこう。スプレッドシートが変わっちゃうので。
送信方法にリンクもあるので、そのリンクをブックマークなどに保存しておいても良いです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/5098b898-0e77-8331-db15-f00d2ad7ea73.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/43f95eee-ab5a-35c3-47fc-07514e612a32.png)
2. アンケートフォームを入力して送信ボタンを押すとメールが飛んでくるはず！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/8b204340-6c54-e6d2-3933-91dd98462636.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/660472c2-6419-044e-05f3-943b28621cf7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262609/f2ff9529-cd2d-7aa6-f6d5-10e19e8893c2.png)
3. 最後にスプレッドシートのtoを実際に送りたいメールアドレスに変更したら、勤怠連絡システムの完成です！

## 最後に一言
これはプログラムをやったことがない人でもぜひカスタマイズなど自分好みにしてほしいと思っています。
それにより少しでもプログラムに興味を持ってもらえればと思います！

そしたらGoogleフォームの代わりにhtmlを作ってみてWebアプリを作ってみたり、GASをデプロイしてWebAPIなどを作っていろんな人でも使えるようにしてみたりといろいろな方面に広げていけるので、これを足掛かりにプログラムを楽しんでもらえればと思います。