Claude Code x Teams API で週次KPIレポートを自動集計・自動投稿する完全ガイド

Claude Code + Microsoft Teams Webhookで売上・KPI集計結果をTeamsチャンネルに毎日自動投稿。Adaptive Cardsでリッチなダッシュボードを全社共有する実践ガイド。

この記事をシェア:
目次 クリックで開く

2026年4月 | Teams自動化 | KPIレポート・チーム報告

Claude Codeが自動投稿したTeams KPIレポート

▲ Claude Codeが実際に生成した実行結果

毎週の進捗報告作成が30分からゼロになった

チームリーダーの石川です。毎週月曜、先週のKPIをExcelで集計してTeamsに貼り付けるのに30分かかっていました。Claude Codeでデータ収集から集計・Teamsへの自動投稿まで完全自動化し、月曜の朝には自動でKPIレポートが届いています。

この記事で実現すること

✅ 複数システムからKPIを自動収集
✅ 前週比・目標達成率を自動計算
✅ アダプティブカードでリッチな表示
✅ 毎週月曜9時に自動投稿
✅ 担当者への個別メンション通知

STEP 1:複数システムからKPIを自動収集する

Salesforce・GA4・Jiraなど複数システムからKPIデータを自動収集します。

💬 私はClaude Codeにこう頼みました:Salesforceの売上データとGoogle Analytics 4のWebデータを自動取得して
KPIを集計するスクリプトを作ってください。
🤖 Claude Codeの回答:SalesforceとGA4から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を前週比・目標達成率とともに集計します。

💬 私はClaude Codeにこう頼みました:収集したKPIデータに前週比と目標達成率を追加して集計してください。
目標データはExcelの予算ファイルから自動取得します。
🤖 Claude Codeの回答:前週比と目標達成率の自動計算スクリプトを実装しました。
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でリッチなカード形式で表示します。

💬 私はClaude Codeにこう頼みました:KPIデータからTeamsのAdaptive Cardを生成してください。
達成率に応じて緑・黄・赤のカラーバッジを付けてください。
🤖 Claude Codeの回答:KPIに応じたカラーバッジ付き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の担当者をメンションして対策を促します。

💬 私はClaude Codeにこう頼みました:目標を下回っているKPIの担当者をTeamsでメンションして
原因確認と対策を依頼するメッセージを自動投稿してください。
🤖 Claude Codeの回答:未達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が集計・投稿される仕組みを完成させます。

💬 私はClaude Codeにこう頼みました:毎週月曜の朝9時に先週のKPIを自動集計してTeamsに投稿するスケジューラーと
エラー時のアラート機能を追加してください。
🤖 Claude Codeの回答:週次自動実行スケジューラーとエラーアラートを実装しました。
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に自動で届き、手動集計作業がゼロになりました。

どんな現場で使われているか:活用シナリオ

対象者 導入前の課題 Claude Code導入後
営業マネージャー 週次KPI集計をExcelで手作業して月曜の朝に報告書を作成 月曜9時にTeamsに自動投稿されるKPIレポートを全員が確認するだけ
経営陣 各事業部のKPIを収集してまとめる作業に半日かかる 全事業部のKPIが自動集計されてTeamsの経営チャンネルに自動投稿
プロジェクトリーダー プロジェクト進捗を個別にヒアリングして報告書を作成 タスク管理ツールから自動集計してTeamsに週次サマリーを自動投稿

実装で押さえるべき重要ポイント

  • 1
    KPIの集計ロジックをコードに明文化:「売上達成率 = 当月実績 ÷ 月次予算 × 100」のような計算ロジックをコードに明文化することで、担当者が変わっても同じ定義で集計できます。
  • 2
    赤・黄・緑のトラフィックライトで状態を可視化:KPIの達成状況を色で一目でわかるようにAdaptive Cardsに実装することで、数値を読まなくても状況把握できる投稿になります。
  • 3
    過去4週間のトレンドも一緒に投稿:今週の数値だけでなく過去4週間のトレンドを折れ線グラフで添付することで、単発の数値より深い分析ができるKPIレポートになります。

ビジネスインパクト

30分→0分
週次進捗報告作成時間
全員リアルタイム
KPI可視化のスコープ
月曜9時自動
レポート配信タイミング

この記事のまとめ

  • ✅ 複数システムからKPIを自動収集してTeamsに定期投稿できる
  • ✅ Adaptive Cardsで色付きトラフィックライト付きのリッチな投稿ができる
  • ✅ 未達KPIの担当者に自動メンションして改善アクションを促せる
  • ✅ 週次のKPIまとめ作業が完全自動化され報告会の準備がなくなる


よくある質問(FAQ)

A. Excel・CSV・SQLデータベース・Salesforce・kintoneなど様々なデータソースに対応できます。各システムのAPIやExcelエクスポートを経由してデータを集約し、Teamsに投稿するパイプラインを構築できます。複数システムのデータを自動統合することも可能です。

A. Microsoft公式のAdaptive Card Designerでビジュアル編集してJSONを生成するのが最も簡単です。Claude CodeがDesignerで作成したJSONをPythonから動的に生成するコードに変換します。色・アイコン・ボタンを使ったリッチなカードデザインも実装できます。

A. Windowsタスクスケジューラ、Linuxのcron、またはAzure FunctionsやAWS Lambdaのタイマートリガーで定時実行できます。投稿失敗時の再試行・エラー通知も合わせて実装することを推奨します。監視と通知の仕組みをセットで構築することで安定した自動化が実現できます。

📊 この自動化を活用している業種・ケース

営業組織では、SFAのデータを自動集計してTeamsに毎朝投稿することで、チーム全員が進捗を把握してモチベーション維持に繋がっています。
製造業の生産管理では、生産ライン稼働率・不良品率・在庫状況をリアルタイムでTeamsに通知して、問題の早期発見と対応を実現しています。
コールセンター・CS部門では、問い合わせ件数・対応時間・顧客満足度をリアルタイムでTeamsに投稿して、チーム全体のパフォーマンス管理に活用しています。
IT・開発チームでは、CI/CDパイプラインのステータス・バグ件数・デプロイ回数をTeamsで可視化して、開発品質の向上に役立てています。
KPIの自動可視化はチームの一体感と意思決定速度の向上に大きく貢献します。

関連記事


制作実績サンプル

このクオリティの資料が、あなたの業務でも作れます

Aurant Technologies が実際に制作したコンサルティング資料(全82枚)のサンプルです。Claude Code × AI自動化により、従来の1/5のコスト・時間で同等品質を実現します。

タイトルスライド

タイトル・ダーク背景
3カラム分析

3カラム比較・分析
AI活用フロー

AI活用フロー図解
Before/After

Before/After比較
RFPテンプレート

構造化コンテンツ
全10枚を
見る

御社のテーマでこのレベルの資料を作成できます
制作費・納期・自動化プランは無料相談でご確認いただけます

📊 サンプル全10枚を見る →

Claude Codeの導入を、プロに任せてみませんか?

Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。

無料相談を申し込む →


AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: