こんにちは!
Yuki (@yukibnb) です。
今回はGoogle Apps Script (GAS) を使ってGoogleフォームの回答をSlackの指定チャンネルに自動通知する方法を紹介します。
社内向けの営業報告フォーム、経費申請フォームなどさまざまな〇〇報告・申請フォームに活用できます。
コピペでそのまま使えるよう手順を細かく紹介します。
では見ていきましょう!
Googleフォームの回答をLINE通知したい方は以下の記事をご覧ください
【コピペでOK!】GASでGoogleフォームの回答を管理者に自動LINE通知する方法
はじめに
実現したいこと
今回実現したいことはGoogleフォームの回答をSlackの指定チャンネルに自動通知することです。
管理者が所属するチャンネルに自動通知することで、管理者はGoogleフォームの管理画面を開くことなくSlack通知を読むだけで報告内容を確認できます。
回答者・管理者のメリット
社内の報告にGoogleフォームを使用することで、回答者は報告メールなどを手入力する必要がなくなり効率が上がります。
管理者にとってはGoogleフォームの管理画面を開くことなく報告内容を確認できるので便利です。
また回答者が誰であっても決まった形式で報告を受信できるため、確認後の業務も円滑に進みます。
今回使用するサンプルフォーム
今回使用するサンプルGoogleフォームはこちらです。
ホテルや民泊などの清掃スタッフ向けの「清掃報告」という社内報告フォームです。
名前、施設名、部屋番号、清掃完了箇所などをそれぞれ入力・選択し、回答すると管理者が所属するSlackの指定チャンネルに自動通知されるようにします。
ではいよいよ方法を見てみましょう!
コピペでOK!Googleフォームの回答をSlackに自動通知する方法
SlackのIncoming Webhook URLを取得する
まずはじめに宛先となるSlackのIncoming Webhook URLを取得します。
Incoming Webhook URLとはチャンネルの住所のようなものです。
Incoming Webhook URLを使用することで、特定のSlackチャンネルを宛先に指定することができます。
以下の解説記事を参考に、Incoming Webhook URLを取得してください。
Incoming Webhook URLをすでに取得済みの方は新たに取得する必要はありません。
スクリプトエディタを開く
Googleフォーム管理画面を開き、次の手順でGoogle Apps Scriptのスクリプトエディタを開いてください。
- 管理画面右上にある[⋮](点が縦に3つ並んだアイコン)をクリックする
- [スクリプトエディタ]をクリックする
するとスクリプトエディタが開きます。次の2点はお好きな名前に変更してください。
- プロジェクト名 (「無題のプロジェクト」と書いている箇所)
- スクリプト名 (「コード.gs」と書いている箇所)
スクリプトをコピペする
スクリプトエディタに以下のスクリプトをコピペしてください。
スクリプトエディタにもともと入力されていたfunction myFunction() { }
は消してください。
変数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); }
スクリプトを保存する
スクリプトをコピペするとこのようになります。
画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。
トリガーを設定する
次にコピペしたスクリプトの関数autoSlack
のトリガーを設定します。
トリガーを設定することで回答者が回答を送信した時に関数autoSlack
が自動実行され、Slackに報告内容が送信されます。
以下のようにトリガーを設定し[保存]ボタンをクリックしてください。
autoSlack
- [Head]
- [フォームから]
- [フォーム送信時]
- [毎日通知を受け取る]
トリガー設定方法の詳しい解説は以下記事をご覧ください。
【簡単!】Googleフォーム送信時にGASを自動実行する方法
GASを承認する
トリガー設定画面の[保存]ボタンをクリックすると、承認を求めるポップアップが表示されます。
GASを実行するGoogleアカウントをクリックし、承認しましょう。
承認手順の詳しい解説は以下記事をご覧ください。画像やGIF動画付きで詳しく確認できます。
【もう迷わない!】GAS初回実行時の承認方法
回答者画面から回答を送信する
Googleフォームの回答者画面を開き、それぞれ回答を入力し送信しましょう。
指定チャンネルにSlackが自動通知される
管理者が所属するSlackの指定チャンネルに無事通知されました。
通知には報告内容が含まれていますね。
これでGoogleフォームの回答をSlackの指定チャンネルに自動通知するGASの設定が完了しました!
では次にみなさん自身のGoogleフォームで自動通知を活用するためのポイントを紹介します。
カスタマイズのポイントを紹介
2つの関数
今回使用した関数は2つあります。
autoSlack
とsendSlack
です。
順にポイントを見てみましょう。
ステップ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"
で連結し文字列を作成しました。
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
に変数url
とbody
を渡し、関数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の指定チャンネルに自動通知する方法を紹介しました。
社内の〇〇報告・申請フォームで活用すると、回答者・管理者双方にとって便利になります。
次回記事もご期待ください!