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エバンジェリストの会 実施しました今回もZOOMで…

  2. 第15回redmine.tokyo 導入における…

    第15回redmine.tokyoに参加しました…

  3. redmine.japan2の動画を一緒に見る …

    先日行われたRedmine.japan2私は時間が取れなかったの…

  4. 第20回redmine大阪で分析と検索の極意を知…

    年に2回行われるredmine大阪勉強会今回も遠征して参加です…

  5. お悩み相談 見積精度を上げるには早期の質問・確認…

    redmineエバンジェリストの会2021年2月の打ち合わせ…

  6. 本音が出るのがLychee Redmineユーザ…

    Lycheeをバリバリ使っているのユーザではないのですが懇意にさせて…

  7. チケット駆動で3次元マネジメントを実践

    以前からマネジメントの進化について考えることがある複雑性…

  8. 第24回 redmine.tokyo #redm…

    長く続いてるredmineの勉強会のredmine.to…

PAGE TOP