RedmineにGoogleスプレッド+GoogleAppsScriptでチケット作成

スポンサードリンク

所属組織のredmine4.1バージョンアップ
やったー
チケットCSV取込はツールが変わるけど
Redmineチケット★一括★を使えば
大丈夫!
と思っていたのですが、
Redmineチケット★一括★は作りがしっかりしていて
レスポンスを考慮しているため、ランダムに取り込まれるということが発覚

チケットの並び順を考慮した運用してるんスよ、うち

そして、標準機能のCSV取込が何故か動かず・・・


うーん

GASで書くか

GSuite利用しまくりの会社だから、
RestApi使えばいけるやろうし
あんまりコードを書く人間ではないのですが
作ってみました

スプレッドには、項目を配置
悩んだのは日付項目でした

どうやら
‘2020-04-10
と、シングルコーテーションがいるみたい

期日自動算出を行っているので、こんな形になりました


//メイン処理
function mainFunction() {
	var result = Browser.msgBox("実行しますか?", Browser.Buttons.OK_CANCEL);
		if (result == "cancel"){
		Logger.log("canceled...")
	}else{
		Dateset()
		createIssue()
	}
Browser.msgBox("処理終了です");
}

//メニューに追加
function onOpen(){
	var ui = SpreadsheetApp.getUi();
	var menu = ui.createMenu('メニュー');
	menu.addItem('Redmineにチケット作成', 'mainFunction');
	menu.addToUi();
	}

//日付変換
function Dateset(){
	var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
	var sheet = spreadsheet.getSheetByName('チケット用レコードシート');

	for(var i = 2; i <= sheet.getLastRow(); i++){
		if (sheet.getRange(i,28).getValue()=="")
		{}
		else{
			start_date=new Date(sheet.getRange(i,28).getValue());
			start_date = Utilities.formatDate(start_date,'JST', 'yyyy-MM-dd');
			sheet.getRange(i, 13).setValue("'" + start_date);
			console.log(start_date);
		}
		if (sheet.getRange(i,29).getValue()=="")
		{}
		else{
			due_date=new Date(sheet.getRange(i,29).getValue());
			due_date= Utilities.formatDate(due_date,'JST', 'yyyy-MM-dd');
			sheet.getRange(i, 14).setValue("'" + due_date);
		}
	}
}

//チケット作成
function createIssue() {
	var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //1. 現在のスプレッドシートを取得
	var sheet = spreadsheet.getSheetByName('チケット用レコードシート');
	var redmine_url = 'https://xxxxxx.xx.jp/issues.json';
	var project_id = 'プロジェクト名'
	var owner = 'ユーザID'

	for(var i = 2; i <= sheet.getLastRow(); i++){
		var title=sheet.getRange(i,7).getValue();
		var Setsumei=sheet.getRange(i,27).getValue();
		var tracker=sheet.getRange(i,3).getValue();
		var start_date=sheet.getRange(i,13).getValue();
		var due_date= sheet.getRange(i,14).getValue();
		var assigned_to_id=sheet.getRange(i,9).getValue();
		var dainittei=sheet.getRange(i,24).getValue();
		var issue = {
			'subject': title,
			'description': Setsumei,
			'tracker_id': 3,
			'status_id': 1,
			'start_date':start_date,
			'due_date':due_date,
			'assigned_to_id':assigned_to_id,
			'custom_fields':[{'id':4,'value':dainittei}],
		}
		var payload = {
		'issue': issue,
		'project_id': project_id,
		};
		payload = JSON.stringify(payload);
		var user = 'user';
		var pass = 'pass';
		var headers = {
			"Authorization" : " Basic " + Utilities.base64Encode(user + ":" + pass),
			'X-Redmine-API-Key': 'APIキーを入れる',
			'X-Redmine-Switch-User': owner,
			'Content-Type': 'application/json',
		};
		var options = {
			'method': 'POST',
			'headers': headers,
			'payload': payload,
			'contentType': 'application/json',
			'muteHttpExceptions': true
		};
		var response = UrlFetchApp.fetch(redmine_url, options);
		}
	return response;
}

redmine_url、project_id などは
環境に合わせて設定してください
RestAPIを使っています キー取得方法はこちらを
シートの座標(i,5)なども合わせてください
dainittei はカスタムフィールドです
誰かの参考になれば

ウォームアップとクールダウンにかかる時間

知覧茶が好き!

関連記事

  1. 私の講演一覧(主にRedmine関連)

    redmineエバンジェリストの会としていろいろ講演しています…

  2. 第17回redmine.tokyo勉強会の見どこ…

    2019年11月2日に第17回redmine.tokyo勉強会が…

  3. 第15回redmine.tokyoの見所

    2018年11月10日にredmine.tokyoが行われます…

  4. 2020年 地球都合(コロナ)とredmineエ…

    この記事はRedmine Advent Calendar 2…

  5. プロジェクトマネジメント効率化のためのredmi…

    ひょんなことから溝の口の某所で講演する機会に恵まれました「プ…

  6. 総花的ツールと個別最適ツールのバランスを議論する…

    久しぶりの集合川崎市振興会館にて…

  7. 経験からとくぎに繋げていく #8

    2ヶ月ぶりのredmineエバンジェリストの会の打合せ今日はメイ…

  8. 第19回redmine大阪でLT&見所…

    2019/3/8に一年ぶりにredmine大阪が行われます…

PAGE TOP