GAS+スプレッドシートを使って、Backlog上のプロジェクト間で課題を複製する

#本記事の内容
Google Apps Script(GAS)とスプレッドシートを用いて、Backlog上のプロジェクトを横断して課題を複製します。

#動機
タスク管理ツールとしてBacklogを用いて業務をしています。
ある日、プロジェクトを新しく作成し、旧プロジェクトの残チケットをそのまま新プロジェクトへ複製しなければならなくなりました。
手動でもできないこともないけど、残チケットがかなり多く残っており、自動でできないかと考えました。（実際は半自動）

#方法
プロジェクト間にスプレッドシートを挟んで移行した。
1. 旧プロジェクトからスプレッドシートに課題を自動抽出
2. スプレッドシートから新プロジェクトに課題を自動登録

###旧プロジェクトからスプレッドシートに課題を自動抽出

[複数スペースのBacklogの課題をspreadsheetで一覧表示](http://kinjo.hiroshi.world/entry/gas-backlog)を参考にしました。
[id:hiroshiweb ](http://kinjo.hiroshi.world/about)さんありがとうございます。

####1. Spreadsheetを用意する
[Backlog All task - Google スプレッドシート](https://docs.google.com/spreadsheets/d/15qpmli5uswP9Pjjo5oPoBdpQeTMxsLeEnzIAtE86qtI/edit#gid=1194134501)のコピーを作成する。

####2. Backlog API keyなどの設定
1でコピーしたスプレッドシートのシート名**config**を開く。
`backlog_team`, `backlog_api_key`, `backlog_assigneeid`を入力する。

####３. GASに以下を記述する


    function main(action) {
        var IssuesSheet = SpreadsheetApp.getActive().getSheetByName('issues');
    
        /* 一旦、シートをクリアにする */
        if(IssuesSheet.getLastRow() > 1){
            IssuesSheet.getRange("A2:I"+IssuesSheet.getLastRow()+"").clearContent();
        }
    
        /* ヘッダをセットする。 */
        IssuesSheet.getRange("A1").setValue("space");
        IssuesSheet.getRange("B1").setValue("url");
        IssuesSheet.getRange("C1").setValue("summary");
        IssuesSheet.getRange("D1").setValue("createUser");
        IssuesSheet.getRange("E1").setValue("priority");
        IssuesSheet.getRange("F1").setValue("status");
        IssuesSheet.getRange("G1").setValue("dueDate");

        var issuelist = get_issues_lists(IssuesSheet);

    }

    function onGet(event) {
        main('on_manual');
    }

    /* space分の課題を取得して書き込む */
    function get_issues_lists(IssuesSheet) {
        var Confsheet = SpreadsheetApp.getActive().getSheetByName('config');
        var range= Confsheet.getRange(2, 1);
        
        var values = Confsheet.getRange(2, 1, Confsheet.getLastRow()-1, Confsheet.getLastColumn()).getValues();
    
        var range= IssuesSheet.getRange(2, 1);

        for(var i=0;i<values.length;i++){
        
            var backlog_team = values[i][0]
            var backlog_api_key = values[i][1]
            var backlog_assigneeid = values[i][2]

            res = UrlFetchApp.fetch("https://" + backlog_team + ".backlog.jp/api/v2/issues?apiKey=" + backlog_api_key + "&assigneeId[]=" + backlog_assigneeid+ "&order=&statusId[]=3&statusId[]=2&statusId[]=1&count=100"); 

            if (res.getResponseCode() != 200) {
                return false;
            }
            // Logger.log("res :" + res);

            var issues = JSON.parse(res.getContentText());
    
            write_issues(backlog_team, range, issues);
            range = range.offset(issues.length, 0);
        
        }

    }

    /* 課題をシートに書き込む */
    function write_issues(backlog_team, range, issues) {

        for(var i=0; i<issues.length; i++) {
        
            range.offset(i, 0).setValue(backlog_team);
            var issue_url = "https://" + backlog_team + ".backlog.jp/view/" + issues[i]["issueKey"]
            range.offset(i, 1).setValue('=HYPERLINK(\"' + issue_url + '\",\"' + issues[i]["issueKey"] + '\")')
            // 抽出したいデータを指定する
            range.offset(i, 2).setValue(issues[i]["summary"]);
            range.offset(i, 3).setValue(issues[i]["createdUser"]["name"]);
            range.offset(i, 4).setValue(issues[i]["priority"]["name"]);
            range.offset(i, 5).setValue(issues[i]["status"]["name"]);
            range.offset(i, 6).setValue(issues[i]["dueDate"]);

        }

    }

抽出するデータは、[BacklogのAPIドキュメント](https://developer.nulab-inc.com/ja/docs/backlog/api/2/get-issue-list/)より、keyを指定することで、好きなように変更することができる。

####4. main関数を実行する
実行すると、1でコピーしたスプレッドシートにデータが抽出できる。

###スプレッドシートから新プロジェクトに課題を自動登録
[Google SheetsによるBacklog課題一括登録](https://github.com/nulab/backlog-bulk-issue-registration-gas/blob/master/README.md)を参考にしました。

[抽出用のスプレッドシート](https://docs.google.com/spreadsheets/d/15qpmli5uswP9Pjjo5oPoBdpQeTMxsLeEnzIAtE86qtI/edit#gid=1194134501)から、[登録用のスプレッドシート](https://docs.google.com/spreadsheets/d/1bUMYsQcayIpwjSMaT2CfMucLFfC3kZqGXgIiiydCHVI/copy)に手動でデータをコピー＆ペースト（ここ自動化したい・・・）

そして、[Google SheetsによるBacklog課題一括登録](https://github.com/nulab/backlog-bulk-issue-registration-gas/blob/master/README.md)の通りに一括登録を試みる。

#所感
１００件くらいあったチケットを半自動で複製できたので、手動で複製するより半分の時間ではできたと思う。
スプレッドシートを挟んで移行した！というアイデアだけの記事です・・・。
業務中の時間のない中だったので半自動ですが、また同じケース（すごいレアケースだけど）に遭遇したときのために忘れないように書きました。