見出し画像

Slackワークフローの活用術「残業管理と退社検知」

チームで導入したslackワークフローの活用事例を紹介しようと思います。
1つ前の記事でも同じ仕組みを使った「未回答質問を見逃さない方法」も公開しています!

では、「残業管理と退社検知」について紹介していきます。




何をしたのか

  • slackで「残業申請」をされた方で「残業中」の方を通知させる

なぜ導入したのか

  • 問題

    • オンラインで業務を行うため、誰がどのような状態なのか把握困難

      • パートナーの残業状況の把握に時間を要す

  • 課題

    • 誰がいつどの程度残業をするのかを把握する

    • 誰が残業で残っているか(退社できたか)を把握する

どう解決したか

  • 以下の3点を活用し「通知」の仕組みを導入した

    • Slackワークフロー

    • スプレッドシートのGAS

    • chat GPTA

仕組みの全体像

残業通知は19:00~21:00、30分間隔で専用チャンネルへ通知

導入までの全体像

  1. Slackワークフローで※WebhookのURLを発行する

  2. ワークフローから取得した情報を蓄積するスプレッドシートを作成する

  3. 作成したスプレッドシートに※GAS(Google Apps Script)を組み込む

  4. 専用のワークフローを作成する

    1. 勤怠報告専用のワークフローを作成

      • スプレッドシートの情報を「追加」するステップを設ける

    2. 残業報告専用のワークフローを作成

      • スプレッドシートの情報を「更新」するステップを設ける

    3. 日報報告専用のワークフローを作成

      • スプレッドシートの情報を「削除」するステップを設ける

※用語解説
「Webhook」とは、Web アプリケーションやサービスなどの更新情報を他のアプリケーションへ特定のイベント等が発生した際にリアルタイムで HTTP プロトコルを使用して通知するシステム

「Google Apps Script(GAS)」とは、Googleによって開発されたスクリプトプラットフォームである軽量のアプリケーション開発のためのGoogleのワークスペースプラットフォーム。 主にGoogleのサービスを自動化するスクリプト言語である。

前提

今回の残業状況通知は、所属するチームの既存運用をベースに検知の仕組みを取り入れることができないかを検討した事例です。※既存運用=「勤怠報告」「残業報告」「日報報告」の3つのワークフローはそれぞれ活用をしている状態
検知のために3つのワークフローを取り入れることは少し手間なので参考程度に複数のワークフローを跨ぐ事例がある気づき・既存運用に紐づけて検知の仕組みを導入できないか検討してみようという際のヒントにできればと思います。(勤怠、残業、日報など可視化を検討されている方は是非これを気に導入すると3つを跨いだ検知がそのまま活用できます)

導入手順

【ステップ1】SlackワークフローでWebhookのURLを発行する

  1. slackよりワークフロービルダーを開く

  2. 「レガシーワークフロー」のタブで「テンプレート」を選択

  3. 「ゼロから始める」で「作成」を選択しワークフローに名前を付ける(例:残業チェッカー)※通知時表示

  4. ワークフロー開始方法選択画面で「Webhook」を選択

  5. 「変数を追加する」を選択し以下の情報を入力

    • キー:text

    • データータイプ:テキスト

  6. 「終了」→「次へ」を選択

  7. 「ステップを追加」を選択し「メッセージを送信」を選び、条件一致の際Slackに流すメッセージと送信先を入力し「保存する」で進む

  8. 以下のような準備ができた場合、右上にある「公開する」ボタンを選択

  9. 最後に表示された「URL」をコピーして保存

8.ワークフローのステップ画像

【ステップ2】chatGPTにスクリプトを書いてもらう

ChatGPTに実施したいことを伝えると高い精度でスクリプトを作成してくれるため、基本的な知識や経験もほとんど不要です。質問や指示を繰り返してゴールに導きましょう。

  1. chatGPTを立ち上げて実施したい内容を聞く

    • 実施したいこと

      • スプレッドシートの特定列に情報がある場合slackに通知させる

      • 以下を参考にする

chatGPTに聞く内容例
スプレッドシートの情報をslackへ通知させます。スプレッドシートの〈指定セル〉に情報が入っていた場合(指定セル)の情報をSlackへ通知させ、〈指定セル〉に情報が入っていない場合は何も通知させないGASのスクリプトを書いてください。

chatGPTの回答

【ステップ3】スプレッドシートを作成しGAS(Google Apps Script)を組み込む

  1. スプレッドシートを準備

  2. ワークフロー利用予定者全員へスプレッドシート権限を付与

  3. A1~B3のセルへ情報を追加する表題として「対象者」「退社時間」「対象者アドレス(検索用)」と入力

  4. ツールバーより「拡張機能」→「Apps Script」へアクセス

    1. 「コード.gs」へステップ2で作成した通知用のスクリプトを貼り付け保存ボタンを押下。(実際に活用しているGASは当ステップの最後に記載します。)

  5. 左のバーにある「トリガー」を設定

    • 実行する関数を選択:sendNotificationToSlack

    • デプロイ時に実行:Head

    • イベントのソースを選択:時間主導型

    • 時間ベースのトリガータイプ:分ベースのタイマー

    • 時間の間隔:15分おき

〈参考(実際に利用しているGAS)〉

  • 上記のchatGPTに追加要望をだし、実際のスクリプトは以下条件です。

    • 氏名と退社見込み時間のセル情報をslackへ通知する

    • 情報がない場合は通知しない

    • 19:00~22:00の時間のみ通知

    • 氏名表記になっていれば通知

    • メールアドレス表記になっていたら通知しない

function sendNotificationToSlack() {
  var now = new Date();
  var startHour = 19; // 通知を開始する時間(19:00)
  var endHour = 22;   // 通知を終了する時間(22:00)

  // 現在の時間が通知の開始時間から終了時間の間であるかチェック
  if (now.getHours() === startHour && now.getMinutes() >= 0 && now.getHours() <= endHour) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    var range = sheet.getRange("A2:B50");
    var values = range.getValues();
    
    // 氏名とメールアドレスを格納するための配列
    var names = [];
    var emails = [];

    for (var i = 0; i < values.length; i++) {
      if (values[i][0] && values[i][1]) {
        // A列がメールアドレスの場合
        if (isValidEmail(values[i][0])) {
          emails.push(values[i][0] + ": " + values[i][1]);
        } else {
          // A列が氏名の場合
          names.push(values[i][0] + ": " + values[i][1]);
        }
      }
    }

    // Slackに通知する
    var★取得したWebhookのURLを入れる★ slackWebhookUrl = "k";
    var payload = {
      text: names.concat(emails).join("\n") // 氏名の情報とメールアドレスの情報を結合して表示
    };
    var options = {
      method: "post",
      contentType: "application/json",
      payload: JSON.stringify(payload)
    };

    UrlFetchApp.fetch(slackWebhookUrl, options);
  }
}

// メールアドレスのバリデーションを行う関数
function isValidEmail(email) {
  // 実際のバリデーションロジックはプロジェクトの要件に応じて変更が必要かもしれません
  // ここでは簡単な形式のバリデーションとしています
  var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

【ステップ4-1】事前に用意されたワークフローに「追加」「更新」「削除」ステップを組み込む「勤怠報告専用」編

  • 勤怠報告専用は当日の勤怠を報告するワークフロー

    • チームでは「出勤」「出社」「欠勤」「遅刻」「早退」のスタンプを準備しており専用のスレッドにスタンプアクションをすることでそれぞれに必要な情報を「フォーム」送信→「メッセージ」送信する仕組みを導入しています。

  • ワークフローで報告することで情報をスプレッドシートに蓄積します

    • 検知にあたりこのステップで最低限必要な事は【A:当日の出勤がわかる】こと。本来は勤務状況把握のために活用しています。

    • 以下のステップでスプレッドシート「追加」を組み込む

      1. スプレッドシート:ステップ3で作成したスプレッドシートを選択

      2. シート:同上

      3. 列:「対象者」

        • 値:リアクションしたメンバーのEメールアドレス

      4. 列:「対象者アドレス(検索用)」

        • 値:リアクションしたメンバーのEメールアドレス

【ステップ4-2】事前に用意されたワークフローに「追加」「更新」「削除」ステップを組み込む「残業報告専用」編

  • 残業報告専用は当日の退社見込み時間を事前に報告するワークフロー

    • チームでは定時をすぎる場合は「残業」のスタンプを準備しており専用のスレッドにスタンプアクションをすることでそれぞれに必要な情報(退社見込み等)を「フォーム」送信→「メッセージ」送信する仕組みを導入しています。

  • ワークフローで報告することで情報をスプレッドシートに蓄積します

  • 検知にあたりこのステップで最低限必要な事は【B:誰が残業するかわかる】こと。本来は勤務状況把握のために活用しています。

    • 以下のステップでスプレッドシート「更新」を組み込む

      1. スプレッドシート:ステップ3で作成したスプレッドシートを選択

      2. シート:同上

      3. 検索する列を選択する:「検索値(アドレス)」

      4. 検索するセルの値:「メッセージにリアクションしたユーザー(アドレス)」

      5. 変更後の値:以下

        • 対象者:メッセージにリアクションしたユーザー(氏名)

        • 退社時間:退社見込み

        • 検索値(アドレス):メッセージにリアクションしたユーザー(アドレス)

【ステップ4-3】事前に用意されたワークフローに「追加」「更新」「削除」ステップを組み込む「残業報告専用」編

  • 残業報告専用は当日の業務時間や勤務状況を報告するワークフロー

    • チームでは退社時に専用のワークフローを利用し当日の業務時間(何にどれだけ時間を要したか)や勤務状況(何をしたのか等)やフリーコメント(個人に対するアウトプット)を「フォーム」送信→「メッセージ」送信する仕組みを導入しています。

  • ワークフローで報告することで情報をスプレッドシートに蓄積します

    • 検知にあたりこのステップで最低限必要な事は【C:日報を登録したかわかる】こと。本来は勤務状況把握のために活用しています

    • 以下のステップでスプレッドシート「削除」を組み込む

      1. スプレッドシート:ステップ3で作成したスプレッドシートを選択

      2. シート:同上

      3. 検索する列を選択する:「検索値(アドレス)」

      4. 検索するセルの値:「このワークフローを利用した人(アドレス)」

【ステップ4-4】まとめ

【ステップ5】通知が正常に動作しているかチェックする

  • 残業通知

通知により、現時点で誰が残っているか確認可能になりフォローのスピードも上がりました!サイコー!

もっといい方法模索するぞ~


この記事が気に入ったらサポートをしてみませんか?