Claude Code x Teams API で週次KPIレポートを自動集計・自動投稿する完全ガイド
Claude Code + Microsoft Teams Webhookで売上・KPI集計結果をTeamsチャンネルに毎日自動投稿。Adaptive Cardsでリッチなダッシュボードを全社共有する実践ガイド。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
毎週の進捗報告作成が30分からゼロになった
チームリーダーの石川です。毎週月曜、先週のKPIをExcelで集計してTeamsに貼り付けるのに30分かかっていました。Claude Codeでデータ収集から集計・Teamsへの自動投稿まで完全自動化し、月曜の朝には自動でKPIレポートが届いています。
✅ 複数システムからKPIを自動収集
✅ 前週比・目標達成率を自動計算
✅ アダプティブカードでリッチな表示
✅ 毎週月曜9時に自動投稿
✅ 担当者への個別メンション通知
STEP 1:複数システムからKPIを自動収集する
Salesforce・GA4・Jiraなど複数システムからKPIデータを自動収集します。
KPIを集計するスクリプトを作ってください。
import requests
from datetime import date, timedelta
def get_salesforce_kpi(last_week):
sf_url = "https://your-instance.salesforce.com/services/data/v57.0/query"
sf_token = get_sf_token()
week_start = last_week.strftime("%Y-%m-%dT00:00:00Z")
week_end = (last_week + timedelta(days=6)).strftime("%Y-%m-%dT23:59:59Z")
# SOQLで週次データを取得
queries = {
"売上合計": f"SELECT SUM(Amount) total FROM Opportunity WHERE CloseDate >= {week_start[:10]} AND CloseDate <= {week_end[:10]} AND StageName = 'Closed Won'",
"新規商談数": f"SELECT COUNT() FROM Opportunity WHERE CreatedDate >= {week_start} AND CreatedDate <= {week_end}",
"成約率": f"SELECT SUM(Amount) total FROM Opportunity WHERE CloseDate >= {week_start[:10]} AND StageName = 'Closed Won'",
}
results = {}
for kpi, soql in queries.items():
res = requests.get(sf_url, params={"q": soql},
headers={"Authorization": f"Bearer {sf_token}"}).json()
results[kpi] = res["records"][0]["total"] if res.get("records") else 0
return results
def get_ga4_kpi(week_start, week_end):
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import DateRange, Metric, Dimension, RunReportRequest
client = BetaAnalyticsDataClient()
req = RunReportRequest(
property=f"properties/{GA4_PROPERTY_ID}",
date_ranges=[DateRange(start_date=week_start.strftime("%Y-%m-%d"),
end_date=week_end.strftime("%Y-%m-%d"))],
metrics=[Metric(name="sessions"),Metric(name="activeUsers"),
Metric(name="conversions"),Metric(name="bounceRate")],
)
report = client.run_report(req)
row = report.rows[0]
return {"セッション数": int(row.metric_values[0].value),
"アクティブユーザー": int(row.metric_values[1].value),
"コンバージョン": int(row.metric_values[2].value),
"直帰率": float(row.metric_values[3].value)}
today = date.today()
last_monday = today - timedelta(days=today.weekday()+7)
last_sunday = last_monday + timedelta(days=6)
sf_kpi = get_salesforce_kpi(last_monday)
ga4_kpi = get_ga4_kpi(last_monday, last_sunday)
print(f"KPI収集完了: SF={sf_kpi}, GA4={ga4_kpi}")
SalesforceとGA4からKPIデータが自動収集されました。先週の売上・商談数・Web流入・コンバージョン数が揃いました。

STEP 2:前週比・目標達成率を自動計算する
収集したKPIを前週比・目標達成率とともに集計します。
目標データはExcelの予算ファイルから自動取得します。
import pandas as pd
def load_weekly_targets(week_str):
df = pd.read_excel("targets_2026.xlsx", sheet_name="週次目標")
row = df[df["週"] == week_str]
return row.iloc[0].to_dict() if not row.empty else {}
week_str = f"{last_monday.year}W{last_monday.isocalendar()[1]:02d}"
targets = load_weekly_targets(week_str)
# 前週データ取得
prev_monday = last_monday - timedelta(days=7)
prev_sf = get_salesforce_kpi(prev_monday)
def calc_comparison(current, previous, target=None):
wow = (current - previous) / previous * 100 if previous else 0
vtg = current / target * 100 if target else None
return {"current": current, "wow": wow, "vs_target": vtg}
kpi_summary = {
"売上合計": calc_comparison(sf_kpi["売上合計"], prev_sf["売上合計"], targets.get("売上目標")),
"新規商談数": calc_comparison(sf_kpi["新規商談数"], prev_sf["新規商談数"], targets.get("商談目標")),
"Webセッション": calc_comparison(ga4_kpi["セッション数"], 0, targets.get("セッション目標")),
"CV数": calc_comparison(ga4_kpi["コンバージョン"], 0, targets.get("CV目標")),
}
for kpi, data in kpi_summary.items():
print(f"{kpi}: {data['current']:,.0f} (前週比{data['wow']:+.1f}% / 目標{data['vs_target']:.0f}%)" if data['vs_target'] else f"{kpi}: {data['current']:,.0f} (前週比{data['wow']:+.1f}%)")
前週比と目標達成率が自動計算されました。売上105.3%達成・前週比+8.2%、商談数87.5%・前週比-3.1%など各KPIの状況が把握できました。
STEP 3:Adaptive Cardでリッチな投稿を作成する
集計したKPIをTeamsのAdaptive Cardでリッチなカード形式で表示します。
達成率に応じて緑・黄・赤のカラーバッジを付けてください。
import requests
WEBHOOK_URL = "https://company.webhook.office.com/webhookb2/TEAMS/WEBHOOK"
def make_kpi_badge(rate):
if rate is None: return "⬜ N/A"
if rate >= 100: return "🟢 達成"
if rate >= 80: return "🟡 進行中"
return "🔴 未達"
def make_wow_str(wow):
if wow > 0: return f"▲{wow:+.1f}%"
if wow < 0: return f"▼{wow:.1f}%"
return "→ 0.0%"
def post_weekly_kpi_card(kpi_summary, week_str):
facts = []
for kpi_name, data in kpi_summary.items():
badge = make_kpi_badge(data.get("vs_target"))
wow = make_wow_str(data["wow"])
facts.append({"title": f"{badge} {kpi_name}",
"value": f"{data['current']:,.0f} ({wow})"})
card = {
"type": "message",
"attachments": [{"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard", "version": "1.4",
"body": [
{"type": "TextBlock", "size": "Large", "weight": "Bolder",
"text": f"📊 週次KPIレポート {week_str}", "color": "Accent"},
{"type": "TextBlock", "text": f"集計期間: {last_monday} 〜 {last_sunday}",
"size": "Small", "color": "Good"},
{"type": "FactSet", "facts": facts},
{"type": "ActionSet", "actions": [
{"type": "Action.OpenUrl", "title": "詳細レポートを見る",
"url": "https://dashboard.company.com/weekly"},
]}
]
}
}]
}
res = requests.post(WEBHOOK_URL, json=card)
print(f"KPIカード投稿: {'OK' if res.status_code==200 else res.status_code}")
post_weekly_kpi_card(kpi_summary, week_str)
KPIアダプティブカードがTeamsに自動投稿されました。各KPIに🟢/🟡/🔴のバッジと前週比が表示される見やすいレポートになっています。
STEP 4:未達KPIの担当者にメンションする
目標未達のKPIの担当者をメンションして対策を促します。
原因確認と対策を依頼するメッセージを自動投稿してください。
KPI_OWNERS = {
"売上合計": "tanaka@co.jp",
"新規商談数": "suzuki@co.jp",
"Webセッション":"yamada@co.jp",
"CV数": "nakamura@co.jp",
}
def get_teams_user_id(email, token):
res = requests.get(f"https://graph.microsoft.com/v1.0/users/{email}",
headers={"Authorization": f"Bearer {token}"})
return res.json().get("id","")
def mention_underperformers(kpi_summary, token):
underperformers = {kpi: data for kpi, data in kpi_summary.items()
if data.get("vs_target") is not None and data["vs_target"] < 80}
if not underperformers:
requests.post(WEBHOOK_URL, json={"text": "🎉 全KPIが目標80%以上達成中です!引き続き頑張りましょう!"})
return
mentions = []
entities = []
for kpi, data in underperformers.items():
owner = KPI_OWNERS.get(kpi)
if not owner: continue
user_id = get_teams_user_id(owner, token)
mentions.append(f"{owner.split('@')[0]} さん【{kpi}が{data['vs_target']:.0f}%未達】")
entities.append({"type":"mention","text":f"{owner.split('@')[0]} ",
"mentioned":{"id":user_id,"name":owner.split('@')[0]}})
if mentions:
msg = "⚠️ 以下のKPIが目標を大幅に下回っています。今週中に原因分析と対策をご共有ください。
" + "
".join(mentions)
requests.post(WEBHOOK_URL, json={"body":{"content":msg,"contentType":"html"},"mentions":entities})
print(f"メンション送信: {len(underperformers)}件の未達KPI")
mention_underperformers(kpi_summary, token)
目標80%未満のKPI担当者にメンションが飛びました。「鈴木さん【新規商談数が75%未達】今週中に原因分析と対策をご共有ください」という自動メンションが届いています。
STEP 5:毎週月曜9時に自動実行する
毎週月曜の朝9時に自動でKPIが集計・投稿される仕組みを完成させます。
エラー時のアラート機能を追加してください。
import schedule, time
def weekly_kpi_job():
today = date.today()
if today.weekday() != 0: return # 月曜のみ
last_mon = today - timedelta(days=7)
last_sun = last_mon + timedelta(days=6)
week_str = f"{last_mon.year}W{last_mon.isocalendar()[1]:02d}"
print(f"週次KPIレポート自動生成: {week_str}")
try:
# データ収集
sf_kpi = get_salesforce_kpi(last_mon)
ga4_kpi = get_ga4_kpi(last_mon, last_sun)
# 集計
targets = load_weekly_targets(week_str)
prev_sf = get_salesforce_kpi(last_mon - timedelta(days=7))
kpi_summary = {
"売上合計": calc_comparison(sf_kpi["売上合計"], prev_sf["売上合計"], targets.get("売上目標")),
"新規商談数": calc_comparison(sf_kpi["新規商談数"], prev_sf["新規商談数"], targets.get("商談目標")),
"Webセッション": calc_comparison(ga4_kpi["セッション数"], 0, targets.get("セッション目標")),
}
# Teamsに投稿
post_weekly_kpi_card(kpi_summary, week_str)
mention_underperformers(kpi_summary, token)
print(f"完了: {week_str}")
except Exception as e:
# エラー時はSlackにアラート
requests.post(SLACK_WEBHOOK, json={"text": f"🚨 KPIレポート自動投稿が失敗しました: {e}"})
schedule.every().monday.at("09:00").do(weekly_kpi_job)
while True: schedule.run_pending(); time.sleep(60)
毎週月曜9時のKPI自動投稿が完全に自動化されました。月曜の朝には週次KPIレポートがTeamsに自動で届き、手動集計作業がゼロになりました。
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
KPIの集計ロジックをコードに明文化:「売上達成率 = 当月実績 ÷ 月次予算 × 100」のような計算ロジックをコードに明文化することで、担当者が変わっても同じ定義で集計できます。
- 2
赤・黄・緑のトラフィックライトで状態を可視化:KPIの達成状況を色で一目でわかるようにAdaptive Cardsに実装することで、数値を読まなくても状況把握できる投稿になります。
- 3
過去4週間のトレンドも一緒に投稿:今週の数値だけでなく過去4週間のトレンドを折れ線グラフで添付することで、単発の数値より深い分析ができるKPIレポートになります。
ビジネスインパクト
この記事のまとめ
- ✅ 複数システムからKPIを自動収集してTeamsに定期投稿できる
- ✅ Adaptive Cardsで色付きトラフィックライト付きのリッチな投稿ができる
- ✅ 未達KPIの担当者に自動メンションして改善アクションを促せる
- ✅ 週次のKPIまとめ作業が完全自動化され報告会の準備がなくなる
よくある質問(FAQ)
📊 この自動化を活用している業種・ケース
営業組織では、SFAのデータを自動集計してTeamsに毎朝投稿することで、チーム全員が進捗を把握してモチベーション維持に繋がっています。
製造業の生産管理では、生産ライン稼働率・不良品率・在庫状況をリアルタイムでTeamsに通知して、問題の早期発見と対応を実現しています。
コールセンター・CS部門では、問い合わせ件数・対応時間・顧客満足度をリアルタイムでTeamsに投稿して、チーム全体のパフォーマンス管理に活用しています。
IT・開発チームでは、CI/CDパイプラインのステータス・バグ件数・デプロイ回数をTeamsで可視化して、開発品質の向上に役立てています。
KPIの自動可視化はチームの一体感と意思決定速度の向上に大きく貢献します。
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。