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







