Slack WorkflowでBacklogチケット起票を自動化してみる

# まずはじめに
Slack Workflowというものがあります。
定例作業をSlack上で自動化することが可能です。
[ツールの連携とタスクの自動化](https://slack.com/intl/ja-jp/help/articles/360035692513-%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
)


Webhookも使えます。
[Webhook を使用した高度なワークフローを作成する](https://slack.com/intl/ja-jp/help/articles/360041352714-Webhook-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)

# やりたいこと

現状はシステムのエラーをSlack通知するようにしています。

そのエラー通知の中から、Backlogに課題追加が必要なものを確認して、
起票する運用にしています。

以下手順で行っています。
1. Slackの内容を確認
2. チケット起票が必要なものか確認（ドキュメント見る or メンバーに質問）
3. Backlogにチケット起票する（Slackの通知をコピペ）

Slack→BacklogやGitHubを行き来するので、面倒だなという思いが。。。
ここらへんをSlack上で済ませたいと思い、Slack Workflow導入を考えました。

# 結論から

Slack Workflowからスプレッドシートを経由して、
GASでBacklog APIを呼ぶことにしました。

Slack Workflow -> google スプレッドシート -> Backlog

# 手順
1. スプレッドシート作成

2. Slack WorkFlowを作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/0f9c7703-1ade-1c3e-7e17-5ebac3b94b6f.png" width="50%">
￼
3. 作成したシートにワークフローで受け取ったパラメータを追記します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/3e05ec48-694e-e0db-a670-a799e3593093.png" width="50%">
4. GASでBacklog APIでチケット追加するスクリプトを用意

    ```javascript
    function createTicket(apiKey, baseUrl, projectId, issueTypeId, summary, description) { 
        var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd'); 

        var payload = {
            "projectId" : projectId,
            "summary" : summary + " (" + date + ")",
            "issueTypeId" : issueTypeId,
            "priorityId" : '3',
            "description" : '```\n'+ description + '\n```'
        }
        var options = {
            "method" : "POST",
            "payload" : payload
        }
        var url = baseUrl + '/api/v2/issues'
            + '?' + 'apiKey=' + apiKey
            ;
        return JSON.parse(UrlFetchApp.fetch(url, options).getContentText("UTF-8"));
        }
        function main() {
        // 現在のスプレッドシートを取得
        var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
        //現在のシートを取得
        var sheet = spreadsheet.getActiveSheet();
        
        lastRow = sheet.getLastRow();
        //エラータイトル取得
        var thisErrTitle = sheet.getRange(lastRow, 1).getValue();
        //エラーメッセージ取得
        var thisErrMsg = sheet.getRange(lastRow, 2).getValue();

        var apiKey = 'apikey';
        var baseUrl = 'baseurl';
        //ここで登録したいプロジェクト指定
        var projectId = 'projectId';
        var issueTypeId = 'issueTypeId';

        //バックログに課題追加
        var json = createTicket(apiKey, baseUrl, projectId, issueTypeId, thisErrTitle, thisErrMsg);
    }
    ```
5. GAS準備できたら、スプレッドシート更新で動くようにトリガを設定


これでWebhookURLを実行するだけでSlack Workflowが動きます

## 試してみる
```bash
curl -X POST -d \
    "{\"error_title\":\"$error_title", \"error_message\":\"$text\"}" \
    $slack_webhook_url
```
curl実行でSlackに通知がきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/3667f671-450e-fbe1-2300-cc0c99f08e23.png" width="50%">
￼
「チケット起票しますか」ボタン押下でチケットが起票されました！
(キャプチャは割愛で・・・)

## 最後に
そもそもSlackへ通知という所から見直そうという話も出ているので、この仕組み自体の寿命はとても短いかもしれません・・・
今後活かせるタイミングがきたら、また向き合いたいと思います。
おしまい。

# 参考
[Slack | Webhook を使用した高度なワークフローを作成する](https://slack.com/intl/ja-jp/help/articles/360041352714-Webhook-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
[Backlog API | 課題の追加](https://developer.nulab.com/ja/docs/backlog/api/2/add-issue/#)
[Google Spreadsheetに新しい行が追加されたらChatworkに通知する](https://qiita.com/sngazm/items/714ac05540c0cfd632ae)