指定したissue keyでステータスが変更された最終日時を取得してシートに書き出したい
と思って書き出すコードを書きました。
書き出す前のシート:
- KEY:issue keyは入力しておく
- created:ステータスが変更された最終日時
- from:変更前のステータス
- to:変更後のステータス
書き出した後のシート:
コード.gsの get_last_status_change_date() を実行すると、created, from, to が入力されます。
関連記事
JIRA APIでissueの変更履歴を取得する
JIRA APIでissueの変更履歴を取得する2
事前準備
- シートのA列にissue keyを入れておく
- スクリプトのプロパティにtokenという名前でbasic認証する文字列を入れておく
コード.gs内で各自で変更する箇所
- ISSUE_URLの SITENAME
- ss_urlの SPREADSHEET_ID
コード.gs
var ISSUE_URL = 'https://SITENAME.atlassian.net/rest/api/2/issue/';
var ss_url = "https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0";
/************************************
これを実行する
シートを取得して
シートからJIRAのissue keyを取得して
最終ステータスの日時と何から何へを取得して
シートに書き込む
************************************/
function get_last_status_change_date() {
var sheet = get_sheet();
var keys = get_keys(sheet);// ["KT-6", "KT-7"];
var last_statuses = get_last_statuses(keys);
var values = create_value(last_statuses, sheet);
set_values(values, sheet);
}
/************************************
指定したss_urlのシートの0番目のシートを取得して返す
************************************/
function get_sheet() {
var ss = SpreadsheetApp.openByUrl(ss_url);
var sheet = ss.getSheets()[0];
return sheet;
}
/************************************
シート内のA列の2行目から入力されているissue keyを取得して
二次元配列で取得されるので一次元配列にして返す
************************************/
function get_keys(sheet) {
var last_row = sheet.getLastRow();
var rangeA = sheet.getRange(2, 1, last_row-1, 1);
var valuesA = rangeA.getValues();
var keys = array_push_apply(valuesA);
return keys;
}
/************************************
二次元配列を一次元配列にして返す
************************************/
function array_push_apply(arrays){
for(var i = 1; i < arrays.length; i++){
Array.prototype.push.apply(arrays[0], arrays[i]);
}
return arrays[0];
}
/************************************
issue keyの最後のステータス変更を取得して
last_statuses配列に入れて返す
************************************/
function get_last_statuses(keys) {
var last_statuses = [];
for(var i = 0; i < keys.length; i++) {
var key = keys[i];
var latest_status = get_latest_status(key);
last_statuses.push(latest_status);
}
return last_statuses;
}
/************************************
issue keyの最後のステータス変更の履歴を取得して返す
************************************/
function get_latest_status(key) {
var histories = get_issue_histories(key);
var arrays = get_status(histories);
var latest_status = arrays[0];// descにした配列の先頭がlatest
return latest_status;
}
/************************************
issueの情報からchangelogのhistoriesを取得して返す
************************************/
function get_issue_histories(key) {
var response = get_issue(key);
var jobj = JSON.parse(response);
var histories = jobj["changelog"]["histories"];
return histories;
}
/************************************
issueの情報を?expand=changelog付けて取得して返す
************************************/
function get_issue(key) {
var token = getProp("token");
var options = {
contentType: "application/json",
headers: {"Authorization": " Basic " + token}
};
var url = ISSUE_URL + key + "?expand=changelog";
var response = UrlFetchApp.fetch(url, options);
return response;
}
/************************************
histories(履歴)の数だけ繰り返す
さらに履歴の中のitemsの数だけ繰り返す
fieldがstatusならcreatedとfromとtoのオブジェクトを作って
arrays配列に入れて
descending_arrayで日時を基準に降順にして返す
************************************/
function get_status(histories) {
var arrays = [];
for(var i = 0; i < histories.length; i++) {
var history = histories[i];
var created = format_date(history["created"]);
var items = history["items"];
for(var j = 0; j < items.length; j++) {
var item = items[j];
var field = item["field"];
if(field === "status") {
var obj = {};
obj["created"] = created;
obj["from"] = item["fromString"];
obj["to"] = item["toString"];
arrays.push(obj);
}
}
}
var desc = descending_array(arrays);
return desc;
}
/************************************
シートに入れる値を作って入れる
************************************/
function create_value(last_statuses, sheet) {
var values = [];
for(var i = 0; i < last_statuses.length; i++) {
var latest_status = last_statuses[i];
if(latest_status === undefined) {
values.push(["-", "-", "-"]);// statusの変更履歴がなければ-にする→しないとlatest_status["created"]などがエラーになるのでここで回避
} else {
var created = latest_status["created"];
var from = latest_status["from"];
var to = latest_status["to"];
values.push([created, from, to]);
}
}
return values;
}
/************************************
シートに値を入れる
************************************/
function set_values(array, sheet){
var start_col = 2;
var last_row = get_last_row(sheet, start_col);
var start_row = last_row + 1;
var num_rows = array.length;
var num_cols = array[0].length;
var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
range.setValues(array);
}
/************************************
指定したcol(列)の値が入っている最終行を取得して返す
************************************/
function get_last_row(sheet, col) {
var start_row = 1;
var num_cols = 1;
var sh_last_row = sheet.getLastRow();
var values = sheet.getRange(start_row, col, sh_last_row, num_cols).getValues();
for (var i = values.length - 1; i >= 0; i--) {
if (values[i] != "") {
break;
}
}
var last_row = i + 1;
return last_row;
}
/************************************
受け取ったkeyの値をスクリプトのプロパティから返す
************************************/
function getProp(key) {
return PropertiesService.getScriptProperties().getProperty(key);
}
/************************************
日時をフォーマットして返す
************************************/
function format_date(date) {
return Utilities.formatDate(new Date(date), "asia/tokyo", "yyyy-MM-dd HH:mm:ss");
}
/************************************
日時を降順にした配列を返す
************************************/
function descending_array(array) {
var descending = array.sort(sorting_desc);
return descending;
}
/************************************
array配列内の日時を降順にする
************************************/
function sorting_desc(a, b){
if(a[0] > b[0]){
return -1;
}else if(a[0] < b[0] ){
return 1;
}else{
return 0;
}
}
|

