📞

Google Apps Script:Googleフォームから3つの宛先にメールとSlackで通知させてみた

2023/02/18に公開

目次

  1. 事の発端
  2. 流れ
  3. 実装するにあたり考えなきゃいけないこと
  4. Google Apps Scriptの内容
  5. 結果
  6. 最後に

事の発端

入社時、情シス部門用の社内のポータルサイトからお問い合わせ窓口が作られていました。
しかし、バックオフィスにはメールで連絡、口頭、SlackのDMで連絡するしかありませんでした。
無ければ作ればいいじゃない! と涼〇ハルヒの声が聞こえてきたので作りました←
※実際は上司に言われてやりました
散々擦られたネタではあると思いますが自分の備忘録としても残しておきます。

流れ

  1. 問い合わせ者が社内ポータルの問い合わせフォームに連絡
  2. 連絡後スプレットシートに内容が記載される
  3. Google Apps Script実行
  4. Slackの各部署のお問い合わせ窓口専用チャンネル、グループメールに通知、
    部門ごとに内容を確認できるスプレットシートがありそこにも記載される

実装するにあたり考えなきゃいけないこと

今回は、一つのフォームに集約して各部署に配るということをしていますので、
窓口は一つに絞っております。
しかし、会社によっては部署ごとに問い合わせで届いてほしい内容が異なったりするので
実は一つに絞ることは後からメンテナンスが大変になったりします。
今のところは必要最低限の情報があれば良いということで問題ないですが、
フォームを誰が管理していくかなども含めて会社状況に合わせましょう。

フォームの内容としては

・お問い合わせ先(ここからフォームのセクションが分岐します)
・お問い合わせ者名、部署、お問い合わせ内容(必須項目)
・スクリーンショット(任意項目)

スクリーンショットはGoogleドライブ上にフォルダが作成されますので、
各部署のグループメールなどを追加しておけば内容を確認できます。
また、Googleフォームの設定でメールアドレスは収集するようにしてください。

Google Apps Scriptの内容

Gmail

function sendMail(e){
  //送信先、送信元
  var to = "";
  //GAS作成者のアドレス
  var from = "hogehoge@gmail.com";

  //各送信先メール
  var mail1 ="busyo_1@gmail.com";
  var mail2 ="busyo_2@gmail.com";
  var mail3 ="busyo_3@gmail.com";

  // 件名、本文

  var body = "お問合せ内容";  //本文

  // 入力カラム名の指定
  var PRE="\n\n[";
  var AFT="]\n";
  var CATE_FORM_NAME = 'お問合せ先';
  var NAME_FORM_NAME = 'お名前';
  var DEPA_FORM_NAME = '部署&スタジオ名'
  var MAIL_FORM_NAME = 'メールアドレス';
  var BODY_FORM_NAME = 'お問合せ内容';
  var SCRE_FORM_NAME = 'スクリーンショット';

  var cate = e.namedValues[CATE_FORM_NAME];
  
  if(cate == "部署1"){
  to = mail1;

}else if(cate == "部署2"){
  to = mail2;

}else{
  to = mail3;

}
  var num = e.namedValues[NUM_FORM_NAME];
  body+=PRE+NAME_FORM_NAME+AFT+name;
  var department = e.namedValues[DEPA_FORM_NAME];
  body+=PRE+DEPA_FORM_NAME+AFT+department;
  var mailAddress = e.namedValues[MAIL_FORM_NAME];
  body+=PRE+MAIL_FORM_NAME+AFT+mailAddress;
  var category = e.namedValues[CATE_FORM_NAME];
  body+=PRE+CATE_FORM_NAME+AFT+category;
  var content = e.namedValues[BODY_FORM_NAME];
  body+=PRE+BODY_FORM_NAME+AFT+content;
  var screenshot = e.namedValues[SCRE_FORM_NAME];
  body+=PRE+SCRE_FORM_NAME+AFT+screenshot;
  var subject =name+"さんから問合せがありました。";
  GmailApp.sendEmail(to, subject, body, {from:from});   //メールを送信
}

Slack

※事前にWebhookの準備をしておきましょう

function sendToSlack(body, channel) {
  var url = "WebhookのURL";
  var data = { "channel" : channel, "username" : "問い合わせフォーム", "text" : body, "icon_emoji" : ":otoiawase:" }; 
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  Utilities.sleep(1000)
  var response = UrlFetchApp.fetch(url, options);
}

function sendSlack(e){
  var channelname = "";
  var body = "<!here>\nお問合せ内容";
  var PRE="\n\n[";
  var AFT="]\n";
  var CATE_FORM_NAME = 'お問合せ先';
  var NAME_FORM_NAME = 'お名前';
  var DEPA_FORM_NAME = '部署&スタジオ名';
  var MAIL_FORM_NAME = 'メールアドレス';
  var BODY_FORM_NAME = 'お問合せ内容';
  var SCRE_FORM_NAME = 'スクリーンショット';
  
 var cate = e.namedValues[CATE_FORM_NAME];
  
  if(cate == "部署1"){
  channelname = "#部署1-問合せフォーム";  

  }else if(cate == "部署2"){
  channelname = "#部署2-問合せフォーム";  

  }else{
  channelname = "#部署3-問合せフォーム";  

  }
  
  var name = e.namedValues[NAME_FORM_NAME];
  body+=PRE+NAME_FORM_NAME+AFT+name;
  var department = e.namedValues[DEPA_FORM_NAME];
  body+=PRE+DEPA_FORM_NAME+AFT+department;
  var mailAddress = e.namedValues[MAIL_FORM_NAME];
  body+=PRE+MAIL_FORM_NAME+AFT+mailAddress;
  var content = e.namedValues[BODY_FORM_NAME];
  body+=PRE+BODY_FORM_NAME+AFT+content;
  var screenshot = e.namedValues[SCRE_FORM_NAME];
  body+=PRE+SCRE_FORM_NAME+AFT+screenshot;
 
  
 Utilities.sleep(1000)
 sendToSlack(body, channelname);
}

作成が完了したらトリガーの設定を実施します。
Mail用とSlack用2つのトリガーを作成します。

スプレットシートの内容

スプレットシートは3つ用意して、query文でマスターから取り出します。
お問い合わせ先が部署1の場合はCol〇を取り出すといった内容です。

=query(IMPORTRANGE("スプレットシートのURL","フォームの回答!〇:〇←範囲指定"),"Select Col〇←取り出したい場所を指定, Where Col3 = '部署1'")

結果

Gmailで届く問い合わせ内容

Slackで届く問い合わせ内容

※undefinedは内容が取得できていない証拠なのでこれが出た場合はスクリプトを見直しましょう
下記は別でテストをしていた時の画像です↓

最後に

これを作成することによって

・お問い合わせ者が迷う必要が無い
・部内で情報共有ができる
・ナレッジが溜まる
・データを集計して色々なことに有効活用できる
・個人宛に連絡が来ることが無くなる

と他にもメリットがあったりしますが、作っていて損はないと思います。
まぁ作成してから運用し始めても同じように問い合わせてくる人はいるので、
ちゃんと問い合わせ窓口に流してあげましょう。

GASで次何作ろうかな~

次回は多分JamfPro関連記事です。

Discussion