( GoogleForm + SendGrid ) GoogleFormの送信をトリガにしてメールを送信する


きっかけ

子供が通う小学校では保護者グループのコミュニケーションツールとしてSlack(フリープラン)を使用しています。
毎年数十人の新入生の保護者をワークスペースに追加しなくてはなりません。

いままでは、GoogleFormで保護者の名前・お子さんの名前・メールアドレスを記入してもらい、送信がある度に手作業で送信されたメールアドレスにSlackの招待を送っていました。

しかし、フォームの送信に気づかなかったり、単に面倒だったりするので、自動化を検討することにしました。
ちなみにSlackはフリープランで運用しているので、SlackAPIで招待することはできません。というわけで、Formが送信されたら自動的にメールでSlack参加の手順を配信するようにしてみました。

SendGridに登録

SendGridは全世界で利用されているメール配信サービスです。
クラウドサービスのためアカウントを作成するだけで即日メールを
送信でき、面倒でコストのかかるメールサーバの構築は不要です。
(引用: https://sendgrid.kke.co.jp/about/)

月に12000通までは無料で配信できる。学校のPTA程度の規模でメールを配信するぐらいならFreeプランでもなんとかなりそう。

というわけで、Freeプランで登録しました。ちなみに、登録するには、簡単な審査があって、利用目的や団体のWebサイト(なければ団体が実在している事がわかるメールの送信記録)などを示す必要がありました。

メールのテンプレートを作る

まずは配信するメールのテンプレートを作ります。以下を参考に。デザインエディターを使うと簡単に綺麗なHTMLメールを作成することができます。

こんな感じ。「Slackに参加する」ボタンのリンク先をSlackの招待リンクに設定しておきます。
また、メール内のテキストには {{name}} というように二重の波括弧で括ったキーワードを埋めておきます。メール送信時にこの部分を別のワードに置換して送信するわけですね。

テンプレートを保存して、テンプレート管理画面で作成したテンプレートの Template-ID を確認しておきます。下画面のモザイクのところ。

APIキーを作る

DashBoardのメニューからSettings->API Keysを選択してAPIキー管理画面に移ります。
右上のCreate API KeyからAPIキーを作ることができます。

API Key Nameで適当な名前をつけます。 次にRestricted Accessを選び、

Mail Sendに権限を付けます。

これでキーを作成すると、画面にAPIキーが表示されます。このAPIキーはこのタイミングでしか確認できません。一度画面を閉じてしまうと、以降は二度とキーを確認できなくなるので、必ずここでキーを控えておきます。

Google Form を作る

GoogleFormを作成します。配信先のメールアドレスと名前を記入するようになっています。実際にはもう少し項目を作ると思いますが。

GoogleAppsScriptを書く

GoogleFormのメニューから スクリプトエディタ を起動して、Formから名前とメールアドレスを抜き出して、メールを配信するコードを書きます。
テンプレートを使用してメールを送信する場合のパラメータは以下を参考に。

例えば以下のコードに置き換える。(Formの特定のItemを取得するのにもっとスマートな方法はないのだろうか。)

コード.gs
const SENDGRID_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // API Key
const TEMPLATE_ID  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // Template-ID

function onSubmit(e) {
  var formResponse = e.response;
  var itemResponses = formResponse.getItemResponses();

  var name = "";
  var email = "";

  for (var j = 0; j < itemResponses.length; j++) {
    var itemResponse = itemResponses[j];

    switch (itemResponse.getItem().getTitle()) {
      case 'お名前':
        name = itemResponse.getResponse();
        break;
      case 'メールアドレス':
        email = itemResponse.getResponse();
        break;
      default:
    }
  }

  if (email!="" && name!="") {
    sendMail(email, name);
  }
}


function sendMail(email,name) {

  var payload = {
    "personalizations": [
      {
        "to": [
          /* 配信先メールアドレス */
          {
            "email": email
          }
        ],
        "dynamic_template_data":
         /* メール本文中のキーワードの置換を行う */
          { "name": name }

      }
    ],
    "from": {
      "email": "[email protected]"
    },
    /* 配信するテンプレートのTemplate-ID */
    "template_id": TEMPLATE_ID,
  };

  var headers = {
    'Authorization': 'Bearer ' + SENDGRID_KEY,
    'Content-Type': 'application/json'
  };

  var options = {
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify(payload)
  }

  UrlFetchApp.fetch('https://api.sendgrid.com/v3/mail/send', options)
}

トリガーを設定する

フォームの送信で onSubmitが呼び出されるようにトリガーを設定します。

できあがり

Formの送信から自動的にキレイめなメールが配信されるようになると、いっきに垢抜けた感じになって嬉しい。
ただ、SendGrid経由でメールを配信すると、メールの内容にもよると思いますが、フィルタリングにひっかかって迷惑メールとして分類されることがあるような気がします。
実際に運用する場合は、ユーザーにその旨伝えておくのがよさそうです。