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.tokyoのパネルディスカッショ…

    redmineエバンジェリストの会今回も例にもれずリモート開催で…

  2. インセプションデッキを作成し意志を合わせる re…

    redmineエバンジェリストの会の勉強会何だかんだイベントがあ…

  3. redmine温泉を網代にて

    この記事はRedmine Advent Calendar 2…

  4. redmineチケットの使い方の茶番劇 ネタを協…

    redmineエバンジェリストの会 実施しました今回もZOOMで…

  5. Redmineと私のステキな関係

    この記事はRedmineアドベントカレンダー 12/1NJC…

  6. 第17回Redmine大阪でLT

    2017/8/26(土)に行われる、Redmine大阪にてLTを行い…

  7. 第17回redmine.tokyoで自動化の極意…

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

  8. 第20回redmine.tokyoでRedmin…

    redmine.tokyoRedmineを愛する人達の勉強会…

PAGE TOP