タスク管理ツール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行で入力してください。
↓
[
{
"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登録
下記の様なレスポンスが帰ってくれば成功
{
"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
チャットワークの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” のログで確認していくことで確認できます。

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓