見出し画像

Googleフォームの回答をGASでSlackに飛ばして、請求書作成依頼フォームを作る

みなさま今日もお疲れ様です。
スプシ芸人の金山雄星です。

今日は、社内の請求書発行フローを改善すべく、Googleフォームの回答をGASでSlackに飛ばして、請求書作成依頼フォームを作ったので、共有します。

Slackワークフローというものもある

Slack内でフォームのように決まったフォーマットで入力するには「ワークフロー」の機能があります。
これも便利なんですが、データを貯めていきたいときに心許ないので、今回はGoogleフォーム→Slackに通知という設計で作ることにしました。

具体的な手順


Slack Webhookを利用することで実現します


Slackの設定

Slack App DirectoryのIncoming WebHooksの機能を探します。

ネットに直リンクもあるのですが、Slackのワークスペース情報も含んだリンクになる?ので上手く行かないこともあるので

Slack Incoming WebHooks

とググってください。

Incoming WebHooks |Slack App Directory
のページが目的のページです。


こんなページに飛ぶので、「Slackに追加」をクリックします。


Webhookを使いたいチャンネルを選択して、


「Incoming Webhook インテグレーションの追加」をクリックすると


あっという間に、WebhookURLが発行されました。

このURLがGETできたら、Slack側での設定は完了です。

GAS

回答結果をSlackに飛ばしたい対象のGoogleフォームを開きます。



右上の団子マークから、「スクリプトエディタ」を開きます。

そこに下記のコードを貼り付けます。
(元々あるmyfunctionは全部消してください)

function notifySlack(e) {
  let itemResponses = e.response.getItemResponses();
  let questionAndAnswers = [];

  for(let i = 0; i < itemResponses.length; i++) {
    let questionTitle = itemResponses[i].getItem().getTitle();
    let answer = itemResponses[i].getResponse();
    
    if(!answer) {
      questionAndAnswers.push(questionTitle + ": 未回答");
    } else {
      questionAndAnswers.push("■" + questionTitle + "\n" + answer + "\n");
    }
  }

  let url = "https://hooks.slack.com/services/hogehoge";

  let body = "\n請求書送付依頼フォーム \n"
           + "\n"
           + questionAndAnswers.join("\n");
  sendSlack(url, body);
}

function sendSlack(url, body) {
  let data = {
    "text": body
  }

  let options = {
    "method" : "post",
    "contentType": "application/json",
    "payload" : JSON.stringify(data)
  };

   UrlFetchApp.fetch(url, options);
}


こんな感じ。
黒塗り部分に先ほど発行したSlackのWebhook URLを貼り付けてください。

これで下準備は完了です。一度保存をしておいてください。(認証を求められたら許可してくださいね)


あとはトリガーの設定です

左上の「トリガー」からトリガーを追加し

こんな感じで設定してください!
実行する関数は「notifySlack」 で、
イベントの種類は「フォーム送信時」ですね。これが肝です。


こうなっていたらOKです。

試しにフォームを送信してみてください!
予想以上にあっさり、GoogleフォームとSlackの連携ができました。



ところで、
請求書の依頼を出す際は、経理担当者のメンバーをメンションしたいのではないでしょうか?

Slack Webhookでメンションも合わせて行ってみたいと思います。

Webhookのtext内で@名前という文字をベタうちしても、実はメンションにはならず、ここでは、メンバーIDというものが必要になります。

ここにあります(言わずもがなw)

<@hogehoge>

こんなフォーマットでIDを記載すると、メンションになるみたいです。

function notifySlack(e) {
  let itemResponses = e.response.getItemResponses();
  let questionAndAnswers = [];

  for(let i = 0; i < itemResponses.length; i++) {
    let questionTitle = itemResponses[i].getItem().getTitle();
    let answer = itemResponses[i].getResponse();
    
    if(!answer) {
      questionAndAnswers.push(questionTitle + ": 未回答");
    } else {
      questionAndAnswers.push("■" + questionTitle + "\n" + answer + "\n");
    }
  }

  let url = "https://hooks.slack.com/services/hogehoge";

  let body = "\n<@hogehoge>"
           +"\n請求書送付依頼フォーム \n"
           + "\n"
           + questionAndAnswers.join("\n");
  sendSlack(url, body);
}

function sendSlack(url, body) {
  let data = {
    "text": body
  }

  let options = {
    "method" : "post",
    "contentType": "application/json",
    "payload" : JSON.stringify(data)
  };

   UrlFetchApp.fetch(url, options);
}

メンションをつけたGASコード全体がこちら。(中央あたりが少し変わってます)


これで無事、メンションも飛ばすことができました!!!
お疲れ様でした。


ご覧いただきありがとうございました!
合同会社VISION EYEでは、”ITの力で日本の中小企業を助太刀する”をモットーに、業務効率化のための社内システムの開発・データを活用したマーケティング支援を行っています。

お気軽にご相談ください!

yusei.kanayama@vision-eye.co.jp


金山



この記事が気に入ったらサポートをしてみませんか?