タスク管理ツールTrelloとチャットワークをGoogle Apps Scriptで連携させてみた

タスク管理ツールTrelloとチャットワークをGoogle Apps Scriptで連携させてみた。
復習のためまとめておく。

環境:Windows10 (LinuxなどUnix的な環境なら不要なこと多しw)

やりたかったこと

Trelloで、セルフアサインのタスク管理で、

・Trelloで「未着手」→「作業中」にタスク移動
・Trelloで「作業中」→「確認待ち」にタスク移動
・Trelloで「確認待ち」→「完了」にタスク移動
・Trelloで「コメント」
時に、チャットワークにメッセージ送信

・Trelloで「未着手」→「作業中」にタスク移動
時に、移動したメンバーをカードに追加

事前準備

curl と jq と less

設定と確認で使用するツールの準備。自分のマシンに入っていなければ、下記などからインストールする。

curlのインストール – Qiita 
curl 

jqをWindowsマシンにインストールして使ってみる – Qiita 
jq 

(lessは日本語の文字化け解消化け対策。文字化けしないなら下記移行で省略OK)
Windows 7で利用するCUIコマンドを“単品”で追加するなら「GnuWin32」(1) – builder by ZDNet Japan 
Less for Windows 

TrelloのAPI必要情報の取得

trelloのAPIを使ってみる -シェルスクリプト- – Qiita
などを参考に、下記を取得する

  • 開発者向けAPIキーの取得  → APIKey
  • Tokenの取得  → APIToken
  • (Cardの情報を取得)

Trelloのボード情報の取得

TrelloのuserId はこれ → userId
以下{}でくくられた部分({userId} {APIKey}  {APIToken} などは)は、ご自身のモノに置き換えてください。
以下、
  • {}でくくられた部分の{}文字自体は取り除いてください。{userId}  → user01234  など)
  • cmdなどでのコマンドの入力は、表示上改行されているように見えても、改行しないで1行で入力してください。
curl “https://trello.com/1/members/{userId}/boards?key= “{APIKey}” &token= {APIToken} &fields=id,name” | less -F |  jq
   ↓
[
 {
  "name": "test",
  "id": "5cxxxxxxxxxxxxxxxxxxxxxxx"
 }
]
5cxxxxxxxxxxxxxxxxxxxxxxx がボードのIDです   → boardId
ボードが複数有る場合、対象のボードIDを記録しておいてください。

 

TrelloのWebhook登録のためのGoogle Apps Script準備

TrelloのWebhook API登録のために、Google Apps Scriptで doGet()とdoPost() とを空で作っておく

function doGet(e){

}

function doPost(e){

}

Google Apps Script 自体については、下記など参照

【初心者向けGAS】本当の最初の一歩!スクリプトエディタでプロジェクトを開く
【初心者向けGAS】はじめてのスクリプトを作成し、保存し、実行する

「公開」→「ウェブアップリケーションとして実行」

{GoogleAppsScriptUrl}をコピーしておく、
アプリケーションにアクセスできるユーザーは、登録段階では、「全員」にしておく(「全員」(匿名ユーザーを含む)ではなく)参考:Trello Webhook × GoogleAppsScript の連携してカンバンの分析を楽にして見る の 1. GASのURLの準備(公開設定は全員に)- Qiita 

{GoogleAppsScriptUrl} にアクセスできるか確認しておく

curl -I {GoogleAppsScriptUrl}
で、下記のレスポンスが帰ってくることを確認しておく。(ここで、403が返ってくると登録できない)
HTTP/1.1 302 Moved Temporarily

TrelloのWebhook登録

“test2″の部分は任意(スペースが入っていない方がトラブル少ない)
cmd でも bash でも通ること確認しているコマンド

curl -X POST -H “Content-Type: application/json” -d “{\”key\”:\”{APIKey}\”,\”callbackURL\”:\”{GoogleAppsScriptUrl}\”,\”idModel\”:\”{boardId}\”,\”description\”:\”test2\”}” https://api.trello.com/1/tokens/{APIToken}/webhooks/ | jq

下記の様なレスポンスが帰ってくれば成功

{
 "id": "5yyyyyyyyyyyyyyyyyyyyy",              ←  Webhook登録されたID
 "description": "test2",
 "idModel": "5cxxxxxxxxxxxxxxxxxxxxxxx",
 "callbackURL": "https://script.google.com/macros/s/AKkkkk/exec", ← 登録された{GoogleAppsScriptUrl}
 "active": true
}

登録できたか確認したい場合は、以下のコマンドで、上記の結果が帰ってきます。
curl https://trello.com/1/tokens/{APIToken}/webhooks/?key={APIKey} | jq

登録しなおしたい場合は、下記で削除して、再登録。
curl -X “DELETE” “https://api.trello.com/1/webhooks/{Webhook登録されたID}?key={APIKey} &token={APIToken}

チャットワークの情報取得

チャットワークのToken

API Token | Chatwork 

チャットワークのROOM_ID

API Token | Chatwork 

コード

エイヤで書いて、とりあえず動いたレベルのモノです。
下記の部分は、ご自身の環境に合わせてください。
var trelloKey = ‘{APIKey} ‘;
var trelloToken = ‘{APIKey} ‘;
var CHATWORK_TOKEN = ‘{チャットワークのToken}’
var ROOM_ID = ‘{チャットワークのROOM_ID}’

コードを変更した場合は、「公開」→「ウェブアプリケーションとして導入・・・」をクリック

プロジェクトバージョンで「新規登録」を選択。「更新」ボタンをクリックして保存
参考:GoogleAppsScriptで修正が反映されない – Qiita 

var trelloKey = '{APIKey} '; 
var trelloToken = '{APIKey} '; 
var CHATWORK_TOKEN = '{チャットワークのToken}'
var ROOM_ID = '{チャットワークのROOM_ID}'
  
//TrelloのWebhookから呼ばれる
function doPost(e){
  console.log('doGost()');
  
  var contents = JSON.parse(e.postData.contents);
  console.log(contents);
  var cardName ='';
  var shortLink = '';
  var message = '';
  var member = '';
  var cardShortLink = '';
  var actionType = contents.action.type;
  console.log('actionType = ' +  actionType);
  
  switch (actionType) {
  case "updateCard":
      console.log('updateCard');
      if(!contents.action.data.listAfter)
      {
        console.log('contents.action.data.listAfter 無し');
        return;
      }
      listAfterName = contents.action.data.listAfter.name;
      listBeforeName = contents.action.data.listBefore.name;
      if (((listBeforeName === '未着手') && (listAfterName === '作業中')) || 
          ((listBeforeName === '作業中') && (listAfterName === '確認待ち')) ||
          ((listBeforeName === '確認待ち') && (listAfterName === '完了')) 
            ){
              cardName = contents.action.data.card.name;
              cardShortLink = 'https://trello.com/c/' + contents.action.data.card.shortLink;
              member = contents.action.memberCreator.initials;   
              message = member + "さんが [" + listBeforeName + "] → [" + listAfterName + "] に移動";
              postChatwork(message, cardShortLink, cardName); 
              if((listBeforeName === '未着手') && (listAfterName === '作業中')){
                postUrl = "https://api.trello.com/1/cards/" + contents.action.data.card.id + "/idMembers?key=" + trelloKey + "&token=" + trelloToken + "&value=" + contents.action.memberCreator.id;
                console.log("カードにメンバーを追加 " + postUrl);
                sendHttpPost(postUrl);
                message = member + "さんをタスクのメンバーに追加しました。"
                postChatwork(message,cardShortLink,cardName);        
              }
          } else {
            return;
          }

      break;
  case "commentCard":
      cardName = contents.action.data.card.name;
      cardShortLink = 'https://trello.com/c/' + contents.action.data.card.shortLink;  
      member = contents.action.memberCreator.initials;   
      var comment = contents.action.data.text
      message = member + "さんがコメント。";
      optionMessage = "---\n" +
        comment + "\n" +
          "---\n" +
        "このコメントに返信・追加 → " + cardShortLink;
      postChatwork(message,cardShortLink,cardName,optionMessage);
      break;
  default:
      break;
  }
}

function postChatwork(messageBody,cardShortLink,cardName,optionMessage){
  messageBody = "【タスク管理】" + messageBody + "\n" +
    " (タスクカード: " + cardShortLink + " ) " + cardName;
  if(optionMessage){
    messageBody += "\n" + optionMessage ;
  }
  console.log('messageBody = ' +  messageBody);
  
  var options = {
    "method" : "post",
    "headers" : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    "payload" : {"body" :  messageBody, "self_unread" : "1" }
  }
  var url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID + "/messages"
  UrlFetchApp.fetch(url, options)
}

function sendHttpPost(url, message){
  if(!message){
    message = "";
  }
   var payload =
   {
     "message" : message
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

   UrlFetchApp.fetch(url, options);
}

//TrelloのWebhookから呼ばれることは無い
function doGet(e){
  console.log('doPost()');
}

デバッグ

console.log(); での出力を、”表示” → “Stackdriver Logging”  のログで確認していくことで確認できます。

コメント

タイトルとURLをコピーしました