タスク管理ツールTrelloとチャットワークをGoogle Apps Scriptで連携させてみた。
復習のためまとめておく。
環境:Windows10 (LinuxなどUnix的な環境なら不要なこと多しw)
やりたかったこと
Trelloで、セルフアサインのタスク管理で、
・Trelloで「未着手」→「作業中」にタスク移動
・Trelloで「作業中」→「確認待ち」にタスク移動
・Trelloで「確認待ち」→「完了」にタスク移動
・Trelloで「コメント」
時に、チャットワークにメッセージ送信
・Trelloで「未着手」→「作業中」にタスク移動
時に、移動したメンバーをカードに追加
事前準備
curl と jq と less
設定と確認で使用するツールの準備。自分のマシンに入っていなければ、下記などからインストールする。
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のボード情報の取得
- {}でくくられた部分の{}文字自体は取り除いてください。{userId} → user01234 など)
- cmdなどでのコマンドの入力は、表示上改行されているように見えても、改行しないで1行で入力してください。
[ { "name": "test", "id": "5cxxxxxxxxxxxxxxxxxxxxxxx" } ]
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登録
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
コード
エイヤで書いて、とりあえず動いたレベルのモノです。
下記の部分は、ご自身の環境に合わせてください。
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” のログで確認していくことで確認できます。
コメント