Yuki's bnb blog

こんにちは!Yukiといいます。本業のかたわら大阪で2016年夏から民泊運営のお手伝いをしています。民泊業務に関する様々なことを自動化・効率化したいと思い日々活動しています。 お気軽にコメント・お問い合わせください :) TOEICスコア 985

【コピペでOK!】GASでGoogleフォームの回答をSlackに自動通知する方法

Google Apps Script form slack

こんにちは!
Yuki (@yukibnb) です。

今回はGoogle Apps Script (GAS) を使ってGoogleフォームの回答をSlackの指定チャンネルに自動通知する方法を紹介します。

社内向けの営業報告フォーム、経費申請フォームなどさまざまな〇〇報告・申請フォームに活用できます。

コピペでそのまま使えるよう手順を細かく紹介します。

では見ていきましょう!

memo

Googleフォームの回答をLINE通知したい方は以下の記事をご覧ください
【コピペでOK!】GASでGoogleフォームの回答を管理者に自動LINE通知する方法

 

はじめに

実現したいこと

Google Apps Script form slack

今回実現したいことはGoogleフォームの回答をSlackの指定チャンネルに自動通知することです。

管理者が所属するチャンネルに自動通知することで、管理者はGoogleフォームの管理画面を開くことなくSlack通知を読むだけで報告内容を確認できます。

 

回答者・管理者のメリット

Google Apps Script form slack

社内の報告にGoogleフォームを使用することで、回答者は報告メールなどを手入力する必要がなくなり効率が上がります。

管理者にとってはGoogleフォームの管理画面を開くことなく報告内容を確認できるので便利です。

また回答者が誰であっても決まった形式で報告を受信できるため、確認後の業務も円滑に進みます。

 

今回使用するサンプルフォーム

Google Apps Script form slack

今回使用するサンプルGoogleフォームはこちらです。

ホテルや民泊などの清掃スタッフ向けの「清掃報告」という社内報告フォームです。

名前、施設名、部屋番号、清掃完了箇所などをそれぞれ入力・選択し、回答すると管理者が所属するSlackの指定チャンネルに自動通知されるようにします。

ではいよいよ方法を見てみましょう!

 

コピペでOK!Googleフォームの回答をSlackに自動通知する方法

SlackのIncoming Webhook URLを取得する

まずはじめに宛先となるSlackのIncoming Webhook URLを取得します。

Incoming Webhook URLとはチャンネルの住所のようなものです。

Incoming Webhook URLを使用することで、特定のSlackチャンネルを宛先に指定することができます。

以下の解説記事を参考に、Incoming Webhook URLを取得してください。

 

memo

Incoming Webhook URLをすでに取得済みの方は新たに取得する必要はありません。

 

スクリプトエディタを開く

Google Apps Script form line notify

Googleフォーム管理画面を開き、次の手順でGoogle Apps Scriptのスクリプトエディタを開いてください。

  1. 管理画面右上にある[](点が縦に3つ並んだアイコン)をクリックする
  2. [スクリプトエディタ]をクリックする

 
Google Apps Script editor

するとスクリプトエディタが開きます。次の2点はお好きな名前に変更してください。

  • プロジェクト名 (「無題のプロジェクト」と書いている箇所)
  • スクリプト名 (「コード.gs」と書いている箇所)

 

スクリプトをコピペする

スクリプトエディタに以下のスクリプトをコピペしてください。

スクリプトエディタにもともと入力されていたfunction myFunction() { }は消してください。

memo

変数urlに取得したIncoming Webhook URLを入力してください。

function autoSlack(e) {
  /* ステップ1: フォームのデータを取得する */
  //すべての質問と回答を取得する
  let itemResponses = e.response.getItemResponses();

  /* ステップ2: 必要なデータを抽出する */
  //個々の質問と回答を格納するための空配列を宣言する
  let questionAndAnswers = [];

  //for文(ループ)で変数itemResponsesから個々の質問と回答を取得する
  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");
    }
  }

  /* ステップ3: 宛先、本文を決める */
  //Slackの宛先 (チャンネル)
  //★★★SlackのIncoming Webhook URLを入力してください★★★
  let url = "https://hooks.slack.com/services/xxxxx/yyyyyy/zzzzzzzz";

  //Slackの本文
  //★★★お好きな本文に変更ください★★★
  let body = "\n清掃報告フォームの回答を受信しました。\n"
           + "\n"
             //一次元配列questionAndAnswersに対してjoinメソッドを使って文字列を作成する
             //区切り文字は改行"\n"
           + questionAndAnswers.join("\n");
  
  /* ステップ4: 指定したSlackチャンネルに通知を送信する */
  //Slackを送信する
  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);
}

 

スクリプトを保存する

Google Apps Script form slack

スクリプトをコピペするとこのようになります。

画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。

 

トリガーを設定する

Google Apps Script form trigger

次にコピペしたスクリプトの関数autoSlackのトリガーを設定します。

トリガーを設定することで回答者が回答を送信した時に関数autoSlackが自動実行され、Slackに報告内容が送信されます。

以下のようにトリガーを設定し[保存]ボタンをクリックしてください。

  1. autoSlack
  2. [Head]
  3. [フォームから]
  4. [フォーム送信時]
  5. [毎日通知を受け取る]

memo

トリガー設定方法の詳しい解説は以下記事をご覧ください。
【簡単!】Googleフォーム送信時にGASを自動実行する方法

 

GASを承認する

トリガー設定画面の[保存]ボタンをクリックすると、承認を求めるポップアップが表示されます。

GASを実行するGoogleアカウントをクリックし、承認しましょう。

memo

承認手順の詳しい解説は以下記事をご覧ください。画像やGIF動画付きで詳しく確認できます。
【もう迷わない!】GAS初回実行時の承認方法

 

回答者画面から回答を送信する

Google Apps Script form slack

Googleフォームの回答者画面を開き、それぞれ回答を入力し送信しましょう。

 

指定チャンネルにSlackが自動通知される

Google Apps Script form slack

管理者が所属するSlackの指定チャンネルに無事通知されました。

通知には報告内容が含まれていますね。

これでGoogleフォームの回答をSlackの指定チャンネルに自動通知するGASの設定が完了しました!

では次にみなさん自身のGoogleフォームで自動通知を活用するためのポイントを紹介します。

 

カスタマイズのポイントを紹介

2つの関数

Google Apps Script form slack

今回使用した関数は2つあります。

autoSlacksendSlackです。

順にポイントを見てみましょう。

 

ステップ1と2

ステップ1「フォームのデータを取得する」とステップ2「必要なデータを抽出する」は当ブログの以下記事とまったく同じです。

ステップ1と2の詳しい解説は以下記事をご覧ください。

 

ステップ3: 宛先、本文を決める
/* ステップ3: 宛先、本文を決める */
//Slackの宛先 (チャンネル)
//★★★SlackのIncoming Webhook URLを入力してください★★★
let url = "https://hooks.slack.com/services/xxxxx/yyyyyy/zzzzzzzz";

//Slackの本文
//★★★お好きな本文に変更ください★★★
let body = "\n清掃報告フォームの回答を受信しました。\n"
         + "\n"
           //一次元配列questionAndAnswersに対してjoinメソッドを使って文字列を作成する
           //区切り文字は改行"\n"
         + questionAndAnswers.join("\n");

ステップ3では宛先とSlackに通知する本文を決定します。

宛先とは管理者が所属するSlackのチャンネルのことです。変数urlに取得したIncoming Webhook URLを入力してください。

変数bodyはSlack通知の本文となります。文面をカスタマイズする際には以下の点に注意して本文を置き換えてください。

  • 改行したい箇所に"\n"を入力してください。
  • 質問の内容と回答を表示したい箇所にquestionAndAnswers.join("\n")を入力してください。

変数questionAndAnswersには一次元配列形式で質問の内容と回答が格納されています。

本文に使用するには一次元配列ではなく文字列にする必要があるため、questionAndAnswersに対してjoinメソッドを使用し、questionAndAnswersの各要素を改行の区切り文字"\n"で連結し文字列を作成しました。

memo

joinメソッドの詳しい解説は以下記事をご覧ください。
【簡単!】GASで配列の各要素を連結して文字列を作成する方法

 

ステップ4: 宛先(Slackの指定チャンネル)に本文を送信する
function sendSlack(url, body) {
  let data = {
    "text": body
  }

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

   UrlFetchApp.fetch(url, options);
}

まずはじめに関数sendSlackを見てみましょう。

これはSlackの指定チャンネルに通知するための定型文のような関数です。

宛先 (url) と 本文 (body) を引数に指定することで、関数sendSlackを実行するとSlackの好きなチャンネルに好きな本文を通知することができます。

このようにSlackを送信するためだけの独立した関数を作成することで、メンテナンスが容易になるでけでなく、全く別の機会にSlackを送信したいと思った場合に簡単に使いまわすことができます。

 

/* ステップ4: 指定したSlackチャンネルに通知を送信する */
//Slackを送信する
sendSlack(url, body);

そして関数autoSlack内でsendSlack(url, body)と記述することで、関数sendSlackに変数urlbodyを渡し、関数sendSlackを実行しました。

関数sendSlackが実行されると、Slackの指定チャンネル (url) 宛てに報告内容 (body) が通知されます。

 

注意点

未回答の質問がある場合

/* ステップ1: フォームのデータを取得する */
//すべての質問と回答を取得する
let itemResponses = e.response.getItemResponses();

回答者がGoogleフォームで回答を送信すると、フォームのデータはeとなり、関数autoSlackに渡されます。

そしてeの中からすべての質問と回答を取得し、変数itemResponsesに格納します。

ただし、以下の質問タイプが「未回答」だった場合、それらの質問の内容と回答はeに含まれません。

  • ラジオボタン
  • チェックボックス
  • プルダウン
  • 均等目盛
  • 選択式 (グリッド)
  • チェックボックス (グリッド)

eに含まれないということは、for文で質問の内容と回答を取得することはできませんのでSlackへの通知にも含まれません。

そのためこれらの質問タイプを使用する場合、回答を必須にすることをおすすめします。

 

まとめ

今回はGoogle Apps Script (GAS) を使ってGoogleフォームの回答をSlackの指定チャンネルに自動通知する方法を紹介しました。

社内の〇〇報告・申請フォームで活用すると、回答者・管理者双方にとって便利になります。

次回記事もご期待ください!