💬

GAS で 「Slack に雑談お題投稿君」を作る

2022/12/06に公開

このエントリーはAkatsuki Advent Calendar 2022の6日目の記事です。
昨日は tomotaka-yamasaki さんの「Airtest で CLI, IDE や Device Farm, Localなど様々なテスト実行手段、環境があったとしても楽に自動テストを実行する方法」でした。
継続的なテスト実行のために、こういった環境整備はとても大事ですね!


雑談がしたい!

リモートワークで物理的な距離が離れ、雑談をする機会が少なくなりました。
ふとした、何気ない、たわいない話の重要さは語るまでも無いと思います。
雑談をしたいが、改まって雑談をしよう!と毎回声をかけるのも、何だか気構えてしまう。

そうした中、雑談のタイミングを作る方法の一つとして 「雑談用のSlackチャンネルに定期的にお題を投稿する」というものがあります。
さまざまな方から相談を頂いたので、今回はその方法を紹介したいと思います。

Slack App の作成

まずは Slackと連携するために必要な Webhook URL を取得します
https://slack.com/intl/ja-jp/help/articles/115005265063

  1. https://api.slack.com/apps?new_app=1 にアクセス
  2. 「From scratch」を選択
  3. 左のメニューから「Incoming Webhooks」を選択.
  4. 「Activate Incoming Webhooks」をOffからOnにする.
  5. 「Add New Webhook to Workspace」を押す (ここで「Request to ~」となっている場合は管理者にリクエストを飛ばす画面が表示されます)
    (ここで「botの情報が足りません」のようなエラー画面が出たら、App HomeからDisplay Nameなどを入力してください)
  6. 投稿したいチャンネルを選択して Allow を押す
  7. 「App Name」に名前、「Pick a workspace to develop your app in」に導入したいワークスペースを選択し、「Create App」を押す
  8. 左のメニューから「App Home」を選択し、「App Display Name」の Edit を押す
  9. 「Display Name」「Default username」を入力して Save を押す
  10. これで準備OKです! この 「Webhook URL」 を後ほど使います

Google Spread Sheet の作成

次は、お題の内容をスプレッドシートに記入します

  1. スプレッドシートを作成する
  2. シート名を「お題」にする
  3. A列にお題適当なを書く

Google Apps Script の作成

最後に、Google Apps Script (GAS) で スプレッドシートから Slack に投稿するスクリプトを作成します

  1. 「拡張機能」から「Apps Script」を選択
  2. コードエディタが開いたら以下のコードをコピペし、一番上の「WEB_HOOK_URL =」の右側に作成した Slack App の Webhook URL をコピペします
const WEB_HOOK_URL = ""; // ←このダブルクオーテーションの間に入れる 例: "https://hooks.slack.com/..."

function postTopic() {
  // このスクリプトが紐づくスプレッドシートを取得
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();

  // スプレッドシートから名前が「お題」のシートを取得
  const sheet = spreadSheet.getSheetByName('お題');

  // シートの範囲(A列)を取得し、その値を取得
  const table = sheet.getRange("A:A").getValues();
  console.log("table の値は→ " + table);

  // 行と列のデータになっているので、列だけのデータにする
  const array = table.flat();
  console.log("array の値は→ " + array);

  // 空白が混ざっているので、空白をフィルターする
  const topics = array.filter(Boolean);
  console.log("topics の値は→ " + topics);

  // 取得した中からランダムで一つ選ぶ
  const topic = topics[Math.floor(Math.random() * topics.length)];
  console.log("topic の値は→ " + topic);

  // 選んだ単語をslackに投稿する
  const message = `お題は「${topic}」です!`
  const options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : `{"text":" ${message} "}`
  };
  UrlFetchApp.fetch(WEB_HOOK_URL, options);
}

試してみる

では実際にコードを動かしてみましょう!
実行のために権限を許可する必要があります。
※ 意図しない権限を「許可していいですか?」と聞かれたら許可をしないようにしましょう
特に Google Drive を全部いじれちゃうよ! みたいな強すぎる権限は、会社で使う場合はお近くのエンジニアまで!

  1. 実行ボタンを押す
  2. 「権限を確認」を押す
  3. スプレッドシートと外部接続(Slack)への権限を確認し、「許可」を押す
  4. slack に投稿されたら成功!

定期実行を設定

あとは定期的に動かすように設定するだけです!

  1. 左のメニューから「トリガー」を選択
  2. 「トリガーを作成」を押す  
  3. 「イベントのソース」を「時間主導型」、「トリガーのタイプ」を「日付ベースの」、「時刻」を投稿したいタイミングに設定し、「保存」を押す
  4. 指定した時間の範囲で投稿されたら成功!

おわり

こういった雑談ネタを提供するサービスもありますが、自作すると柔軟にカスタマイズできるのが良いですね。

  • 内容
    • 自分のプロダクトに関係するお題
    • Tips
    • クイズ
    • 大喜利
    • 定期確認
  • システム
    • 投稿するタイミングや数
    • ランダムではなく この日はこのお題
    • などなど

明日のAkatsuki Advent Calendar 2022は otofune さんの「GitHub Actions でコミットの status checks を取る」です!

最後に、アカツキでは一緒に働くエンジニアを募集しています。
カジュアル面談もやっていますので、まずは雑談からいかがでしょうか。
https://hrmos.co/pages/aktsk/jobs?category=1220948640529788928

Discussion