Google Apps Scriptを使ってSlackBotを作ってみた。


はじめに

slackで特定の文字に反応してくれるBOTをGoogle Apps Script( GAS )で作ります。

=>ランチ候補をpostしてくれるslackbotを、Google Apps Scriptで作る

こういうのが作りたい

成果物はこちら、

仕様

  • ルーレットと送信すると登録した名前から一つslackに投稿される
  • スプレッドシートに名前を登録しておく
  • GAS上でスプレッドシートの情報を読み込み、ランダムに一件取得

目次

  1. Google スプレッドシートにデータ入力
  2. Incoming WebHooksの設定
  3. Google Apps Scriptにコード書く + デプロイ
  4. Outgoing WebHooksの設定

1. Google スプレッドシートにデータ入力

まずは、Google スプレッドシートにアクセスします。

新しいスプレッドシートを作成 => 空白 を選択して新規プロジェクトを立ち上げましょう。

そして、スプレッドシート内に次のように記述してください。

また、このスプレッドシートのURLは後で使うのでコピーして控えておいてください。

2. Incoming WebHooksの設定

まずは、Incoming WebHooksにアクセスします。

① 自分のワークスペースにログイン
② 投稿したいチャンネルを選択
③ Incoming Webhook インテグレーションの追加

次に、Webhook URLをコピーして控えておきましょう。

そして「設定を保存する」を押してください。

3. Google Apps Scriptにコード書く + デプロイ

いよいよコードを書いていきます。
まずは Google Apps Scriptにアクセスしてください。

「新しいプロジェクト」 を押して新規プロジェクトを立ち上げます。

コード.gsに以下を記述してください。
( 先ほどコピーしておいたスプレッドシートのURLとWebhook URLを使用します。 )

コード.gs
var SLACK_WEBHOOK = 'https://hooks.slack.com/services/***********/';  // Incomig Webhook URL
var SLACK_CHANNEL = '#*******'; // channel名
var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/**********';  // スプレッドシートURL
var EMOJI_ICON = ':question:'; // アイコン(slackのスタンプを使っているのでお好みで)
var BOT_NAME = 'ルーレットくん'; // BOTの名前

Array.prototype.random = function () {
    return this[Math.floor(Math.random() * this.length)]
}

function postMessage(message, hookPoint) {
  var payload = {
    "text": message,
    "icon_emoji": EMOJI_ICON,
    "username": BOT_NAME,
    "channel": SLACK_CHANNEL
  }
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload),
    "headers": {
      "Content-type": "application/json",
    }
  }
  var response = UrlFetchApp.fetch(hookPoint, options);

  if (response.getResponseCode() == 200) {
    return response;
  }
  return false;
}

function main() {  

  var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = spreadsheet.getSheets()[0];


  var messageAll = sheet.getRange(2, 1, sheet.getLastRow()-1, 1).getValues(); // getLastRow()は空白の最終行もとって来てしまう
  var messageList = [];
  var message = "";

  for (var i in messageAll) {
     messageList.push(messageAll[i][0]); //textだけ格納
  }
  message += messageList.random();

  message += "、キミに決めた!\n\n\n候補を編集する → <" + SPREADSHEET_URL + "|:memo:>";

  postMessage(message, SLACK_WEBHOOK);
}


function doPost(e) {
  if(e.parameter.user_id == "USLACKBOT"){
    return;
  }

// 今回はGAS上でキーワードを設定しているのでOutgoing WebHooksでトリガーの設定は不要 
  if(e.parameter.text.match(/ルーレット/)){
    main();
  }
}

書き終わったら「公開」ボタンを押してデプロイします。

「公開」 => 「WEBアプリケーションとして導入...」を押してください。

Project versionは「New」です。
Who has access to the appは「Anyone, even anonymous」に設定してください。

設定が終わったら「deploy」を押してください。
( この時ユーザー認証についてGoogleから聞かれる場合がありますが、「許可を確認」を押してください。 )

この、Current web app URLは後で使うのでコピーして控えておいてください。

4. Outgoing WebHooksの設定

まずは、Outgoing WebHooksにアクセスしてください。

チャンネル欄はお好みで。
引き金となる言葉は空欄、URLには先ほどコピーしたCurrent web app URLをペーストしてください。

設定が済んだので「設定を保存する」を押してください。

最後に

以上でSlackBotの作成が完了です。

ルーレットと送信してみてください。

無事にBotからメッセージが帰って来ましたか?

参考にしたサイト