【コピぺでOK】GASでGoogleフォームで送信した内容をSlackのチャンネルに投稿する方法

GoogleAppsScript

こんにちは。まさきです。

今回はGoogleAppsScriptを使用し、Googleフォームで送信した内容を好きなSlackのチャンネルに投稿する方法をご紹介します。

Googleフォームの内容をSlackで通知を受けたいときに便利です。

スポンサーリンク

結論

ではまず結論です。

今回の結論はコードのご紹介です。

対象のGoogleフォームのスクリプトエディタを開き、以下のコードを貼り付けてください。

/*フォーム送信時に起動するトリガーに「submitForm」を設定*/
function submitForm(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 + "】: 未回答\n");
    } else {
      questionAndAnswers.push("【" + questionTitle + "】\n" + answer + "\n");
    }
  }

  /* ステップ3: 宛先、本文を決める */
  //Slackの宛先 (チャンネル)
  //★★★SlackのIncoming Webhook URLを入力してください★★★

  let url = "※SlackのIncoming Webhookで取得したURL";

  //Slackの本文
  //★★★お好きな本文に変更ください★★★
  let body = "○○フォームの回答を受信しました。\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);
}

この時にUrlFetchApp.fetchの送信先であるurlはSlackにIncoming Webhookを入れてチャンネルのURLを自分で取得して設定する必要があります。

実装はこれでOKです。

それでは、ここからは詳しい実装方法を手順に沿ってご説明していきます。

手順

Googleフォームからスクリプトエディタを開く

送信内容をSlackに送りたいGoogleフォームを開き、左上のその他から「スクリプトエディタ」を開きます。

これでGoogleフォームに紐づくGoogleAppsScriptが書けるようになります。

このままコードを書いてもいいのですが、先にSlackにIncoming WebhookをいれてURLを取得します。

SlackのIncoming Webhookを入れてURLを作成する

Incoming WebHooksとは他のアプリからSlackにメッセージを投稿するための仕組みです。

Slackを開き、対象のワークスペースでAppの「アプリを追加する」をクリックします。

Appの追加画面が開くので検索に「Incoming WebHooks」と入力し、以下のアプリが出たらIncoming WebHooksを追加します。

するとブラウザが開き、このような画面が表示されます。

Slackに追加をクリックします。

あとは画面に沿って入力してください。

投稿するチャンネル名、投稿する名前、アイコンは好きに選んでください。

合わせてWebhookのURLが発行されますので、コピーしておきます。
※後ほどコードに埋め込みます。

URLが取得できればSlack側の設定は完了です。

では準備ができたのでコードを書いていきます。

コードを書く

コードは結論でも例に挙げたソースを使用します。

スクリプトエディタに戻ります。

デフォルトでmyfunction関数がありますが、削除して以下のコードをコピーしてください。

このときurl変数には先ほどWebHookで取得したURLに書き換えてください。

/*フォーム送信時に起動するトリガーに「submitForm」を設定*/
function submitForm(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 + "】: 未回答\n");
    } else {
      questionAndAnswers.push("【" + questionTitle + "】\n" + answer + "\n");
    }
  }

  /* ステップ3: 宛先、本文を決める */
  //Slackの宛先 (チャンネル)
  //★★★SlackのIncoming Webhook URLを入力してください★★★

  let url = "※SlackのIncoming Webhookで取得したURL";

  //Slackの本文
  //★★★お好きな本文に変更ください★★★
  let body = "○○フォームの回答を受信しました。\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フォーム送信時のトリガーとして設定した関数では、引数としてフォームの入力内容を受け取れます。

今回は変数eとしてフォームの情報を受け取っており、for文を使用してeに入っている項目の名前と入力内容を取得しています。

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

  //for文(ループ)で変数itemResponsesから個々の質問と回答を取得する
  for(let i = 0; i < itemResponses.length; i++) {
    //質問のタイトルを取得する
    let questionTitle = itemResponses[i].getItem().getTitle();

    //回答を取得する
    let answer = itemResponses[i].getResponse();

関数をトリガーに設定する

では先ほど作成した関数がGoogleフォームで登録したタイミングで起動するようにGASのトリガーという機能を使用します。

GASの左側のメニューからトリガーを開きます。

トリガーの設定画面に移動したら「トリガーの追加」から新規トリガーを設定します。

設定内容はこちらです。

これで「フォーム送信時」に「SubmitForm」が起動するようになります。

今回は以上になります。

GoogleAppsScriptするならこちらの参考書がおすすめです。


詳解! Google Apps Script完全入門 [第2版] ~GoogleアプリケーションとGoogle Workspaceの最新プログラミングガイド~ [ 高橋宣成 ]

最後まで読んで頂きありがとうございました!

スポンサーリンク
GoogleAppsScript
スポンサーリンク
この記事を書いた人
まさき

25歳の社会人4年目のシステムエンジニアです。
未経験からIT企業に入社して業務や、業務外でも学習することでプログラミングが書けるようになりました。
得意なのはHTML,CSS,JavaScript。最近はVue.jsとGASを勉強中です。
本を読むことが好きなのでIT技術書以外にもたくさん読みます。
好奇心旺盛でとりあえずやってみる精神です。
楽しいことが生きがいで、仕事も私生活も楽しくなるように日々奮闘中。

まさきをフォローする
シェアする
タイトルとURLをコピーしました