Trelloの完了したタスクをGASで自動アーカイブする

#はじめに

仕事のタスク整理にTrelloを使いますが、完了したタスクを手動でアーカイブすると判断に迷ったり、手間を感じることがあるので、完了してから一定期間経過したものをGoogleAppsScript(GAS)で自動アーカイブするようにしました。

#準備
TrelloのAPIをGASで使用するにはAPIキーやトークンの取得が必要になります。
方法は[こちらの記事](https://qiita.com/RYOSUKE310/items/016549922a17376efdf8)を参考にしてください。

#処理の流れ

1. 完了のリストにあるカードを取得する
2. 取得したカードの最終更新日が7日経過していれば、アーカイブする
3. アーカイブしたカードの情報をスプレッドシートに出力（追記）する

#コード

###①カードの取得とアーカイブ対象の選定

```javascript:cardArchived.gs
// カードのアーカイブ
function cardArchived() {
 
  // スクリプトプロパティのオブジェクト取得
  var scriptProperty = PropertiesService.getScriptProperties().getProperties();

  //TrelloのAPIキーの取得 
  var Key = scriptProperty.API_KEY; 

  //TrelloのAPIトークンの取得
  var Trello_Token = scriptProperty.TOKEN; 
  
  //削除対象のリストIDの取得
  var ListId = scriptProperty.LIST_ID_DONE; 

  /*
  リストにあるカードの一覧の取得
   【取得するfrield】
   id = カードのID
   name = カードの名称
   dateLastActivity = 最終更新日
   shortUrl = カードのURL
   desc = カードの説明
  */
  console.log("リストにあるカードの一覧の取得");
  var cardListURL = 'https://api.trello.com/1/lists/' + ListId + '/cards'
  + '?key=' + Key
  + '&token=' + Trello_Token
  + '&fields=id,name,dateLastActivity,shortUrl,desc';
    
  //カードの一覧取得要求
  var response = UrlFetchApp.fetch(cardListURL);

  //取得した情報をJSON形式に変換
  var json = JSON.parse(response.getContentText("UTF-8"));

  ///現在時刻の取得
  var nowDate = Moment.moment(); 
  // yyyy/mm/dd形式に変換
  var nowDate_format = nowDate.format("YYYY/MM/DD"); 
   
  // 取得したカードの判定
  for (var i in json) {
    // 最終更新日をMoment型にパース      
    var dateLastActivity_moment =  Moment.moment(json[i]["dateLastActivity"]); 
    //最終更新日 + 7日
    var dateLastActivity_moment_add = dateLastActivity_moment.add(7, "days"); 
    //　表示形式を変換
    var dateLastActivity_format = dateLastActivity_moment_add.format("YYYY/MM/DD");   
   
    //　日付の比較（現在＞日付加算後）
    //  Moment.moment(現在日付).isAfter(最終更新日＋７日);
    if (Moment.moment(nowDate_format).isAfter(dateLastActivity_format)){
      
      console.log("完了してから最終更新日から７日経過したカードをアーカイブする");
      
      // 対象のカード内容（ログ出力）
      console.log("カードの名称 = "+json[i]["name"]);
      console.log("最終更新日 = "+json[i]["dateLastActivity"]);
      console.log("カードのURL = "+json[i]["shortUrl"]);
      
      //　スプレッドシート出力
      outputSpreadsheet(nowDate_format,dateLastActivity_format,json[i]);
      
      // 対象のカードをアーカイブ
      var cardURL = 'https://api.trello.com/1/cards/' + json[i]["id"]
      + '?key=' + Key
      + '&token=' + Trello_Token
      + '&closed=true';
      UrlFetchApp.fetch(cardURL, {'method' : 'put'});
    }
  }       
}
```

###②アーカイブしたカードをスプレッドシートに出力（累積させる）

```javascript:outputSpreadsheet.gs
// スプレッドシートにアーカイブしたカードを出力
function outputSpreadsheet(nowDate_format,dateLastActivity_format,json) {
 
  // スプレッドシートの取得 
  const sheet = SpreadsheetApp.getActive().getSheetByName('archived_log');  
 
  // 最終行の取得
  const lastRow = sheet.getLastRow();
  
  // 出力
  var outputRow = lastRow + 1;
  sheet.getRange(outputRow, 1).setValue(nowDate_format);  // アーカイブ実施日
  sheet.getRange(outputRow, 2).setValue(json["name"]); // カード名称
  sheet.getRange(outputRow, 3).setValue(json["desc"]); // カードの説明
  sheet.getRange(outputRow, 4).setValue(dateLastActivity_format); // カードの最終更新日
  sheet.getRange(outputRow, 5).setValue(json["shortUrl"]); // カードのショートURL   
}

```

#コード作成後の作業

あとはスクリプトを時限式のイベントトリガーで指定した時間に自動起動するように設定するだけです。
私は上記①のスクリプトを毎朝７～８時くらいに起動するように設定しました。

#最後に

タスク管理は運用ルールを決めて実施しないと意味がなく、手動だと忘れてしまうことがあるので、自動化できるものは手作業から無くしてしまいましょう！

#参考リンク

- TrelloのカードをGASから自動でアーカイブする。
    - https://qiita.com/nmdk/items/1fc11680897103a5f87c 
- 初心者向け実務で使えるGoogle Apps Script完全マニュアル
    - https://tonari-it.com/google-apps-script-manual/ 
- 日付＆時刻の便利ライブラリ「Moment.js」をGoogle Apps Scriptで使う方法
    - https://tonari-it.com/gas-moment-js-moment/
- GASを使ってTrelloのボードID・リストID・カードIDを取得する方法
    - https://qiita.com/RYOSUKE310/items/016549922a17376efdf8
- GAS版Moment.jsライブラリで超簡単に日時の比較をする方法
    - https://tonari-it.com/gas-moment-issame-isbefore-isafter/
- 時限式のイベントトリガーを設置して決まった時刻にBotを送信する方法
    - https://tonari-it.com/gas-timed-driven-trigger/
- GASでログ出力する2つの方法(Logger.logとconsole.log)の紹介と使い分け
    - https://tanuhack.com/gas-log/