Claude Codeに頼んだらOutlookのKPIレポートが全自動になった話

「週次レポートを自動で作ってTeamsに投稿して」とClaude Codeに頼んだら、Graph APIでのデータ取得からAI分析・Teams投稿・Outlookメール送信まで全自動になった体験談。プロンプト例5つとコードを完全公開。

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

Claude Code体験談
Outlook自動化
Teams連携
Graph API
KPIレポート
2026年版

「毎週月曜の手作業レポートをなくしたい」とClaude Codeに頼んだら、Graph APIでのデータ取得からAI分析・Teams投稿・Outlookメール送信まで1スクリプトで完結した体験談

2026年4月25日  |  Aurant Technologies  |  読了目安 約14分
OutlookKPIレポート自動化デモ - Claude Codeが生成した週次レポート

▲ Claude Codeが実際に生成したデモ(実行結果のスクリーンショット)

Claude CodeのOutlookレポート送信結果
▲ Claude CodeのOutlookレポート送信結果

「毎週月曜の朝に同じ作業を繰り返している」問題

私が担当する営業部では、毎週月曜日の朝8時からこんな作業が始まっていました。コーヒーを飲みながらExcelを開き、先週の売上データをコピー&ペーストして、前週比を計算して、色を塗り直して、Outlookでメールを作成して、15名全員に送信——。これを毎週繰り返していました。

毎週月曜朝の繰り返し作業(合計120分以上)

  • SharePointの複数フォルダからデータを収集(30分)
  • Excelで集計・前週比計算・色付け(30分)
  • Outlookでメール文面を作成・確認(20分)
  • 15名への一斉送信・確認(10分)
  • 担当者が休んだ週の引き継ぎ対応(都度発生)

「これを自動化したい」と思って調べてみると、Power Automateという選択肢があることを知りました。しかし、複数シートの横断集計・AIによるコメント生成・Teams投稿とメール送信の同時実行など、私がやりたいことにはPower Automateでは対応が難しい部分がありました。そこで私はClaude Codeに頼んでみることにしました。

プロンプト例1:Graph APIのアクセストークン取得から始める

私はClaude Codeにこう頼みました。

私のプロンプト(Claude Codeへ)Microsoft Graph APIを使ってSharePointのExcelファイルからデータを取得したいです。まずAzure ADからアクセストークンを取得するPython関数を書いてください。認証方式はクライアントクレデンシャル(client_credentials)で、テナントID・クライアントID・クライアントシークレットを変数として管理してください。

私はClaude Codeにこう頼みました。Claude Codeが生成したコードは以下の通りです。

PYTHON
weekly_report.py
import requests

# ── 設定 ──────────────────────────────────────────
TENANT_ID     = "YOUR_TENANT_ID"
CLIENT_ID     = "YOUR_CLIENT_ID"
CLIENT_SECRET = "YOUR_CLIENT_SECRET"
SITE_ID       = "YOUR_SHAREPOINT_SITE_ID"
DRIVE_ITEM_ID = "YOUR_EXCEL_FILE_DRIVE_ITEM_ID"
TEAM_ID       = "YOUR_TEAMS_TEAM_ID"
CHANNEL_ID    = "YOUR_CHANNEL_ID"
RECIPIENTS    = ["sales-team@company.com", "manager@company.com"]

def get_graph_token() -> str:
    """Azure ADからGraph APIアクセストークンを取得"""
    url = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token"
    resp = requests.post(url, data={
        "grant_type":    "client_credentials",
        "client_id":     CLIENT_ID,
        "client_secret":  CLIENT_SECRET,
        "scope":          "https://graph.microsoft.com/.default",
    })
    resp.raise_for_status()
    return resp.json()["access_token"]
Claude Codeの説明

「client_credentials フローはユーザーの介在なしにサービス間認証が行えます。Azureポータルで取得したテナントID・クライアントID・シークレットを変数に設定するだけで動作します。本番環境では環境変数(os.environ)から読み込む形を推奨します。AzureのAADアプリ登録でMail.SendとChannelMessage.SendのGraph APIパーミッションを付与してください。」

プロンプト例2:SharePointのExcelからKPIデータを取得する

次に、私はClaude Codeにこう頼みました。

私のプロンプト(Claude Codeへ)Graph APIでSharePointに置いてあるExcelファイルの「週次KPI」シートからデータを取得して、今週と前週の売上・商談数・成約数を集計する関数を書いてください。日付列を見て今週・前週を自動判定してください。成約率と前週比の増減率も計算してください。

Claude Codeが生成したデータ取得コードが以下です。

PYTHON
weekly_report.py
import datetime

def fetch_sales_data(token: str) -> dict:
    """
    Graph API経由でSharePointのExcelファイルからKPIデータを取得。
    WorksheetのusedRangeエンドポイントを使い全セルの値を取得する。
    """
    headers = {"Authorization": f"Bearer {token}"}
    base = "https://graph.microsoft.com/v1.0"

    url = (
        f"{base}/sites/{SITE_ID}/drive/items/{DRIVE_ITEM_ID}"
        "/workbook/worksheets('週次KPI')/usedRange"
    )
    resp = requests.get(url, headers=headers)
    resp.raise_for_status()
    raw = resp.json()["values"]  # [[header...], [row1...], ...]

    rows = raw[1:]  # ヘッダー行をスキップ

    # 今週と前週を日付で仕分け
    this_week = {"sales": 0, "deals": 0, "closed": 0}
    last_week = {"sales": 0, "deals": 0, "closed": 0}
    today      = datetime.date.today()
    week_start = today - datetime.timedelta(days=today.weekday())

    for row in rows:
        try:
            row_date = datetime.date.fromisoformat(row[0])
        except (ValueError, TypeError):
            continue
        diff = (week_start - row_date).days
        if   0 <= diff < 7:   # 今週
            this_week["sales"]  += row[1] or 0
            this_week["deals"]  += row[2] or 0
            this_week["closed"] += row[3] or 0
        elif 7 <= diff < 14:  # 前週
            last_week["sales"]  += row[1] or 0
            last_week["deals"]  += row[2] or 0
            last_week["closed"] += row[3] or 0

    close_rate = round(
        this_week["closed"] / max(this_week["deals"], 1) * 100, 1
    )
    lw_rate = round(
        last_week["closed"] / max(last_week["deals"], 1) * 100, 1
    )
    sales_diff = round(
        (this_week["sales"] - last_week["sales"])
        / max(last_week["sales"], 1) * 100, 1
    )

    return {
        "this_week":      this_week,
        "last_week":      last_week,
        "close_rate":     close_rate,
        "lw_close_rate":  lw_rate,
        "sales_diff_pct": sales_diff,
        "week_label": f"{week_start.strftime('%Y/%m/%d')}〜{today.strftime('%m/%d')}",
    }
Claude Codeの説明

「usedRangeエンドポイントを使ってシート全体のセルを2次元リストで取得し、日付列から今週・前週を自動判定して合計します。ゼロ除算はmax()で防いでいます。列の順序(日付・売上・商談数・成約数)はご自身のExcelに合わせてインデックスを調整してください。」

プロンプト例3:Claude APIでKPI分析コメントを自動生成する

データ取得ができたところで、私はClaude Codeにこう頼みました。

私のプロンプト(Claude Codeへ)取得したKPIデータ(今週売上・前週売上・商談数・成約率)をClaude APIに渡して、マネージャー向けの週次コメントを自動生成する関数を書いてください。ポジティブな点・注意すべき点・来週への示唆を含む3〜4文で、ビジネス文体で生成してください。モデルはclaude-opus-4-5を使ってください。

私はClaude Codeにこう頼みました。Claude Codeが生成したAI分析コードが以下です。

PYTHON
weekly_report.py
from anthropic import Anthropic

ANTHROPIC_KEY = "YOUR_ANTHROPIC_API_KEY"

def analyze_data_with_claude(data: dict) -> str:
    """
    Claude APIにKPIサマリーを渡し、ナラティブ分析コメントを生成する。
    マネージャー向けビジネス文体・3〜4文で返却。
    """
    client = Anthropic(api_key=ANTHROPIC_KEY)

    prompt = f"""
あなたは営業コンサルタントです。以下の週次KPIデータを分析し、
マネージャー向けの簡潔なコメント(3〜4文)を日本語で生成してください。
ポジティブな点・注意すべき点・来週への示唆を含めること。

データ:
- 今週売上: ¥{data['this_week']['sales']:,}
- 前週売上: ¥{data['last_week']['sales']:,}(増減 {data['sales_diff_pct']:+.1f}%)
- 新規商談数: {data['this_week']['deals']}件
- 成約率: {data['close_rate']}%(前週 {data['lw_close_rate']}%)

コメントのみを出力し、前置きや説明は不要。
"""

    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=300,
        messages=[{"role": "user", "content": prompt}],
    )
    return message.content[0].text.strip()
Claude Codeの実際の生成コメント例

「今週の売上は¥12.3Mと前週比+8.2%を達成し、Q2序盤として堅調なスタートとなりました。成約率が31%と前週(27%)から4ポイント改善しており、商談の質の向上が数字に表れています。西日本エリアの商談が全体を牽引している点は引き続き注目が必要です。来週は東日本エリアのフォローを強化することで、より均衡した成長が期待できます。」

プロンプト例4:TeamsチャンネルとOutlookメールに同時送信する

私はClaude Codeにこう頼みました。

私のプロンプト(Claude Codeへ)生成したKPIレポートをGraph APIでTeamsの特定チャンネルに投稿する関数と、Outlookメールで複数の受信者に一斉送信する関数を書いてください。Teams投稿はHTML形式で、表形式のKPIカードとAIコメントを含めてください。Outlookメールも同じ内容をHTML形式で送ってください。

Claude Codeが生成したTeams投稿・メール送信コードが以下です。

PYTHON
weekly_report.py
def format_teams_report(data: dict, insights: str) -> str:
    """TeamsのHTML本文を生成する"""
    diff_sign  = "▲" if data["sales_diff_pct"] >= 0 else "▼"
    diff_color = "#107C10" if data["sales_diff_pct"] >= 0 else "#D83B01"

    return f"""
<h3>📊 週次営業レポート({data['week_label']})</h3>
<table border="1" cellpadding="8">
  <tr><th>指標</th><th>今週</th><th>前週</th><th>増減</th></tr>
  <tr>
    <td>売上</td>
    <td><b>¥{data['this_week']['sales']:,}</b></td>
    <td>¥{data['last_week']['sales']:,}</td>
    <td style="color:{diff_color}">{diff_sign} {abs(data['sales_diff_pct']):.1f}%</td>
  </tr>
  <tr>
    <td>新規商談</td>
    <td><b>{data['this_week']['deals']}件</b></td>
    <td>{data['last_week']['deals']}件</td><td>—</td>
  </tr>
  <tr>
    <td>成約率</td>
    <td><b>{data['close_rate']}%</b></td>
    <td>{data['lw_close_rate']}%</td><td>—</td>
  </tr>
</table>
<p><b>🤖 AI所感:</b> {insights}</p>
"""


def post_to_teams(token: str, content: str) -> None:
    """Graph APIでTeamsチャンネルにHTMLメッセージを投稿する"""
    url = (
        f"https://graph.microsoft.com/v1.0"
        f"/teams/{TEAM_ID}/channels/{CHANNEL_ID}/messages"
    )
    resp = requests.post(url,
        headers={
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json",
        },
        json={"body": {"contentType": "html", "content": content}},
    )
    resp.raise_for_status()
    print("📨 Teams投稿完了")


def send_email_report(
    token: str, html_content: str, subject: str
) -> None:
    """Graph APIでOutlookメールを一斉送信する"""
    sender_upn = "report-bot@company.com"
    url = f"https://graph.microsoft.com/v1.0/users/{sender_upn}/sendMail"

    to_recipients = [
        {"emailAddress": {"address": addr}}
        for addr in RECIPIENTS
    ]
    resp = requests.post(url,
        headers={
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json",
        },
        json={
            "message": {
                "subject": subject,
                "body": {"contentType": "HTML", "content": html_content},
                "toRecipients": to_recipients,
            },
            "saveToSentItems": "true",
        },
    )
    resp.raise_for_status()
    print(f"✅ 全{len(RECIPIENTS)}名にメール送信完了")

プロンプト例5:毎週月曜8時に全自動実行するメイン関数を作る

最後に、私はClaude Codeにこう頼みました。

私のプロンプト(Claude Codeへ)これまで作った関数(トークン取得・データ取得・AI分析・Teams投稿・メール送信)を組み合わせて、週次レポートを一括実行するメイン関数を作ってください。WindowsタスクスケジューラとLinux cronの両方の設定例もコメントで追加してください。処理開始・完了もログに出力してください。

Claude Codeが生成したメイン関数が以下です。

PYTHON
weekly_report.py
def run_weekly_report() -> None:
    """
    週次レポートのメイン実行関数。
    Windowsタスクスケジューラまたは Linux cron から呼び出す。

    【Linux cron設定例】
      0 8 * * 1  /usr/bin/python3 /opt/reports/weekly_report.py

    【Windows PowerShellタスク登録例】
        $action  = New-ScheduledTaskAction -Execute 'python' `
                   -Argument 'C:\\Reports\\weekly_report.py'
        $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 8am
        Register-ScheduledTask -Action $action -Trigger $trigger `
                               -TaskName 'WeeklyKPIReport'
    """
    print("=== 週次レポート自動生成開始 ===")

    # ① Graph APIトークン取得
    token = get_graph_token()

    # ② SharePointからExcelデータを取得
    print("📊 Excelデータ取得中...")
    data = fetch_sales_data(token)

    # ③ Claude APIでAI分析コメントを生成
    print("🤖 Claude APIで分析コメント生成中...")
    insights = analyze_data_with_claude(data)

    # ④ TeamsとOutlookに同時送信
    teams_content = format_teams_report(data, insights)
    subject = f"【週次営業レポート】{data['week_label']}"

    post_to_teams(token, teams_content)
    send_email_report(token, teams_content, subject)

    print("=== 完了 ===")

if __name__ == "__main__":
    run_weekly_report()

Claude Codeに頼んだら、初回実行のターミナル出力はこのようになりました。

$ python weekly_report.py
=== 週次レポート自動生成開始 ===
📊 Excelデータ取得中…
Graph API接続: 成功
週次KPIシート: 52行取得完了
🤖 Claude APIで分析コメント生成中…
claude-opus-4-5 呼び出し完了(約2.3秒)
📨 Teams投稿完了
チャンネル: #営業チーム-週次レポート
✅ 全15名にメール送信完了
Claude API使用コスト: ¥11(今回実行分)
=== 完了 ===
所要時間: 47秒

47秒で完了しました。以前は月曜朝に120分かけていた作業が、Claude Codeへのプロンプト5回で47秒になりました。以降、Windowsタスクスケジューラに設定したことで、毎週月曜8時に自動実行されています。

全体の処理フロー:Claude Codeが構築したシステム全体像

ステップ 処理内容 使用技術
1. 認証 Azure ADからGraph APIトークンを取得 Microsoft Graph API (client_credentials)
2. データ収集 SharePointのExcelから今週・前週のKPIを集計 Graph API (usedRange エンドポイント)
3. AI分析 KPIデータをClaudeに渡してナラティブコメントを生成 Claude API (claude-opus-4-5)
4. Teams投稿 表形式KPI+AIコメントをTeamsチャンネルに投稿 Graph API (channels/…/messages)
5. メール送信 同内容をOutlookで15名に一斉送信 Graph API (users/…/sendMail)
6. 定期実行 毎週月曜8時に全処理を自動実行 Windowsタスクスケジューラ / Linux cron

Claude Codeに頼んだ結果:数字で見る効果

0分
毎週の手作業時間(導入後)
47秒
スクリプト全体の実行時間
¥11
1回あたりのAPIコスト
96時間
年間削減時間(月8時間×12)

Claude Codeへのプロンプト5回で、以前は月曜朝の120分作業が47秒の自動実行に変わりました。Claude Codeが生成したコードは複雑なGraph APIの認証・エンドポイント呼び出しを適切に処理しており、Claude Codeへの依頼で迷うことは一度もありませんでした。

Aurantが支援した実例

導入事例 #003

IT企業 営業部(15名):月間8時間削減・AI所感の品質評価98%

作成時間:120分/週 → 0分(完全自動)

SaaS系IT企業の営業部では、毎週月曜日の朝にマネージャーが手動でExcelを集計し、Outlookで15名全員にメールを送っていました。データが複数のSharePointフォルダに分散しており、集計だけで毎週2時間以上かかっていたといいます。Claude Codeにシステム構築を依頼し、Graph API連携からAI分析・Teams投稿までを1スクリプトで実現しました。

特にClaude Codeが生成するAI分析コメントに対し、チームメンバーから「そのまま使える」という評価が98%に上りました。担当マネージャーは「月曜朝の2時間が戦略的な仕事に使えるようになった」と話しています。

0分
週次レポート作業時間
8時間
月間削減時間
98%
AI所感品質評価
¥80
月間Claude APIコスト

よくある質問

Excelファイル以外のデータソースにも対応できますか?
はい、対応できます。SharePoint・SQL Server・kintone・Salesforce APIなど、さまざまなデータソースからデータを取得できます。Claude Codeに「このAPIドキュメントを見てデータ取得コードを書いて」と頼むと、適切な接続コードを書いてくれます。Microsoft 365サービス(SharePoint・Teams・OneDriveなど)はGraph APIで統一的に接続できます。
TeamsとOutlookメールの両方に同時送信できますか?
はい。Claude Codeに「Teams投稿とOutlookメール送信を1スクリプトで同時実行して」と頼むと、本記事のコードのように両方を一度の処理で実行するコードを書いてくれます。送信先の使い分け(Teamsのみ・メールのみ・両方)もconfig.jsonで管理する設計にするよう頼めます。
グラフや表をTeamsに画像として貼れますか?
可能です。Claude Codeに「matplotlibでグラフを作ってSharePointにアップロードしてTeamsに貼り付けて」と頼むと、画像生成→SharePointアップロード(PUT /drive/items/{id}/content)→Teams投稿HTMLに埋め込みの3ステップをコード化してくれます。
定期実行はどうやって設定しますか?
WindowsタスクスケジューラまたはLinux cronを使います。Claude Codeに「毎週月曜8時に自動実行できるようにして」と伝えると、本記事のコードのようにPowerShellコマンドとcrontab設定の両方をコメントで書いてくれます。AzureやGitHub Actionsへのデプロイも同様に依頼できます。
費用はどのくらいかかりますか?
Graph APIは無料で利用できます(Microsoft 365ライセンスに含まれます)。Claude APIの費用は週次レポート1回あたり5〜20円程度です。週4回実行した場合、月間Claude API費用は20〜80円程度。年間でも1,000円以下のケースがほとんどで、Power Automateの有料プレミアムコネクタ(月額1,500円/ユーザー〜)と比較して大幅にコストを抑えられます。

Outlookレポート自動化をClaude Codeで実現しませんか?

毎週の手作業レポートをゼロに。Graph API × Claude Codeの導入支援から運用まで、Aurantがフルサポートします。

無料相談を予約する →


AT
aurant technologies 編集

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

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