LANG SELRCT

コードを書く場所

2019年11月13日水曜日

JIRA APIで課題作成時にサブタスクも作成したい


JIRAのAPIでストーリーを作成して、サブタスクも一緒に作るというコードの例です。

/rest/api/2/ と /rest/api/3でdescriptionの書き方が異なるところにちょっとハマりました。

/rest/api/2/ のdescriptionは一行で書けましたが、
/rest/api/3 は複数のプロパティを設定する必要があるようです。



コード.gs
var BASE_URL = 'https://SITENAME.atlassian.net'; //var API_VERSION = "/rest/api/2/";// version 2で実行する場合 var API_VERSION = "/rest/api/3/";// version 3で実行する場合 var ISSUE_URL = BASE_URL + API_VERSION + '/issue/'; var projectKey = 'KT'; // JIRAプロジェクトのKEY //ストーリーを作成する function createStory() { var payload = getPayloadStory(); var options = getOptions(payload); var response = UrlFetchApp.fetch(ISSUE_URL, options); var key = getKey(response); var id = getKey(response); createSubtask(key, "タスク1", "サプタスク1\n", "https://www.google.co.jp/");// サブタスクのタイトルと説明 createSubtask(key, "タスク2", "サプタスク2\n", "https://www.google.co.jp/"); } //ストーリーの内容を作成する function getPayloadStory() { var email = Session.getActiveUser().getEmail(); var data = { "project": {"key": projectKey}, "issuetype": {"name": "Story"}, "summary": "ストーリー12", //"description": "https://beautifier.io/",// /rest/api/2/で実行する場合のdescription "description": { "version": 1, "type": "doc", "content": [ { "type": "paragraph", "content": [ { "type": "text", "text": "https://www.google.com/", "marks": [ { "type": "link", "attrs": { "href": "https://www.google.com/", "title": "Google" } } ] } ] } ] }, "reporter": {"id": getAccountId()} }; var fields = {"fields": data}; var payload = JSON.stringify(fields); return payload; } //ストーリーのissueKeyをparentKeyとして受け取ってサブタスクを作成する function createSubtask(parentKey, summary, description, link) { var payload = getPayloadTask(parentKey, summary, description, link); var options = getOptions(payload); var response = UrlFetchApp.fetch(ISSUE_URL, options); var key = getKey(response); } //サブタスクの内容を作成する function getPayloadTask(parentKey, summary, description, link) { var email = Session.getActiveUser().getEmail(); var data = { "parent": {"key": parentKey}, "project": {"key": projectKey}, "issuetype": {"name": "Sub-task"}, "summary": summary, //"description": description,// /rest/api/2/で実行する場合のdescription "description": { "version": 1, "type": "doc", "content": [ { "type": "paragraph", "content": [ { "type": "text", "text": description }, { "type": "text", "text": link, "marks": [ { "type": "link", "attrs": { "href": link, "title": "Google" } } ] } ] } ] }, "reporter": {"id": getAccountId()} }; var fields = {"fields": data}; var payload = JSON.stringify(fields); return payload; } //スクリプトのプロパティから指定したkeyの値を取得する function getProp(key) { return PropertiesService.getScriptProperties().getProperty(key); } //optionsを作成する function getOptions(payload) { var options = { method: "post", payload: payload, contentType: "application/json", headers: {"Authorization": " Basic " + getProp('token')} } return options; } //responseからissueKeyを取得する function getKey(response){ var jobj = JSON.parse(response); var key = jobj["key"]; return key; } //emailからaccountIdを取得する function getAccountId() { var email = Session.getActiveUser().getEmail(); var url = BASE_URL + API_VERSION + '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; } //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; }    


関連記事

JIRA APIでissueを作成する


参考

Creating Sub task of an issue using REST API.
https://community.atlassian.com/t5/Answers-Developer-Questions/Creating-Sub-task-of-an-issue-using-REST-API/qaq-p/500838

Mark - link
https://developer.atlassian.com/cloud/jira/platform/apis/document/marks/link/