Claude Codeに頼んだらOutlookのKPIレポートが全自動になった話
「週次レポートを自動で作ってTeamsに投稿して」とClaude Codeに頼んだら、Graph APIでのデータ取得からAI分析・Teams投稿・Outlookメール送信まで全自動になった体験談。プロンプト例5つとコードを完全公開。
目次 クリックで開く
「毎週月曜の手作業レポートをなくしたい」とClaude Codeに頼んだら、Graph APIでのデータ取得からAI分析・Teams投稿・Outlookメール送信まで1スクリプトで完結した体験談
▲ Claude Codeが実際に生成したデモ(実行結果のスクリーンショット)

「毎週月曜の朝に同じ作業を繰り返している」問題
私が担当する営業部では、毎週月曜日の朝8時からこんな作業が始まっていました。コーヒーを飲みながらExcelを開き、先週の売上データをコピー&ペーストして、前週比を計算して、色を塗り直して、Outlookでメールを作成して、15名全員に送信——。これを毎週繰り返していました。
- SharePointの複数フォルダからデータを収集(30分)
- Excelで集計・前週比計算・色付け(30分)
- Outlookでメール文面を作成・確認(20分)
- 15名への一斉送信・確認(10分)
- 担当者が休んだ週の引き継ぎ対応(都度発生)
「これを自動化したい」と思って調べてみると、Power Automateという選択肢があることを知りました。しかし、複数シートの横断集計・AIによるコメント生成・Teams投稿とメール送信の同時実行など、私がやりたいことにはPower Automateでは対応が難しい部分がありました。そこで私はClaude Codeに頼んでみることにしました。
プロンプト例1:Graph APIのアクセストークン取得から始める
私はClaude Codeにこう頼みました。
私はClaude Codeにこう頼みました。Claude Codeが生成したコードは以下の通りです。
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"]
「client_credentials フローはユーザーの介在なしにサービス間認証が行えます。Azureポータルで取得したテナントID・クライアントID・シークレットを変数に設定するだけで動作します。本番環境では環境変数(os.environ)から読み込む形を推奨します。AzureのAADアプリ登録でMail.SendとChannelMessage.SendのGraph APIパーミッションを付与してください。」
プロンプト例2:SharePointのExcelからKPIデータを取得する
次に、私はClaude Codeにこう頼みました。
Claude Codeが生成したデータ取得コードが以下です。
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')}", }
「usedRangeエンドポイントを使ってシート全体のセルを2次元リストで取得し、日付列から今週・前週を自動判定して合計します。ゼロ除算はmax()で防いでいます。列の順序(日付・売上・商談数・成約数)はご自身のExcelに合わせてインデックスを調整してください。」
プロンプト例3:Claude APIでKPI分析コメントを自動生成する
データ取得ができたところで、私はClaude Codeにこう頼みました。
私はClaude Codeにこう頼みました。Claude Codeが生成したAI分析コードが以下です。
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()
「今週の売上は¥12.3Mと前週比+8.2%を達成し、Q2序盤として堅調なスタートとなりました。成約率が31%と前週(27%)から4ポイント改善しており、商談の質の向上が数字に表れています。西日本エリアの商談が全体を牽引している点は引き続き注目が必要です。来週は東日本エリアのフォローを強化することで、より均衡した成長が期待できます。」
プロンプト例4:TeamsチャンネルとOutlookメールに同時送信する
私はClaude Codeにこう頼みました。
Claude Codeが生成したTeams投稿・メール送信コードが以下です。
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が生成したメイン関数が以下です。
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に頼んだら、初回実行のターミナル出力はこのようになりました。
=== 週次レポート自動生成開始 ===
📊 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に頼んだ結果:数字で見る効果
Claude Codeへのプロンプト5回で、以前は月曜朝の120分作業が47秒の自動実行に変わりました。Claude Codeが生成したコードは複雑なGraph APIの認証・エンドポイント呼び出しを適切に処理しており、Claude Codeへの依頼で迷うことは一度もありませんでした。
Aurantが支援した実例
IT企業 営業部(15名):月間8時間削減・AI所感の品質評価98%
SaaS系IT企業の営業部では、毎週月曜日の朝にマネージャーが手動でExcelを集計し、Outlookで15名全員にメールを送っていました。データが複数のSharePointフォルダに分散しており、集計だけで毎週2時間以上かかっていたといいます。Claude Codeにシステム構築を依頼し、Graph API連携からAI分析・Teams投稿までを1スクリプトで実現しました。
特にClaude Codeが生成するAI分析コメントに対し、チームメンバーから「そのまま使える」という評価が98%に上りました。担当マネージャーは「月曜朝の2時間が戦略的な仕事に使えるようになった」と話しています。
週次レポート作業時間
月間削減時間
AI所感品質評価
月間Claude APIコスト
よくある質問