🐒

Slack BoltとGoogle Sheets API、Google Apps Scriptを活用したバリュー可視化ツールの作成

2024/09/25に公開

はじめに

こんにちは!
株式会社ココナラバックエンド開発グループのFです。
企業のバリューを日常業務の中で意識し、体現する行動を共有することは、チームの結束やモチベーション向上に重要な役割を果たします。今回、Slack Bolt、Google Sheets API、そしてGoogle Apps Scriptを活用して、社員がSlack上でバリュースタンプを押すと、その情報をスプレッドシートに記録し、毎朝Slackチャンネルに自動で通知を送信するアプリを作成しました。この記事では、このアプリの概要や開発の過程についてお話します。

アプリの概要

このアプリは、社員がSlackで会社のバリュースタンプを使用するたびに、そのデータを記録し、さらに毎朝その記録をSlackチャンネルに通知する仕組みです。スタンプを押すだけで、誰がどんな貢献をしたのかが見える化され、社員同士で称賛し合える環境を作ることができます。

  1. バリュースタンプの記録
    Slack上で社員が特定のバリュースタンプを押すと、その情報がリアルタイムでGoogle Sheetsに保存されます。保存されるデータには、押されたスタンプの種類や、SlackメッセージURL、押された日時などが含まれます。

  2. 毎朝のSlack通知
    次に、Google Apps Scriptを使って、毎朝定時にスプレッドシートから最新のスタンプ情報を取得し、Slackチャンネルに通知します。これにより、社員全員が毎日の始まりに、どのようなバリューが評価されたかを確認でき、互いの貢献を見える化することが可能です。

使用技術

今回は以下の技術を組み合わせて使用しました。

  • Slack Bolt: Slackアプリ開発を支援するフレームワークで、Slackのイベント(スタンプが押されたこと)をキャッチし、処理をトリガーします。
  • Google Sheets API: スタンプが押されたデータを保存し、管理するためにGoogle Sheetsを活用しました。
  • Google Apps Script: スプレッドシートとSlackを連携させ、定時の通知を自動化するために使用しました。

開発の流れ

1. Slack Boltによるスタンプの検出

Slack Boltをセットアップし、スタンプが押された際のイベントを検知する処理を実装します。具体的には以下のようなコードで、特定のリアクションイベントをキャッチすることができます。

javascript
app.event('reaction_added', async ({ event, say, context }) => {
    if (event.reaction.startsWith('value')) {
        // Google Sheet APIへのデータ保存処理
    }
});

2. Google Sheets APIを使ったデータ保存

データはGoogle Sheets APIを介してスプレッドシートに保存され、日々の記録を一元的に管理します。スプレッドシート上でデータを整理することで、誰がどのバリューを評価されたのかが簡単に可視化されます。

javascript
const { google } = require('googleapis');
const sheets = google.sheets({ version: 'v4', auth });

async function AddStampData(data) {
    await sheets.spreadsheets.values.append({
        spreadsheetId: SPREADSHEET_ID,
        range: SPREADSHEET_RANGE,
        valueInputOption: 'RAW',
        insertDataOption: 'INSERT_ROWS',
        resource: {
            values: [data.channel, data.reaction, data.permalink, data.reacting_at]
        },
    });
}

3. Google Apps Scriptで毎朝の通知を設定

通知にはGoogle Apps Scriptを活用しました。Google Apps ScriptはGoogle Sheets APIと連携が容易で、スプレッドシートに保存されたデータを簡単に処理してSlackに通知することができます。

javascript
// 昨日のデータを取得する処理
function getYesterdayData() {
  const spreadsheetId = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');
  // スプレッドシートからデータ取得
  const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(SHEET_NAME);
  const data = sheet.getDataRange().getValues();
  // カラムのインデックスを指定(reacting_atは7列目、is_deletedは5列目)
  const reactingAtColumnIndex = 7;
  const isDeletedColumnIndex = 5;
  // 昨日の日付を取得
  const now = new Date();
  const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
  const endOfYesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1, 23, 59, 59, 999);

  // 昨日のデータを保持する配列
  const yesterdayData = [];

  for (var i = 1; i < data.length; i++) {
    const reactingAt = new Date(data[i][reactingAtColumnIndex]);
    const isDeleted = data[i][isDeletedColumnIndex];

    if (reactingAt >= yesterday && reactingAt <= endOfYesterday && !isDeleted) {
      yesterdayData.push(data[i]);
    }
  }

  return yesterdayData;
}

// Slackへ通知を送信する処理
function sendSlackNotification(message) {
  const url = "https://slack.com/api/chat.postMessage";
  const token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');

  const params = {
    'method': 'post',
    'payload': {
        'token': token,
        'channel': CHANNEL,
        'text': message
    }
  };

  UrlFetchApp.fetch(url, params).getContentText();
}

Google Apps Scriptのトリガー機能を利用することで、毎日自動的に通知を送信する仕組みを簡単に構築できます。

まとめ

今回のアプリは、SlackとGoogle Sheets、Google Apps Scriptを組み合わせることで、バリューの体現やフィードバックをスムーズに行えるシステムを構築しました。自動化された通知機能により、社員の行動が日々可視化され、会社の価値観を深く理解するきっかけを作り出します。これからもこの仕組みを活用して、組織内でのコミュニケーションやモチベーションをさらに高めていきたいと思います。

さいごに

ココナラでは、新規機能の開発以外にも開発環境の改善などの取り組みにも積極的に取り組んでいます。

バックエンド開発グループ以外も部署ごとに環境の改善など取り組んでいますので、もし興味を持たれましたらカジュアル面談にお越しください。
https://open.talentio.com/r/1/c/coconala/pages/70417

募集求人については下記のリンクからご確認ください。
https://coconala.co.jp/recruit/engineer

Discussion