关于这篇文章

  • 介绍一个示例代码,它使用Google App Script(以下简称GAS)的Redmine API在Redmine项目下创建带有附件的票据。
    (我用英语和日语搜索都找不到它......!)
  • 这一次我在 Google Drive 上创建一个带有附件的 Redmine 票证
  • 没有关于 GAS 或 Redmine 本身的详细说明

门票图片
GAS × Redmine APIで添付ファイル付きチケットの作成

关于 Redmine API

  • 这是一个 API,允许您执行诸如获取、创建和删除项目和工单信息等操作。
  • 要使用 API,必须从 Redmine 管理菜单进行设置,因此如有必要,请向您的管理员询问设置。
  • API 兼容性因 Redmine 版本而异,请了解更多信息官方维基请提前与

需要准备的东西

  • GAS开发环境(谷歌账号和浏览器)
  • Redmine(参与项目的Redmine URL和Redmine个人账号)
  • Redmine API 访问密钥(给每个 Redmine 个人帐户的字符串)
  • Redmine项目ID(获取方式请单独查看)

创建带有附件的票证的步骤

Redmine API 需要运行两次(或更多)才能创建带有附件的票证

  1. 使用Redmine API(第一次)上传文件到Redmine
    • 文件中获取包含 token 的响应
    • 如果有多个文件,请执行相同数量的上传
  2. 使用 Redmine API(第二次),在文件中创建带有token 的票证

    详细程序

    1.创建上传文件的函数

    • 在创建票证之前仅上传文件的函数的示例代码
    • 如果下面示例代码的文件名是main.gs,那么Qiita的高亮是不起作用的,所以这里的扩展名是.js,但实际上是一个.gs文件。
    • 实现将 Blob 格式文件作为参数传递给函数。
    • 原始文件可以是图片、文本或其他格式
    • upload_urlapi_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_urlapi_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

相关文章: