非エンジニアがSlackワークフロー×GoogleスプレッドシートでカンタンIssue管理システムを作成＆運用した話

# この記事の概要
- この秋にあるサービスの社内CRMをSalesforceに切り替えるプロジェクトを動かしていました。
    - 2018年から一部チームでの導入を実施していましたが、今回はサービスに関わる全チームのCRM切り替えです。
- 切り替え後は1か月半を不具合対応・質疑応答のフォロー期間と設定していました。
- その期間中、リアルタイムでレスポンスできるよう、社員からの問い合わせをslackで受け付け、進捗管理をスプレッドシートで行っていました。<br><br>
- リアルタイムなレスポンスの結果、<br>**発生した不具合の51%は当日中に、80%は1週間以内に、90%は10日以内に解消** する事が出来ました。<br><img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/6ea7d920-11d2-c2ab-39ec-9e3ee84a14a4.png">
- この記事では、エンジニアでなくても30分で作れたその仕組みを共有します。

# 前提
### GitLab/GitHubは使わないのか？
- 気になるところだとも思いますので、少し長めに説明します。
- 本来、対応管理やIssue管理は、GitLab/GitHubを使うべきだと思いますが、今回の事例は「新ツール導入」に際する問い合わせ管理にフォーカスしています。
    - 新システム導入初期の一時的なIssue管理であるとご留意頂けると幸いです。<br><br>
- 通常、弊社もGitLabを用いたIssue管理を行っていますが、管理者が起票するフローになっています。
    - 「新ツール・新システム導入」で発生する不具合は、実際のCRM利用者が気づいてから修正対応するまでのリードタイムが短くあるべきです。よって、管理者の起票を待つ余裕はありません。
        - とすると、GitLabでの管理は**CRM利用者が新ツール（Salesforce）導入に合わせてさらなる新ツール（GitLab）の使い方を覚える**必要があり、これは現実的ではないと判断しました。<br><br>
    - 日常的に使うSlackからGitLabに自動起票されるような仕組みはどうか？も検討しましたが、プロジェクトチームは全員開発をしていたので、開発過渡期に保守・運用期に向けて仕組みを構築する専任担当を置くほどのリソースはありませんでした。
        - 先のことを考えるのはプロジェクトマネージャーのミッションです。
            - よって私が考え、私が出来得る手段で実装することにしました。
                - ただし、私もごりごりのSalesforceフロー開発担当だったので、**問い合わせ管理のシステムは必要最低限で（しかも息抜き程度で）整備しよう**、と心に決めていました。
            - 今後同じ進行を行うのであれば、プロジェクトの始動段階で「CRM利用者が気軽に起票→その内容がGitLabに転送される→GitLabでのIssue管理が叶う」ようなフロー開発のタスクを入れると思うので、PMとしての反省点でもありますね "(-""-)"＜ もっと余裕をもたねば。


### 作ったひと
- 私は（残念ながら）エンジニアではありません。
    - よく「ビジネスサイド」「企画部門」と置かれるようなポジション・キャリアです。
    - ただ、企画を考えるよりも、その企画を動かす枠組みや仕組みを考えるほうが好きなタイプです。<br><br>
- 私が自分で何か仕組みを開発したいなーと思ったときに使える手札は<br>「**スプレッドシート関数**」<br>「**簡単なGAS**」<br>「**Slackワークフロー**」<br>「**Salesforceフロー**」です。
- 今回の話は、私が自分の持つ手札で仕組みを作った話です。<br><br>
- エンジニアじゃないけど業務が自然と回る仕組みを作るの好きなんだよなあ、<br>という人のお役に立てれば幸いです。

# 作ったもの

- 前置きが長くなりましたが、ここからは実際に構築した内容について説明します。

## 全体像

- 不具合報告→修正対応→確認依頼→確認完了、までの一連の流れを作りました。
- 弊社内のコミュニケーションツールはSlackなので、気軽に×すぐに問い合わせができる場所として、Slackチャンネルを起点にすることにしました。

```mermaid
sequenceDiagram
%%{init:{'theme':'forest'}}%%
    participant user as 不具合発見者<br><br>（問い合わせチャンネル）
    participant staff as Salesforce管理者<br><br>（管理者チャンネル）
    Note over user: フォーム送信
    user->>staff:不具合内容が通知される
    Note over staff: 「対応を引き受ける」ボタンを押す
    staff-->>user:対応者が通知される
    Note over staff: 「対応完了」ボタンを押す
    staff->>user:確認依頼が通知される
    Note over user: 「確認完了」ボタンを押す
    user->>staff:確認完了が通知される
```

## 詳細

### フォームの送信
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/33f1670c-463c-d9de-3f6f-48daf298ff8e.png">


- Salesforceを利用する社員が集まるSlackチャンネル（以下、問い合わせチャンネル）に<br>ワークフローをリリースしました。<br><br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/114ca5b4-fc76-2eef-9aab-10945eac17a2.png">


- まず、不具合を発見した社員がここを押すと↓のフォームが立ち上がります。<br><img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/93f4cc7d-3224-08af-b0b5-9be925ad459a.png">

- 選択肢はこんな感じです。

| 種別 | 重要度 |
|:-----------|:------------|
|<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/9f3daebb-12d0-7b22-5d5b-7012f3c87edb.png">|<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/e9ca26d4-39ec-796d-a1b9-53454b4e75e5.png">|


### 不具合内容の通知・修正対応者の確定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/bc304c2e-5dd3-0fc6-bfb0-6f9be9ca26c5.png">

- フォームが送信されると、
    - 問い合わせチャンネルにはこの確認用メッセージが届き、<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/563a23a7-cdda-0516-f51a-41e5c9b2a31e.png">
    - 管理者チャンネルにはこの通知用メッセージが届きます。<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/4d4e4569-a6ae-fd9b-58b3-f2151fa7a838.png">

- 管理者チャンネルで、対応できるスタッフが **「対応を引き受ける」ボタンを押します。**

### 担当者の通知
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/ce67604a-82bb-0367-a987-4f9f3269091b.png">

- 先ほど、問い合わせチャンネルに届いた **確認用メッセージのスレッド** に、<br>対応者が確定した事が通知されます。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/cb7f8421-440a-81ec-7b94-96e526661563.png">
- このとき、対応者がメンションされているので、<br>対応者はこのスレッドで不具合発見者と情報交換をします。

### 対応完了の通知

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/00da26d6-4eeb-dd96-1444-9baa1ff5d4aa.png">

- 対応者の通知がされると同時に、管理チャンネルのスレッドには<br>対応完了後に対応ボタンを押すよう指示が飛びます。
- 対応者は不具合を確認し、修正が完了したら、この「対応完了」ボタンを押します。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/c61280f6-cbec-ad77-4cd4-3ec14e82fb9e.png">

### 確認依頼の通知・確認を完了する

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/3685053f-f9bf-ce09-1ff4-23245a760044.png">

- 「対応完了ボタン」が押されると、<br>問い合わせチャンネルに届いた **確認用メッセージのスレッド** に<br>対応完了通知が送信されます。
- 手元の画面で、修正が反映されている事を確認した不具合発見者は、<br>「確認した」ボタンを押します。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/75b2b899-df9d-70b1-41cf-560699b9493b.png">

### 確認完了を通知する
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/f02e5c2b-9986-5f5d-2f9a-08bf4576cae7.png">

- 確認完了ボタンが押されると、管理チャンネルのスレッドに完了報告が通知されます。
- これで一連の流れは終了です。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/0d8c06fd-eace-038a-e9ab-58585f5c96ee.png">

## Issueの管理

- Slackで報告された不具合は、「Issue」としてスプレッドシートで管理していました。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/6b261421-040b-66e4-709f-a35b900e548e.png)
- フォームを送信すると、スプレッドシートの新規行が作成されます。
- そして、Slackのメッセージに配置された各ボタンを押すと、状況が更新されるようにしていました。
```mermaid
sequenceDiagram
%%{init:{'theme':'forest'}}%%
    participant user as 不具合発見者<br><br>（問い合わせチャンネル）
    participant staff as Salesforce管理者<br><br>（管理者チャンネル）
    participant sheet as SpreadSheet<br><br>（Issue管理シート）
    Note over user: フォーム送信
    user->>sheet:Issueが状況「新規」で起票される
    user->>staff:不具合内容が通知される
    Note over staff: 「対応を引き受ける」ボタンを押す
    staff->>sheet:対応者が記入され、状況が「確認中」に更新される
    staff-->>user:対応者が通知される
    Note over staff: 「対応完了」ボタンを押す
    staff->>sheet:状況が「確認待ち」に更新される
    staff->>user:確認依頼が通知される
    Note over user: 「確認完了」ボタンを押す
    user->>sheet:状況が「確認完了」に更新される
    user->>staff:確認完了が通知される
```

- Issue管理では、ステータスの更新が手動であることが多く、<br>状況が最新になっているかを確認しなければならないときがあります。
- この場合は、Slackの会話のなかにステータスの更新を組み込んでいるため、<br>**常にIssueの状況が最新の状態に保たれる点**が便利でした。<br><br>
- 毎日の朝会では、このスプレッドシートを見て、
    - 対応者が確定していない、浮いているIssueはないか。
    - 対応が完了していないIssueはどれか。
    - 確認が終わっていないIssueはどれか。
- をチームで確認すればOKだったので、<br>スプレッドシートのフィルタを使い、対応漏れがない状況を作る事もできました。

# 必要なもの
- スプレッドシート
- Slack
    - Slackアプリケーション「Google Sheets for Workflow Builder」
    - Slackワークフロービルダー
        - ワークフロービルダーを使うためには有料プランが必要です。<br><img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/ca7b09f7-bfd2-426e-9ac4-fab06d412f73.png">


# 作り方

- 今回のワークフローは「ショートカット」です。<br><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/516e59f7-d65e-928d-d81a-cf66e0ed0c20.png">

- 作ったワークフローはこのようになっています。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/3a479df7-0326-0380-6d70-944d546e218b.png">

- Slackアプリケーション「Google Sheets for Workflow Builder」では、<br>Slack上から、「Add」「Update」「Delete」を行う事ができます。
- 今回は「Add」と「Update」を使っているので、その内容も載せておきます。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/c9eeef9a-28e9-ee61-2fa5-842bc39b96ee.png">

|Add a SpreadSheet row|Update a  SpreadSheet row|
|:-----------|:------------|
|<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/d4232c7a-5f6b-0eb5-f226-f9c4c77c8392.png">|<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/6a92e818-f461-c2e7-6d9d-d8fcc83aafe4.png">|


# この仕組みを運用した結果

- リアルタイムでやり取りを重ね、状況を更新し続けることで、<br>**発生した不具合の51%は当日中に、80%は1週間以内に、90%は10日以内に解消** する事が出来ました。（再掲）<br><img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224146/6ea7d920-11d2-c2ab-39ec-9e3ee84a14a4.png">

- スピードだけでなく、数をこなす事にも寄与したため、<br>1か月半のフォロー期間の間、大小ありますが、**1人平均28件** の対応を行いました。
    - 私たちのSalesforce導入は自社CRMと併用する事が前提なので、Salesforce以外の不具合対応も含みます。
    - また、同じ仕組みで「質疑応答」も受け付けていたため、1人平均28件の内訳には「質問への回答」も含んでいます。（グラフには含まれていません）
    - このあたりの奮闘記もまた別で記事として起こせたらなあと思っています。

- 不具合は出ない事がもちろん最適だと思いますが、<br>初めてのCRM移行で想定できない事態が起こる事は容易に想像できていました。
- 不具合が起こることを前提に、いかにスピーディに解決できるかに舵を切り、<br>事前に対策を講じられた事は大変良かったと思います。

# Slackワークフロービルダーについて思う事
- Slackのワークフロービルダーは、条件分岐が指定できないため、直線的なフロー作成に適しています。
- 外部からのトリガーをフローに取り入れる事もできないので、例えば、スプレッドシートで状況を「〇〇」に更新したらSlack通知する、という処理もできません。
    - そのような処理を取り入れたい場合は、GASを書いてフロー外で動かす事になります。
- 業務やフローをシンプルにする強制力が働いて良いと思う反面、<br>どうしても条件分岐や書き戻し処理があったらな‥と思ってしまいます。(笑)


# 一番避けたかった事
- リリースしたあとに、**問い合わせがチーム個々人にダイレクトで入る** 事だけは<br>プロジェクトマネージャーとして絶対に避けたいと考えていました。
    - リソースのマネジメントやヘルプもできませんし、ノウハウもたまらないからです。
- 次に避けたかったのは、 **Slack上の会話から修正対応が自然発生してしまう** ことでした。
    - ぬるっと引き受けた対応は、誰にも管理されることなく、ぬるっと進行してしまいます。
    - 管理体制を徹底すべく、 **フォームから起票されないものは対応しない**、という統制をとるべく、<br>問い合わせフローを一本化する事にしました。
- ここまで管理体制を敷いたのは、不具合が治らないツールは使われなくなるという前提があったからです。
    - 頑張って切り替えたCRMが使われなくなり、社員のローカルPCにCRMに書くべきデータが保存されていく未来ほど最悪なシナリオはありません。
- 信頼され、使われるCRMになるには、**リリース後の問い合わせは徹底管理・即時全件対応**が必須だと考えていたので、少工数で作った割には効果があってよかったなと思っています。
    - CRMを導入する事がゴールではないので、プロジェクトはまだまだ終わりませんが。


# 補足
- この仕組みのよいところは「スレッドに情報がまとまるところ」でした。
    - 問い合わせ起票者と担当者をメンションをつけることでスレッドに集め、情報のやりとりが行われて行きます。Slack内で起票・更新・情報のやりとりが簡潔するのはとても良かったと思います。
        - スプレッドシートの情報からSlackの検索をすれば、スレッドでその内容を確かめる事も可能でした。
            - ヘルプをするときに役立ちます。
    - また、学習コストが低いのもよかったです。
        - 特に説明をしなくても問い合わせが発生し、対応が進んでいたのは、私からすると不思議な気持ちでした。管理者・CRM利用者双方からこの仕組みの使い方の質問が来るかと思っていましたが一切来ませんでした。感覚を言葉にする事はまだ出来ていませんが、「直感で使える」仕組みってこういうことかと思いました。<br><br>
- この仕組みの良くないところは「問い合わせチャンネルと管理チャンネルの２つのチャンネルを混同しやすい」というところでした。
    - 対応者が「対応を引き受ける」ボタンを押し、そのまま、管理チャンネルのほうで質問を始める、という場面が何度も発生しました。管理チャンネルには問い合わせた社員は入っていないので、気づく事ができません。
        - チャンネルは１つにすべきだったか‥？いや、管理側だけで情報をやり取りする場合もあり、そのときは通知が邪魔になるだけだし‥と運用終了の最後まで悩みの種でした。 <br><br>
- また、冒頭でも述べましたが、この仕組みは暫定的なものだとも考えています。
    - 短期間で、さっと問い合わせ管理の仕組みを立ち上げたい場合には有効だと思いますが、恒常的に使うものではありません。我々も問い合わせ数がひと段落した後は、GitLabにIssue管理を移しました。
    - スプレッドシートはあくまでも表計算のツールですし、スプレッドシートの行やSlackのスレッドをバージョン管理やGit管理に紐づけることは無理があります。
    - システム運用なので、Issueはリリース対応とセットで管理すべきだと思います。

# 今後の発展
- とはいえ、Issueの起票は、Salesforceを利用する社員（ビジネスサイド）からすると少し敷居が高いのも事実です。
    - 網羅的に仕様にまつわる情報を書き記さなければと、躊躇してしまう気持ちもわかります。（私がそうだからです）
    - Slackは、そういった心理的ハードルを下げていた側面もあるかもしれません。
- そのため、最近は、IdeasAnyWhereというAppExchangeを試験的に導入しています。
    - IdeasAnyWhereについては、参考にさせていただいている記事がありますので、そちらの紹介に留めさせていただきます。
    - 試験的な導入を経て、いつか記事にできたらいいなあと思います。

https://dev.classmethod.jp/articles/ｓalesforce-ideas-anywhere/


### 業務効率を上げる仕組みづくりを追求したい

- 私のプロジェクトチームは、エンジニアサイドとビジネスサイドが融合したチームです。
:::note info
タイトルの「非エンジニア」や、「エンジニアサイド」「ビジネスサイド」という区分けはポジショントークに陥りやすそうで、使いたくないなーと思っていますが、良い表現を2年考えても見つからないので便宜上使用しています。
:::
- ビジネスサイドはエンジニアリングを学び、エンジニアサイドはビジネスを学び、双方が歩み寄ってSalesforceとTableauを用いた業務効率化・オペレーションの改善・データ活用に邁進しています。
    - 常日頃GUIやノーコードでプログラムを組むときにも、保守観点やノウハウ共有の観点など、エンジニアリング独特の視点で指摘やアドバイスを貰うことができるため、安定して長期運用できる仕組みづくりのノウハウが身についてきたように思います。
    - だからこそ、エンジニアリングの効率化が叶う仕組みをチームに提供出来た事は、私にとって少しの恩返しができたかのような気持ちです。（おこがましい）
        - アドベントカレンダーに参加して4年目ですが、これまでの記事より、だいぶシステマチックななんちゃって開発になっていると思います(笑) 有難い環境であります。
- これからもビジネスサイドとエンジニアサイドが歩み寄り、一緒に業務を見直し、一緒に仕組みを作りあげる事で、さらなる事業発展・顧客価値の創造につなげていきたいと考えています。<br><br>
- そんな私のボスであり、尊敬するエンジニアである @kakakaori830  は、現在、アドベントカレンダー完走賞を目指してひた走っています。
    - ぜひ12/25に立派なSalesforceエンジニアになる姿を見届けてください。

https://qiita.com/advent-calendar/2022/kakakaori

# おわり。
- 簡単な仕組みの説明で大げさな記事を書いてしまったような気がしますが(笑)
- ここまでお読みいただきありがとうございました^^