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. 経験からとくぎに繋げていく #8

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

  2. マズローの欲求5段階 抵抗の6階層 meetin…

    redmineエバンジェリスト会を発足させ、基本の進め方…

  3. 予防型PMOがRedmineでのプロジェクトモニ…

    予防型PMOやってますredmineエバンジェリストの会1号やっ…

  4. redmineエバンジェリストの会 過去の活動を…

    2021年最後の集合川崎が3人でzoomが5人…

  5. 第12回redmine.tokyo Redmin…

    redmine.tokyoの勉強会に参加&講演してきました講…

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

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

  7. planioで個人タスクもTiDD

    redmineヘビーユーザーの私ですが個人のタスク管理ツールでい…

  8. redmineエバンジェリストの会発足!

    redmineがなかなか根付かない、効果的な運用ができてない、もっと…

PAGE TOP