GASを使ってJira課題を作成する

# プログラムを作成した背景
Jiraを使い始めたのですが、もともとスプレッドシートでタスク管理をしていた関係でまとめて送り込みたかったため作りました。

# スプレッドシート

以下のような、送信チェック欄、作成したSTORY-IDを記載する欄、課題タイトルの入力があるスプレッドシートを想定しています。

![スクリーンショット 2022-01-16 20.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/9cddf5d9-be29-3e3e-3153-b5fe02f09771.png)

※スプレッドシート上からGASのメソッドを実行するには、以下を参考にスプレッドシート上にメニューを作ると便利です。
https://qiita.com/howdy39/items/46ca1f2fd9d27eaba0c3


# 仕様

- 送信チェック列をクリックして、「Jiraメニュー」→「チェックしたものを送信」としたときに、まとめて課題（ストーリー、タスク、エピック等）を作成できます。
- 作成が成功すると、「STORY-ID」列に課題のIDが書き込まれ、送信チェックが外れます。


# ソースコード

https://github.com/prettyhappycatty/gas-jira/blob/main/create_story.gs

流れとしては、36行目のcreateStory()メソッドでスプレッドシートの範囲をループ、送信チェックがついていないかつSTORY-IDがないものについて、以下の処理をします。

- 行のデータを読み取り
- JSONに整形
- create issue APIを呼びだす。

以下、そのまま使う時に変える必要があるところを記載します。

## 1~2行目

```javascript:create_story.gs
var baseUrl = 'https://xxxxx.atlassian.net';
var token = Utilities.base64Encode('email@hogehoge.com:token');
```

送り込みたいJiraのURLと、JiraログインするURL、tokenに書き換えてください。
tokenは、Jiraにログインした状態で右上の自分のアイコンから「アカウント設定」→「セキュリティ」→「APIトークンの作成と管理」から、APIトークンを作成してください。
一度しか表示されないのでメモしてください。

ほんとは、ソースコードに書いてしまうとシェアしてしまえば見放題なので、ユーザの環境変数に入れておくのが良さそうです。

## 4~8行目

```javascript:create_story.gs
var spreadsheet = SpreadsheetApp.openById('spreadsheetid');
//storyシートは、送信用チェック、issue_id、summary, others
const storySheet = spreadsheet.getSheetByName('story')
const projectName = "projectname"
const issuetypeOfStory = ""
```

- スプレッドシートのURLに出てくるIDを記載してください。以下のxxxxxがスプレッドシートIDです。
    - https://docs.google.com/spreadsheets/d/xxxxxx/edit
    
- スプレッドシートのシート名を記載してください。

- Jiraのプロジェクト名を入力してください。以下のzzzzzzがプロジェクト名です。
    - https://yyyyyy.atlassian.net/jira/software/projects/zzzzzz/boards/1

- 作成する課題タイプを入力してください
    - 課題を取得できるAPI（rest/api/3/issue/{issueId}）があるので、適当な課題を渡してレスポンスから使える課題タイプのIdを調べてください。（環境によりIDが違うため）　例えば下記の画像の課題ならば、以下URLにアクセスするとJsonのレスポンスが表示されます。
        - https://yyyyyy.atlassian.net/rest/api/3/issue/MEOW-3
        - ![スクリーンショット 2022-01-16 21.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/cee4ad3e-877f-f3a2-8abd-e6a8affeb121.png)


    - その中から、「issuetype:」と書かれているところを探し、IDを調べます。
        - ![スクリーンショット 2022-01-16 20.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/bf64b673-bc20-19fa-8996-ec31218c5913.png)
        - この場合だと10004がストーリーのissuetypeとなります。

## 応用：42-44行目、83行目〜のメソッド

```javascript:create_story.gs
      summary = data[i][2]
      json = getStoryIssueJson(summary)
      ret = postStoryIssue(json)
```
スプレッドシートをdataに入れてあるので、送りたいデータ列に合わせて設定してください。
getStoryIssueJsonメソッドにsummaryを渡しています。（summaryは課題のタイトルです。）

```javascript:create_story.gs
function getStoryIssueJson(summary){

  json = {
  "update": {},
  "fields": {
    "summary": summary,
    "project": {
      "key": projectName
    },
    "issuetype": {
      "id": issuetypeOfStory
    }
  }
  }
  return JSON.stringify(json);
}
```

getStoryIssueJsonメソッドでは、postするためのjsonを作成しています。

- ストーリーポイントやユーザをデフォルトで入力するにはcreate issueのAPIを見て、スプレッドシートにある値をjsonに整形すれば送ることができます。
    - https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-post
    - StoryPointは、Jira側でストーリーポイントを使う設定にしてから、issuetypeを確認したのと同じ方法でパラメータ名（customfield_xxxxという形式になっていました）を調べる必要がありました。

# 最後に

GASを使ってJiraに課題を作成するプログラムを紹介しました。
実運用では、下記のような処理も作ってあります。

- StoryPoint・担当メンバー・スプリントを指定して送信
    - （※activeなスプリントの取得方法がわからず、IDベタ打ちです、、、）
- Jiraのステータスをスプレッドシート上に取得して更新する。

Jiraはバーンダウンチャート等も見れるので、スプレッドシートで管理していたときよりリッチな振り返りができそうで楽しみです。

ただ、あくまでもツールは補助的な役割であり、どう運用するかが重要だと感じています。

- なにをストーリーにし、なにをタスクにし、なにをエピックにするのか？
- スプリントは1週間がいいのか、2週間がいいのか、1ヶ月がいいのか。

チームで試行錯誤をしながら、進めて行こうと思います。