JIRA上で直接issueを作成せずにAPIで作成するコードの例です
作成後にissue keyをログに出しています
以下はご自身のものに変更してから実行して下さい
- SITENAME
- LOGIN_EMAIL
- API Token
※JIRA APIの仕様変更
usernameではなくaccountIdを使うようになりました。accountIdの取得については以下の記事に書きました。
JIRAのAPIでemailからaccountIdを取得したい
Email: Passwordでの認証方法ではなく、Email: API Tokenでの認証方法になりました。
API Tokenの取得については以下の記事に書きました。
JIRAでAPIトークンを取得したい
v3ではdescriptionの値の書き方が変わりました。
v2では "description": 値 でできましたが、
v3では "description": {
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{
"text": text,
"type": "text"
}
]
}
]
}
のように変更されたようなので、コード.gsを書き換えました。
コード.gs
var BASE_URL = 'https://SITENAME.atlassian.net'; var ISSUE_URL = BASE_URL + '/rest/api/3/issue/'; function doPost() { var payload = getPayload(); var options = getOptions(payload); var response = UrlFetchApp.fetch(ISSUE_URL, options); var key = getKey(response); Logger.log(key); } function getPayload(values) { var email = Session.getActiveUser().getEmail(); var data = { project: {key: "KEY"}, issuetype: {name: "Story"}, summary: "たいとる", description: createDescription("タスクの説明です\n説明の2行め"), reporter: {id: getAccountId()} }; var fields = {fields: data}; var payload = JSON.stringify(fields); return payload; } function createDescription(text) { const description = { "type": "doc", "version": 1, "content": [ { "type": "paragraph", "content": [ { "text": text, "type": "text" } ] } ] } return description; } function getProp(key) { return PropertiesService.getScriptProperties().getProperty(key); } function getOptions(payload) { var options = { method: "post", payload: payload, contentType: "application/json", headers: {"Authorization": " Basic " + getProp('token')} } return options; } function getKey(response){ var jobj = JSON.parse(response); var key = jobj["key"]; return key; } function getAccountId() { var project = 'KEY';//プロジェクトを指定する var email = Session.getActiveUser().getEmail(); var url = BASE_URL + '/rest/api/3/user/search?query=' + email; var options = { method: "get", contentType: "application/json", headers: {"Authorization": " Basic " + getProp('token')} } var response = UrlFetchApp.fetch(url, options); var jobj = JSON.parse(response); var accountInfo = getAccountInfo(jobj, email); var accountId = accountInfo['accountId']; return accountId; } function getAccountInfo(jobj, email) { var accountInfo; for(var i = 0; i < jobj.length; i++) { var emailAddress = jobj[i]['emailAddress']; if(emailAddress === email) { accountInfo = jobj[i]; } } return accountInfo; } |
カスタムフィールドも入れたい場合
function get_payload(values) { var email = Session.getActiveUser().getEmail(); var data = { project: {key: "KEY"}, issuetype: {name: "Task"}, priority: {name: 'Medium'}, summary: "たいとる", description: createDescription("タスクの説明です\n説明の2行め"), customfield_10026: "対象のカスタムフィールドに入れる値", reporter: {id: accountId} }; var fields = {fields: data}; var payload = JSON.stringify(fields); return payload; }
補足
こんなエラーが出る場合
{"errorMessages":[],"errors":{"reporter":"Field 'reporter' cannot be set. It is not on the appropriate screen, or unknown."}}
考えられること
- 報告者(reporter)フィールドの編集権限がない(課題の作成画面で表示されていない)
- 報告者がJIRAのプロファイルのユーザー名(username)にいない
→ username は廃止されて accountId を使うようになりました
JIRAのAPIでemailからaccountIdを取得したい
1. 報告者の編集権限を付与する
設定 > 権限 > アクション > 権限の編集 > 報告者の修正 編集リンク >
許可先:アプリケーションアクセス→ログイン済みのユーザー全員
などにすると許可先を変更できるようです
2. JIRAのプロファイルのユーザー名(username)を確認する・変更する
サイト管理 > Users > ユーザのFull nameのリンククリック > Edit
表示されるEdit User画面の中のusernameがAPIでPOSTするときのreporterっぽいので
スクリプトの中のvar email = Session.getActiveUser().getEmail()で取得されるものと同じにする
1, 2への道のり
一度迷子になると時間を消耗してしまうので、今回僕がたどり着いた道のりを書き残しておきます
一度迷子になると時間を消耗してしまうので、今回僕がたどり着いた道のりを書き残しておきます
1. 報告者の編集権限を付与する道
プロジェクトの「設定」をクリックする
「権限」をクリックする
「アクション」をクリックして表示される「権限の編集」をクリックする
報告者の修正の「編集」をクリックする
許可先を指定して「許可」をクリックする
(アプリケーションアクセスでログイン済のユーザー全員に許可する場合の例)
2. JIRAのプロファイルのユーザー名(username)を確認する・変更する道のり
メニューを開いて「サイト管理」をクリックする
UsersのFull nameのリンクをクリックする
Editをクリックして表示されるUsernameがAPIでPOSTするときのreporterらしい
参考
Create issue
https://developer.atlassian.com/cloud/jira/platform/rest/#api-api-2-issue-post