😺

GoogleFormの回答をSlackへ通知

2023/12/13に公開

追記

nippologというサービスがあり、これだとGoogleAppsScriptでのコーディング不要でできた。
https://www.nippolog.com/

GASを書くよりたぶんこっちの方が楽。
下記の記事でまとめ直している。
https://zenn.dev/ritton/articles/9281ca20f37d0a


GoogleFormを作成

GoogleFormをつくる。

回答が記入されるスプレッドシートのシート名を変えておく。

Slackで通知用のWebhookを取得

Slack apiにアクセス

https://api.slack.com/apps
にアクセスし、にアクセスし、「Create New App」をクリック。(要ログイン)
※通知を送信したいチャンネルに属しているアカウントでログインしてください。

未ログインの場合は、下記からログイン。

ログイン時にデスクトップアプリが立ち上がってしまう場合、キャンセルし、ブラウザでSlackを使用を選択。
ログイン完了後、再度前述のURLにアクセスして、「Create New App」をクリック。

アプリを作成

「From Scratch」をクリック。

アプリ名と、利用するワークスペースを選択し、「Create App」をクリック。

「App Home」で、「App Display Name」の「Edit」をクリック。

「Bot Name」と「Default username」を設定。

webhookを取得

「Incoming Webhooks」を、ONにする。
「Add New Webhook to Workspace」をクリック。

通知を送りたいチャンネルを選択し、「許可する」をクリック。

Webhook URLが作成されるので、これをコピー。

GoogleAppsScriptでコードを記載

GoogleFormの回答が記載されるスプレッドシートのシートを開き、
「拡張機能」>「Apps Script」

下記のようにコードを記載。
処理の概要としては、
①特定のスプレッドシートのシートを取得。
②そのシートの一番下の行を取得し、取得したい回答が入ったセルの中身を取得。
③その項目を使って、文面を作成。
④先ほどSlackで取得したwebhook URLに対して、作成した文面を送る。
という内容。

function report() {
  /*
    スプレッドシートIDでスプレッドシートを取得
    スプレッドシートIDは、スプレッドシートのURL内の下記の~~~~~~~の部分
    https://docs.google.com/spreadsheets/d/~~~~~~~~~~~~~~~/edit
  */
  let ss = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXXXXXX");

  //回答の記録されるシート名(デフォルトは、「フォームの回答 1」のようになっているが、事前に変えておいた方がよい。)
  let sh = ss.getSheetByName("report");
  
  //一番下の行(最新の回答)を取得
  let last_row = sh.getLastRow();

  //スプレッドシートから最新の行を取得
  //最終行の左からX番目のセルの値を取得、という意味
  let name = sh.getRange(last_row,2).getValue();//担当者
  let weather = sh.getRange(last_row,3).getValue();//天気
  let content = sh.getRange(last_row,4).getValue();//報告

  //先ほどSlackで取得したwebhookURLを貼り付ける。
  const postUrl = "https://hooks.slack.com/services/XXXXXXXXX";
 
  //Slackに送信する文章を作成
  let message = 
          "【業務報告】"+"\n"
          +"担当:"+name+"\n"
          +"天気:"+weather+"\n"
          +"報告:"+content+"\n"
          +"-------------\n";

  slacksend(message,postUrl); //下記のSlackに送信するコードを呼び出し
}

//slackに送信するコード
function slacksend(text,postUrl) {
  let jsonData =
  {
     "username" : 'bot',
     "icon_emoji": ':clipboard:',
     "text" : text
  };
  let payload = JSON.stringify(jsonData);

  let options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

試しに送信する

reportという関数を選んで、「実行」を押す。

アクセス許可を求められるので、許可する。

指定したシートの一番下の行をみて、設定したSlackチャンネルに通知がされる。
※この時点では回答がないので、1行目の設問名がそのまま記載されるはず。

トリガーを設定

上記までだと、フォームが回答されたときに、処理が行われない。
フォーム回答時に、上記のreport関数を動かすために、トリガーを設定する。

「トリガーを追加」を押して、下記のように設定。
先ほどと同様に、アクセス許可を求められるので、許可する。
今回は、フォームが回答されたときに、即report関数が動くようにしているが、
毎日10時~11時の間に実行、のようにタイマーにすることも可能。
※ピンポイントで10時00分に設定することはできない。

これで完了!

Discussion