Part3🤘🏻コピペOK🤘🏻GASを使ってSlackに当番通知する生産性向上をしれっと紹介します🤪

この記事は [ex-crowdworks Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ex-cw)の22日目の記事です。

# はじめに
今年、株式会社クラウドワークスを退職した@nisyuuです。新幹線に乗ると崎陽軒の[シュウマイ弁当](https://kiyoken.com/products/category/obento/)をよく食べます。
エンジニアとしてクラウドワークステック（旧クラウドテック）というフリーランスと企業をマッチングするエージェントサービスを開発していました。

[ex-crowdworks Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ex-cw)でPart1とPart2に分けてGASを使った生産性向上を紹介してきました。

https://qiita.com/nisyuu/items/4bf85d1d73a642e0558b

https://qiita.com/nisyuu/items/24a251424b412ef283d3

今回も、GASとSlackを使った生産性改善について紹介していきます。

Part1では当番通知の作り方について解説しました。決まったタイミングに通知するような仕組みでしたが、中には担当者が必ずしも実施しない可能性のある作業もあると思います。例えば、リリースを当番制にしている場合は、リリース物がないとスキップにしたいということもあるでしょう。

そこで本記事では、作業の実施状況に応じて当番を制御する機能の作り方を紹介します。
説明は、リリース当番通知を前提に進めていきます。

# 仕組み

GASとSlackの連携は、[Slack ワークフロービルダー](https://slack.com/intl/ja-jp/help/articles/360035692513-Slack-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89)を使います。

GASでスプレッドシートからユーザー情報を取得し、ファシリテーターをSlackへ通知させます。
通知をする際にボタンを設置することができるため、ボタンが押されたら次の担当者へ通知されるようにします。ボタンが押されなければ、再度同じ担当者へ通知されるようにします。

# GASの実装

ユーザーをスプレッドシートから取得する実装や通知の実装は、[Part1](https://qiita.com/nisyuu/items/4bf85d1d73a642e0558b)で紹介しているものが再利用できるため参照してください。

再利用する関数の呼び出しは、このようになります。

```javascript
function sendSlackMessageToReleasePersonInCharge() {
  const spreadsheetId = 'xxxxxxxxxxxxxxxxxxx';
  const sheetName = '定期リリース';
  const sheet = getSheet(spreadsheetId, sheetName);
  const data = sheet.getDataRange().getValues();
  const personInChargeInfo = getPersonInChargeInfo(data);
  const webhookUrl = 'https://hooks.slack.com/triggers/xxxxx/xxxxxxxxxxxxxx';
  const payload = {
    currentSlackUserId: personInChargeInfo.current.slackUserId,
    nextSlackUserId: personInChargeInfo.next.slackUserId
  };

  sendSlackMessage(webhookUrl, payload);
}
```

次に、担当者を切り替えるための処理を用意します。

実施した担当者をチェックするのに必要なシートを作成してください。


| current_slack_user_id |
|:-----------:|
| UAEUET2N4 |

current_slack_user_idカラムには、SlackのユーザーIDが入ります。IDはSlackワークフローから送信されたものが入ります。ワークフローの設定については以降で説明します。

担当者切り替えのGAS実装はこちらです。

```javascript
function updateReleasePersonInCharge(e) {
  const activeSheet = e.source.getActiveSheet();
  
  if (activeSheet.getSheetName() !== '定期リリース実施済み者') return;

  const spreadsheetId = 'xxxxxxxxxxxxxxxxxxxxxx';
  const sheetName = '定期リリース';
  const sheet = getSheet(spreadsheetId, sheetName);
  const data = sheet.getDataRange().getValues();
  const personInChargeInfo = getPersonInChargeInfo(data);
  updatePersonInCharge(sheet, personInChargeInfo);
}
```

トリガーはスプレッドシートの値が変更されたタイミングで実行するようにしてください。
変更時に実行することで、Slackワークフローから送信されたユーザーIDがスプレッドシートへ入力されたときに自動で次の担当者が通知されるようになります。

# ワークフローの設定

[Slackの自動化](https://slack.com/intl/ja-jp/features/workflow-automation)から新しいワークフローを作成します。ウェブフックの設定からURLを発行してください。
設定時にリクエスト元から受け取るキーは、前回担当者と今回担当者のSlackユーザーIDを指定します。

前回担当者のユーザーIDは、担当者を切り替える処理のために用意したシートを更新するために必要です。
シートに値を入力する際、更新場所の指定を値指定で行う必要があるため前回担当者のIDを送信します。
今回担当者のユーザーIDは、作業を実施してもらいたい担当者を通知するために使用します。

メッセージ通知のステップにはボタンを設置できるため、「作業実施後押してください」などのボタン名で設定します。
ボタンを設置しておくと、ボタンが押された後に、メッセージ通知後に続くステップが実行されます。
スプレッドシートの値更新は、メッセージ通知の直後に設定します。
Slackワークフローには、スプレッドシートの値を更新するためのステップがあるため、追加と設定をしてください。

# おわりに

GASを使った生産性向上の紹介は、ひとまずPart3で終わります。
ぜひ、将来有望な未来ある皆様には、ここまでに紹介した内容をチームに導入していただき、日本の経済発展のために貢献いただけるとことを強く、切実に願っています。