イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

GASでSlackにランダムなメッセージbotを作ってみよう

新しいことやりたくなりました。

もう5月ですね。新卒2年目になりました小畑です。
新人とか言えなくなりました、ひえっ。

ってことで、新しい挑戦をしてなかったのでGASに今更手を出します。
ついでにSlackにランダムでメッセージ送れるbotにしちゃいましょう。

あれ?似た記事最近見た?

なので、前の記事とは『別な方法』で、Slackと連携させていきます。

やったこと

  1. GASでSlack投稿

  2. 投稿を定期的にする

  3. スプレッドシートに書かれているメッセージをランダムに送る

1.GASでSlack投稿

投稿までの手順は次の4つ。

  1. SlackAPIのSlackApp作成

  2. SlackAppにIncoming Webhooksを追加し、URLを取得

  3. 指定したURLにPOST

ちなみに、GASがSlackに接続するやり方は2つ程あって、

  1. GAS用のSlackAppという便利なライブラリーを使う

  2. Slackが提供している SlackAPIIncoming Webhooksを組み合わせる

今回は2を紹介いたします。
1に関しては、弊社のすももさんが書いたこちらの記事を参照してみてください。

1.のやり方参考記事:GAS入門 (シートに日付入力〜Slack通知までやってみた)
http://tech.innovation.co.jp/2018/05/02/G-A-S-Slack.html

2.のやり方参考記事:slack botをGASでつくる方法で一番楽そうなやつ
http://vaaaaaanquish.hatenablog.com/entry/2017/09/27/184352

1.1.SlackApp作成

ここにアクセスすると、Create an Appというボタンが見えると思うので、作成します。
今後はこの作成したappから投稿がされますので、画像とかいい感じに設定してあげてくださいね!

create app.png

1.2.SlackAppにIncoming Webhooksを追加し、URLを取得

incoming hook.png

画面右側、Features→Incoming Webhooksを選択。

無効から有効に変えてあげると、画面下部にAdd new Webhook to Workspaceがあるので選択。

自分のどのチャンネルに書き込みをするか選択が出来ます。

選択後にURLが発行されます。

そのURLにPOSTしてやれば、書き込みが出来るってやつですね!

1.3.指定したURLにPOST

さあ、GASの出番です。

function morningMessage()
{
  postSlack("おはよー!時間投稿だよ!");
}


// slackにメッセージを送る
function postSlack(text)
{
  var url = "https://1.2で取得したURL";
  var options = {
    "method"  : "POST",
    "headers" : {"Content-type":"application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(url, options);
}

あとは、コードを保存して画面上の三角マークからmorningMessageを動かせばOK。

2. 投稿を定期的にする

  1. 投稿用のfunction作る

  2. 編集→現在のプロジェクトのトリガーを選択

  3. 投稿したい時間を設定する

trigger.png

実際に動いているか確かめるには、

  1. 公開→ウェブアプリケーションとして導入

  2. 次のユーザーとしてアプリケーションを実行:を自分にして公開

でOKです!

3. スプレッドシートに書かれているメッセージをランダムで送る

  1. スプレッドシートを読み込む

  2. メッセージを取得してslackに送る

3.1.スプレッドシートを読み込む

スプレッドシートを読み込むのは3通り

  1. GASファイルを作る時に、スプレッドシートと紐付けて作る

  2. URLを利用して読み込む

  3. IDを指定して読み込む

今回は3を使います。2もついでに説明。
理由は1についての記事が多かったので。まあ普通は1でいいとは思います!

1.まずスプレッドシートを作成、URLを見て

のxxxxの値をメモ。
そう。IDもURLも実質同じなのです。

2.コード書きます。

function readSpreadSheet()
{
  var id = "xxxxxx";
  var spreadsheet = SpreadsheetApp.openById(id);           // スプレッドシート取得
  var sheet = spreadsheet.getSheetByName('シート1');        // どのシートを使うか指定
  var range = sheet.getRange('A3');                        // 読み込むセルを取得
  Logger.log('%s', range.getValue());
}

補足)

  1. URLでやる場合は、openById(id)をopenByUrl(url)に

  2. getRangeで(A3:A5)で範囲指定した時は、getValueはgetValuesに

  3. getValuesは、複数セルの値取得、getValueは単数セルの値取得

3.2. メッセージを取得してslackに送る

// 定期的にランダムなメッセージをslackに送り込む
function randomMessage()
{
  // シートデータ取得
  var sheet = getSheet('メッセージ');
  var range = sheet.getRange('A:A');
  var values = range.getValues();

  // 邪魔な空文字削除
  var messages = dropNullItemFromArray(values);

  // ランダムでメッセージ取得して、メッセージゴー!
  var message_number = Math.floor(Math.random()* messages.length);
  postSlack(messages[message_number]);
}

function getSheet(sheetName)
{
  var id = "xxxxxxxxxx";
  var spreadsheet = SpreadsheetApp.openById(id);

  return spreadsheet.getSheetByName(sheetName);
}

function dropNullItemFromArray(array)
{
  var new_array = new Array();
  for each (var value in array) {
    if(value != null && value != "") {
      new_array.push(value);
    }
  }
  return new_array;
}

これで、スプレッドシートに書かれた文字を、ランダムでslackに投稿するbotが出来ました!わーい!

感想

ということで、スプレッドシートに書かれた文字を、ランダムで投稿出来るbotが作れました!

ここまで出来るといろいろ応用が出来まして。

スプレッドシートに日時を書いて読み込ませると、
決まった日付のときにお知らせするリマインダーbot

スプレッドシートに友人のツイートを取得して書き込むことで、
毎時間友人の黒歴史を垂れ流す黒歴史bot

とか作れます!

最後のは真似しないでください!というか私もやりません!

こんなのが手軽に無料で作れるからGAS面白いですね。これはもっと使わないとですね。

おしまい。