📧

GoogleFormsの回答をSendGridを使ってZendeskに送る

2023/01/20に公開

社内からGoogleFormsで受け取った回答をZendeskに飛ばしてほしいと依頼があったので、Sendgridを使って実現しました。

弊社では問い合わせ窓口になっているGmailでメールを受信した場合、Zendeskに自動的にチケットが作成される運用を行っているので、そのアドレスにGoogleFormsの回答を送信できれば問題なさそうです。

GASだけだとメールの送信者を自由に設定できない

このフォームでは回答者のメールアドレス入力が必須となっているので、メールの送信者を回答者のアドレスに設定すれば良いだろう、と進めていたところ、早速障害にぶつかりました。

なんと、GASのGmailAppでメールを送信する場合、送信者(送信元メールアドレス)の指定に制限がかかっており、スクリプト所有者のメールアドレスしか送信者に設定できないのです・・・。

SendgridのAPIを使おう

メールさえ送信できれば良いわけで、GmailAppにこだわる必要はありません。
ちょうど弊社ではSendgridを利用していたので、このAPIを使ってみましょう。

SendgridのAPIキーを作成

まずはSendgridでAPIキーを作成します。
メール送信の機能だけ必要なので、アクセス制限はMail Sendのみ有効でOKです。

GoogleFormsでスクリプトを作成

GoogleFormsで作成したフォームでスクリプトエディタを開き、2つの関数を作成します。
初回実行時に外部APIの呼び出しなどの権限確認が必要なので、適宜デバッグなどを実行してください。

SEND_GRID_ENDPOINT = "https://api.sendgrid.com/v3/mail/send";
SEND_GRID_API_KEY = "SendgridのAPIキー";

function sendEmailBySendGrid(to, subject, from, from_name, body_text) {
  var body = {
    "personalizations": [
      {
        "to": [
          {
            "email": to
          }
        ],
        "bcc": [
          {
            "email": from
          }
        ],
        "subject": subject
      }
    ],
    "from": {
      "email": from,
      "name": from_name
    },
    "content": [
      {
        "type": "text/html",
        "value": body_text
      }
    ]
  }
  var payload = JSON.stringify(body);
  UrlFetchApp.fetch(SEND_GRID_ENDPOINT, {
    method: 'POST',
    headers: {
      "Content-Type": 'application/json',
      "Authorization": "Bearer " + SEND_GRID_API_KEY
    },
    payload: payload
  });
}
function sendform(e) {
  // 「getActiveForm を呼び出す権限がありません(You do not have permission to call getActiveForm)」エラー対策
  FormApp.getActiveForm();
 
  // 入力項目から本文を作成
  var items = e.response.getItemResponses();
  var msg = "";
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    var q = item.getItem().getTitle();
    var a = item.getResponse();
    msg += q + ": " + a + "\n\n";
  }
  
 // 送信元の名前とメールアドレスを取得
 // items[x]のインデックスは環境に合わせて変更してください
 var sender_name = items[5].getResponse();
 var sender_email = items[6].getResponse();

  // メール送信
  sendEmailBySendGrid("送信先メールアドレス", "メール件名", sender_email, sender_name, msg)
}

トリガーを設定

あとはいつもどおりフォームの送信イベントをトリガーにsendform関数を呼べば完了です。

参考リンク

SARAH Tech Blog

Discussion