关于这篇文章
- 介绍一个示例代码,它使用Google App Script(以下简称GAS)的Redmine API在Redmine项目下创建带有附件的票据。
(我用英语和日语搜索都找不到它......!) - 这一次我在 Google Drive 上创建一个带有附件的 Redmine 票证
- 没有关于 GAS 或 Redmine 本身的详细说明
门票图片
关于 Redmine API
- 这是一个 API,允许您执行诸如获取、创建和删除项目和工单信息等操作。
- 要使用 API,必须从 Redmine 管理菜单进行设置,因此如有必要,请向您的管理员询问设置。
- API 兼容性因 Redmine 版本而异,请了解更多信息官方维基请提前与
需要准备的东西
- GAS开发环境(谷歌账号和浏览器)
- Redmine(参与项目的Redmine URL和Redmine个人账号)
- Redmine API 访问密钥(给每个 Redmine 个人帐户的字符串)
- Redmine项目ID(获取方式请单独查看)
创建带有附件的票证的步骤
Redmine API 需要运行两次(或更多)才能创建带有附件的票证
- 使用Redmine API(第一次)上传文件到Redmine
- 在
- 文件中获取包含
token的响应 - 如果有多个文件,请执行相同数量的上传
- 文件中获取包含
- 使用 Redmine API(第二次),在文件中创建带有
token的票证详细程序
1.创建上传文件的函数
- 在创建票证之前仅上传文件的函数的示例代码
- 如果下面示例代码的文件名是
main.gs,那么Qiita的高亮是不起作用的,所以这里的扩展名是.js,但实际上是一个.gs文件。 - 实现将 Blob 格式文件作为参数传递给函数。
- 原始文件可以是图片、文本或其他格式
-
upload_url和api_key具有从 GAS 的脚本属性调用的实现
(硬编码也可以) - 函数的返回值是一个字典类型,可以在链接到工单时按原样使用
main.js/** * ファイルのRedmineにアップロード * チケットへの紐付けは別途行う * * @param {blob} blob - Blob型ファイルデータ * @return {object} token, filename, content_typeのキーを持つ連想配列 */ function redmineBlobUpload(blob) { // Redmine URLとAPIアクセスキーをスクリプトプロパティから呼び出し const upload_url = PropertiesService.getScriptProperties().getProperty('REDMINE_URL') + 'uploads.json'; const api_key = PropertiesService.getScriptProperties().getProperty('REDMINE_API_KEY'); // headers const headers = { 'X-Redmine-API-Key': api_key, 'Content-Type': 'application/json', }; // options const options = { 'method': 'POST', 'contentType': 'application/octet-stream', 'headers': headers, 'payload': blob, }; // post実行 const response = UrlFetchApp.fetch(upload_url, options); return { "token": JSON.parse(response).upload.token, "filename": blob.getName(), "content_type": "application/octet-stream", } }2.创建一个创建票的函数
- 这是一个函数的示例代码,该函数创建一个链接到上面“1. 上传文件”中给出的文件的票证。
- 下面的示例代码扩展名为
.js,但实际上是一个带有.gs的文件 -
upload_url和api_key具有从脚本属性调用的实现,但硬编码也可以 - 实施以将项目、票证标题、文本和附件作为参数传递
(不需要附件) - 请根据需要更改跟踪器的初始值或状态,例如使用不同的值或将其作为参数。
main.js/** * 添付ファイル付きチケット作成 * * @param {number} project_id - RedmineプロジェクトID * @param {string} subject - チケットタイトル * @param {string} message - チケットの本文 * @uploads {object} uploads - 添付ファイル配列、redmineBlobUpload()関数の戻り値を要素に持つ * @return {string} Redmine APIレスポンス */ function creatIssueWithAttachment(project_id, subject, message, uploads) { // Redmine URLとAPIアクセスキーをスクリプトプロパティから呼び出し const redmine_url = PropertiesService.getScriptProperties().getProperty('REDMINE_URL') + 'issues.json'; const api_key = PropertiesService.getScriptProperties().getProperty('REDMINE_API_KEY'); // uploads(添付ファイル)有無チェック if (!uploads) { uploads = []; // なければ添付しない } // headers const headers = { 'X-Redmine-API-Key': api_key, 'Content-Type': 'application/json', }; // Redmineチケット情報 const issue = { 'subject': subject, 'description': message, 'tracker_id': 1, 'status_id': 1, 'uploads': uploads }; // payload const payload = JSON.stringify( { 'project_id': project_id, 'issue': issue, } ); // options const options = { 'method': 'POST', 'contentType': 'application/json', 'headers': headers, 'payload': payload, }; // post実行 const response = UrlFetchApp.fetch(redmine_url, options); return response.getContentText; }3.执行创建的函数
- 如果您按顺序执行功能 1 和 2,您将能够创建带有附件的工单。
- 这次,我将介绍一个示例代码,它将Google Drive指定文件夹中的所有文件附加到票证上。
- 下面的示例代码扩展名为
.js,但它实际上是一个带有.gs的文件
main.js/** * 添付ファイル付きチケット作成関数サンプル * * @return {string} Redmine APIレスポンス */ function driveFileUpload() { //Googleドライブ フォルダID (フォルダURLの最後の'/'以降の文字列) const drive_folder_id = '1234567890abcdefghijklmnopqrstuvw'; // RedmineプロジェクトID const project_id = 123; // チケット情報 const subject = 'Googleドライブファイルの確認'; const message = 'Googleドライブ内のファイルを全て添付していますので、ご確認してください。'; // 添付ファイル格納用配列 const uploadList = []; // ---------- ファイルの取得とアップロード ---------- // フォルダ内のファイルを取得 const driveFolder = DriveApp.getFolderById(drive_folder_id); const files = driveFolder.getFiles(); while (files.hasNext()) { // ファイルをBlobに変換 const file = files.next(); const blob = file.getBlob(); // Redmineにアップロード const upload = redmineBlobUpload(blob); // 戻り値を配列に格納 uploadList.push(upload) } // ---------- Redmineチケット作成 ---------- // チケット投稿&レスポンス取得 const responce = creatIssueWithAttachment(project_id, subject, message, uploadList); return ContentService.createTextOutput(responce); }综上所述
通过 REST API 执行 GAS,可以隐藏 API 访问密钥并允许外部应用程序使用部分 Redmine API。
如果您有任何其他使用方式,或者您有任何疑虑或问题,请发表评论。
喜欢和股票也令人鼓舞,所以请这样做!
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308628338.html