【DX実例】WebアプリケーションとMetabase、AsanaのAPI連携で、シームレスな業務フローの実現
こんにちは、はじめまして。DXゴリラです。
私はプログラマー暦10年超の経験を持ち、これまで社外CTOとして多数のDXプロジェクトに携わってきました。
Twitterアカウントはこちら👇
https://twitter.com/dxsoudan
今回は、WebアプリケーションとMetabase、AsanaのAPI連携によるDXの実現について、より具体的にお話しします。
これらのツールを連携させることで、どのようにシームレスな業務フローが実現できるのか、イメージを湧きやすくしていきましょう。
システム構成の全体像
まず、システムの全体像を簡単に説明します。
カスタムWebアプリケーション:顧客対応や受発注などの基幹業務を管理
Asana:プロジェクト管理、タスク管理、CRM機能を提供
Metabase:データの可視化と分析を担当
API連携:これら3つのシステムをAPIで連携し、データをシームレスに連携
API連携の具体例
それでは、これらのシステムがどのように連携しているか、具体的な例を見ていきましょう。
1. Webアプリケーション → Asana連携
受注状況の自動タスク化
Webアプリケーションで新規受注が入力される
WebアプリケーションがAsanaのAPIを呼び出し、新規タスクを作成
受注情報(顧客名、金額、納期など)がAsanaのタスクのカスタムフィールドに自動入力される
担当者にAsanaで通知が飛び、すぐに対応を開始できる
import { Client as AsanaClient } from 'asana';
interface Order {
id: string;
customerName: string;
amount: number;
deliveryDate: Date;
}
async function createAsanaTask(order: Order): Promise<any> {
const asanaClient = AsanaClient.create().useAccessToken(process.env.ASANA_ACCESS_TOKEN);
try {
const task = await asanaClient.tasks.create({
workspace: process.env.ASANA_WORKSPACE_ID,
projects: [process.env.ASANA_PROJECT_ID],
name: `受注処理: ${order.customerName}`,
custom_fields: {
customer_name: order.customerName,
order_amount: order.amount,
due_date: order.deliveryDate.toISOString()
}
});
return task;
} catch (error) {
console.error('Asanaタスク作成エラー:', error);
throw error;
}
}
2. Asana → Webアプリケーション連携
タスク状況の自動反映
Asanaでタスクのステータスが更新される(例:「処理中」→「完了」)
AsanaのWebhookが設定されており、ステータス変更を検知
WebアプリケーションのAPIがコールされ、対応する受注情報のステータスが更新される
import express, { Request, Response } from 'express';
import { Client as AsanaClient } from 'asana';
const app = express();
app.use(express.json());
const asanaClient = AsanaClient.create().useAccessToken(process.env.ASANA_ACCESS_TOKEN);
interface AsanaWebhookEvent {
events: Array<{
resource: {
gid: string;
};
}>;
}
app.post('/asana_webhook', async (req: Request, res: Response) => {
const data = req.body as AsanaWebhookEvent;
const taskId = data.events[0].resource.gid;
try {
const task = await asanaClient.tasks.findById(taskId);
const orderId = task.custom_fields['order_id'] as string;
const newStatus = task.custom_fields['status'] as string;
await updateOrderStatus(orderId, newStatus);
res.sendStatus(200);
} catch (error) {
console.error('Asanaウェブフックエラー:', error);
res.sendStatus(500);
}
});
async function updateOrderStatus(orderId: string, status: string): Promise<void> {
// データベース更新ロジックをここに実装
}
3. Webアプリケーション・Asana → Metabase連携
リアルタイムデータ分析
WebアプリケーションとAsanaのデータが定期的にデータベースに同期される
Metabaseが各種データベースに接続し、リアルタイムでデータを取得・分析
経営ダッシュボードに最新の情報が表示される
-- Metabaseでの分析クエリ例
SELECT
DATE_TRUNC('day', wa.order_date) as date,
COUNT(wa.id) as total_orders,
SUM(wa.amount) as total_amount,
AVG(EXTRACT(EPOCH FROM (a.completed_at - a.created_at))/3600) as avg_processing_time
FROM
web_app_orders wa
JOIN
asana_tasks a ON wa.id = a.custom_fields->>'order_id'
WHERE
wa.order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY
DATE_TRUNC('day', wa.order_date)
ORDER BY
date
4. Metabase → Asana連携
分析結果に基づくタスク自動作成
Metabaseで特定の条件(例:売上が目標の80%を下回った)を検知
MetabaseのアラートをWebアプリケーションで受信
WebアプリケーションからAsana APIを呼び出し、対応タスクを自動作成
import express, { Request, Response } from 'express';
import { Client as AsanaClient } from 'asana';
const app = express();
app.use(express.json());
const asanaClient = AsanaClient.create().useAccessToken(process.env.ASANA_ACCESS_TOKEN);
interface MetabaseAlert {
alertCondition: string;
currentSales: number;
targetSales: number;
}
app.post('/metabase_alert', async (req: Request, res: Response) => {
const data = req.body as MetabaseAlert;
if (data.alertCondition === 'sales_below_target') {
try {
await createAsanaTask({
name: '売上目標未達対応',
notes: `現在の売上: ${data.currentSales}、目標: ${data.targetSales}`,
projects: [process.env.ASANA_SALES_PROJECT_ID as string]
});
res.sendStatus(200);
} catch (error) {
console.error('Asanaタスク作成エラー:', error);
res.sendStatus(500);
}
} else {
res.sendStatus(400);
}
});
interface AsanaTaskCreate {
name: string;
notes: string;
projects: string[];
}
async function createAsanaTask(taskData: AsanaTaskCreate): Promise<void> {
await asanaClient.tasks.create({
workspace: process.env.ASANA_WORKSPACE_ID,
...taskData
});
}
この連携による効果
1. 情報の瞬時化
受注情報が即座にタスク化され、担当者がすぐに対応可能です。
2. 業務の効率化
タスクのステータス更新が自動的に基幹システムに反映され、二重管理がなくなります。
3. リアルタイム分析
最新のデータがMetabaseに集約され、任意のタイミングで柔軟な分析が可能となります。
4. 能動的な業務改善
分析結果を即座にアクションに繋げることができます。
まとめ:API連携がもたらすDXの可能性
このようなAPI連携により、各ツールの強みを最大限に活かしつつ、シームレスな業務フローを実現することができます。
重要なポイントは以下の通りです。
リアルタイム性:情報が瞬時に関連システムに伝達されること。
自動化:人手を介さずにデータやタスクが更新されること。
データの一元管理:全てのデータが整合性を保ちながら管理されること。
柔軟性:新たな要件や分析ニーズに応じて、連携内容を柔軟に拡張できること。
WebアプリケーションとMetabase、AsanaのようなツールをAPI連携することで、単なる業務のデジタル化を超えた、部門横断的なデジタルトランスフォーメーションを実現することができるのです。
さいごに
お読みいただきありがとうございました。
次回もまた、具体的なDXのすすめかたについて説明していきます。
さて、さいごに宣伝させてください。
読者の中には、
「ゴリラの言っていることが全然わからんのだが・・・?」
「そんなDX人材身近にいないんだけど・・・?」
という方もいるかもしれません。
そんな方に、ゴリラが無料で相談に乗りたいと思います。
これからDXをはじめようとしている方、
DXをはじめたけど行き詰まっている方、
DXがそもそも何か分からない方、
どんな方でも歓迎です。
Xで気軽にDMいただければと思います。
この記事が何かあなたのお役に立てると嬉しいです。
それでは。