JIRA APIでissueの特定の情報を取得する で作った
get_issue_data() の代わりに
get_issue_histories() という機能を作って変更履歴を取得してみます
issueの変更履歴を取得するには
var url = ISSUE_URL + key; を
var url = ISSUE_URL + key + '?expand=changelog';
として changelog を取得できるようにします
get_issue() の中で Logger.log(response) でログを出してみると
変更履歴は changelog の histories に入っていて
何を変更したかは items の中に入っているようなので
欲しい情報をそれぞれ特定して取得します
抽出する情報
- 何を変更したか
- 変更前
- 変更後
- 変更した日時
response{ "expand": "renderedFields,names,schema,operations,editmeta,changelog,versionedRepresentations", "id": "10000", "self": "https://SITENAME.atlassian.net/rest/api/2/issue/10000", "key": "KEY-1", "changelog": { "startAt": 0, "maxResults": 3, "total": 3, "histories": [{ "id": "10003", "author": { "self": "https://SITENAME.atlassian.net/rest/api/2/user?username=admin", "name": "admin", "key": "admin", "accountId": "ACCOUNT_ID", "emailAddress": "LOGIN_EMAIL", "avatarUrls": { "48x48": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue", "24x24": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue", "16x16": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue", "32x32": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue" }, "displayName": "YOUR_NAME", "active": true, "timeZone": "Asia/Tokyo" }, "created": "2018-01-02T08:17:22.226+0900", "items": [{ "field": "description", "fieldtype": "jira", "fieldId": "description", "from": null, "fromString": "最初のタスク", "to": null, "toString": "最初のタスクです" }] }, 以下略 |
コード.gsを実行すると以下のようなログが出ます
コード.gs
var ISSUE_URL = 'https://SITENAME.atlassian.net/rest/api/2/issue/'; function get_issue_histories(){ var response = get_issue(); var jobj = JSON.parse(response); var histories = jobj["changelog"]["histories"][0]; var created = histories["created"]; var items = histories["items"][0]; var field = items["field"]; var from = items["fromString"]; var to = items["toString"]; Logger.log([field, from, to, created]); } function get_issue() { var token = get_token(); var key = "KEY-1"; var options = { contentType: "application/json", headers: {"Authorization": " Basic " + token} }; var url = ISSUE_URL + key + '?expand=changelog'; var response = UrlFetchApp.fetch(url, options); //Logger.log(response); return response; } function get_token() { var id = "LOGIN_EMAIL"; var pw = "LOGIN_PASSWORD"; var token = Utilities.base64Encode(id + ":" + pw); return token; } |
意訳issueのapiをたたくURLをISSUE_URLに入れる この機能がやること get_issue()から返ってきたデータを オブジェクトに変換して historiesの0番目の中の 作成日を取得して itemsの0番目の fieldを取得して(何を変更したか) 変更前の文字列を取得して 変更後の文字列を取得して ログに出す この機能がやること get_token()からtokenを取得して issue keyを指定して optionのオブジェクトを作る contentType は "application/json" headers は {"Authorization": " Basic " + token} urlにISSUE_URL + keyを入れて optionを付けてデータを取得して ログに出して(見たい場合は//を消すと出ます) 返す この機能がやること JIRAのログインに使っているemailと パスワードを base64Encodeでエンコードして 返す |
補足
var url = ISSUE_URL + key + '?expand=changelog';
ではなく
var url = ISSUE_URL + key + '/changelog';
としても取得できるようですが
その場合は返ってくるJSONの中身が異なるようです
コード.gsの
var histories = jobj["changelog"]["histories"][0]; を
var histories = jobj["values"][0];
に変更すると取得できると思います
var url = ISSUE_URL + key + '/changelog'の場合は
こんな感じで response が返ってきました
response{ "self": "https://SITENAME.atlassian.net/rest/api/2/issue/KEY-1/changelog?maxResults=100&startAt=0", "maxResults": 100, "startAt": 0, "total": 3, "isLast": true, "values": [{ "id": "10001", "author": { "self": "https://SITENAME.atlassian.net/rest/api/2/user?username=admin", "name": "admin", "key": "admin", "accountId": "ACCOUNT_ID", "emailAddress": "LOGIN_EMAIL", "avatarUrls": { "48x48": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue", "24x24": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue", "16x16": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue", "32x32": "https://avatar-cdn.atlassian.com/f539e6a019bdcf6b1635481ef4376f6c?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Ff539e6a019bdcf6b1635481ef4376f6c%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue" }, "displayName": "YOUR_NAME", "active": true, "timeZone": "Asia/Tokyo" }, "created": "2018-01-02T08:17:22.226+0900", "items": [{ "field": "description", "fieldtype": "jira", "fieldId": "description", "from": null, "fromString": "最初のタスク", "to": null, "toString": "最初のタスクです" }] }, 以下略 |
参考
Expansion
https://developer.atlassian.com/cloud/jira/platform/rest/#expansion
Get change logs
https://developer.atlassian.com/cloud/jira/platform/rest/#api-api-2-issue-issueIdOrKey-changelog-get