こんにちは。AI Native の田中です。
営業データの分析に時間を取られていませんか?本記事では、Googleスプレッドシートの営業データをDifyで自動分析し、結果をスプレッドシートに書き戻すワークフローの実装方法を解説します。OAuth認証からAI分析、結果の自動書き込みまで、完全なコード付きで実装手順をお届けします。
📚 データ品質が分析精度を左右する
営業データ分析の精度は、データの品質とフォーマット統一に大きく依存します。詳しくはAI業務効率化の前提条件:データ整理とフォーマット統一が成功の鍵をご参照ください。
営業データ分析の課題
営業マネージャーや経営層が直面する、営業データ分析における3つの大きな課題があります。
1. 分析に時間がかかりすぎる
多くの企業では、週次や月次の営業会議の前に、担当者が数時間かけて以下のような作業を手作業で行っています:
- Excelやスプレッドシートから営業データを集計
- グラフやピボットテーブルを作成
- 前月比・前年比の計算
- 売上目標との乖離分析
- レポート資料の作成
この作業だけで週5〜10時間、月間20〜40時間が失われています。本来、その時間は顧客対応や戦略立案に使うべきです。
2. 属人化による分析品質のばらつき
営業データの分析が特定の社員に依存している場合、以下の問題が発生します:
- 担当者不在時に分析が止まる: 休暇や退職時に業務が滞る
- 分析の視点が偏る: 担当者の経験や知識に依存した分析
- ノウハウが蓄積されない: 分析手法が組織の資産にならない
- 新人育成に時間がかかる: 複雑な分析ロジックの習得に数ヶ月
3. リアルタイム性の欠如
週次・月次の定期レポートでは、以下のような機会損失が発生します:
- 問題の早期発見ができない: 売上低下に気づくのが1週間〜1ヶ月遅れる
- 迅速な意思決定ができない: データ待ちで対策が後手に回る
- 営業担当者へのフィードバックが遅い: 行動改善の機会を逃す
これらの課題を解決するため、DifyとGoogleスプレッドシートを連携させた自動分析システムを構築しました。
💡 本システムの導入効果
• 分析時間を週10時間 → 10分に短縮(98%削減)
• 誰でも同じ品質の分析レポートを取得可能
• データ更新と同時にリアルタイム分析を実行
• 分析ノウハウをプロンプトとして組織に蓄積
システム概要
本システムは以下の流れで動作します:
- Googleスプレッドシートから営業データを取得
- DifyでAI分析を実行
- 分析結果をスプレッドシートに書き戻し
図1: Googleスプレッドシートの営業データ例
💡 実装のポイント
OAuth認証、データ取得、AI分析、結果書き込みの4つのステップで完全自動化を実現します。
実装パターンの選択
本記事では、2つの実装パターンを紹介します:
パターンA: Google Apps Script(GAS)で実装
メリット:
- Googleスプレッドシート上で直接実行可能
- 追加のサーバー不要で手軽に始められる
- トリガー設定で定期実行が簡単
- OAuth認証が不要(スクリプトの権限で実行)
デメリット:
- 6分の実行時間制限がある
- 複雑な処理には向かない
- バージョン管理やデバッグが難しい
パターンB: Next.jsで実装
メリット:
- 本格的なWebアプリケーションとして構築可能
- 実行時間の制限なし
- Git管理やCI/CDとの統合が容易
- 複雑なビジネスロジックにも対応
デメリット:
- サーバー環境の準備が必要
- OAuth認証の設定が必要
- 初期セットアップに時間がかかる
💡 どちらを選ぶべき?
簡単に始めたい・データ量が少ない → パターンA(GAS)
本格的な運用・大量データ・複雑なロジック → パターンB(Next.js)
パターンA: Google Apps Script(GAS)での実装
ステップ1: スクリプトの作成
Googleスプレッドシートから「拡張機能」→「Apps Script」を開き、以下のコードを貼り付けます。
// スクリプトプロパティに設定
// DIFY_API_KEY: DifyのAPIキー
// DIFY_WORKFLOW_URL: DifyワークフローのURL
function analyzeSalesData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('営業データ');
const resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('分析結果');
// スプレッドシートからデータを取得
const dataRange = sheet.getDataRange();
const data = dataRange.getValues();
// ヘッダー行を除く
const headers = data[0];
const rows = data.slice(1);
// データを整形
const formattedData = rows.map(row => {
const obj = {};
headers.forEach((header, index) => {
obj[header] = row[index];
});
return obj;
});
// Dify APIを呼び出し
const scriptProperties = PropertiesService.getScriptProperties();
const apiKey = scriptProperties.getProperty('DIFY_API_KEY');
const workflowUrl = scriptProperties.getProperty('DIFY_WORKFLOW_URL');
const payload = {
inputs: {
sales_data: JSON.stringify(formattedData)
},
response_mode: 'blocking',
user: 'gas-user'
};
const options = {
method: 'post',
contentType: 'application/json',
headers: {
'Authorization': 'Bearer ' + apiKey
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(workflowUrl, options);
const result = JSON.parse(response.getContentText());
// 分析結果を取得
const analysisResult = JSON.parse(result.data.outputs.result);
// 分析結果をスプレッドシートに書き込み
writeAnalysisResult(resultSheet, analysisResult);
Logger.log('分析完了');
SpreadsheetApp.getUi().alert('分析が完了しました!');
} catch (error) {
Logger.log('エラー: ' + error);
SpreadsheetApp.getUi().alert('エラーが発生しました: ' + error);
}
}
function writeAnalysisResult(sheet, result) {
// シートをクリア
sheet.clear();
// ヘッダーを書き込み
sheet.getRange(1, 1, 1, 3).setValues([['分析項目', '結果', '推奨アクション']]);
sheet.getRange(1, 1, 1, 3).setFontWeight('bold');
// 分析結果を書き込み
const data = [
['売上トレンド', result.trend_analysis, ''],
['顧客パフォーマンス', result.customer_performance, ''],
['商品分析', result.product_analysis, ''],
['改善提案', '', result.recommendations.join('\n')]
];
sheet.getRange(2, 1, data.length, 3).setValues(data);
// 書式設定
sheet.autoResizeColumns(1, 3);
sheet.setFrozenRows(1);
}
// メニューに追加
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('AI分析')
.addItem('営業データを分析', 'analyzeSalesData')
.addToUi();
}
ステップ2: スクリプトプロパティの設定
Apps Scriptエディタで「プロジェクトの設定」→「スクリプトプロパティ」を開き、以下を設定します:
DIFY_API_KEY: DifyのAPIキーDIFY_WORKFLOW_URL: DifyワークフローのエンドポイントURL
ステップ3: 定期実行の設定(オプション)
Apps Scriptエディタで「トリガー」を開き、以下を設定します:
- 実行する関数:
analyzeSalesData - イベントのソース: 時間主導型
- 時間ベースのトリガー: 毎日、毎週、毎月など任意のタイミング
パターンB: Next.jsでの実装
ステップ1: Google OAuth認証の設定
まず、Google Sheets APIを使用するためのOAuth認証を設定します。
Google Cloud Consoleでの設定
- Google Cloud Consoleでプロジェクトを作成
- Google Sheets APIを有効化
- OAuth 2.0認証情報を作成
- リダイレクトURIを設定
環境変数の設定
# .env.local
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/callback/google
SPREADSHEET_ID=your_spreadsheet_id
SHEET_NAME=営業データ
ステップ2: Next.js APIルートの実装
Google Sheets APIとの連携を行うAPIルートを作成します。
認証用APIルート
// app/api/auth/google/route.ts
import { NextRequest, NextResponse } from 'next/server'
export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url)
const code = searchParams.get('code')
if (!code) {
const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth')
authUrl.searchParams.set('client_id', process.env.GOOGLE_CLIENT_ID!)
authUrl.searchParams.set('redirect_uri', process.env.GOOGLE_REDIRECT_URI!)
authUrl.searchParams.set('response_type', 'code')
authUrl.searchParams.set('scope', 'https://www.googleapis.com/auth/spreadsheets')
return NextResponse.redirect(authUrl.toString())
}
// トークン交換処理
const tokenResponse = await fetch('https://oauth2.googleapis.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
client_id: process.env.GOOGLE_CLIENT_ID!,
client_secret: process.env.GOOGLE_CLIENT_SECRET!,
code,
grant_type: 'authorization_code',
redirect_uri: process.env.GOOGLE_REDIRECT_URI!,
}),
})
const tokens = await tokenResponse.json()
return NextResponse.json({ success: true, tokens })
}
データ取得APIルート
// app/api/sheets/data/route.ts
import { NextRequest, NextResponse } from 'next/server'
export async function GET(request: NextRequest) {
const accessToken = request.headers.get('authorization')?.replace('Bearer ', '')
if (!accessToken) {
return NextResponse.json({ error: 'No access token' }, { status: 401 })
}
const spreadsheetId = process.env.SPREADSHEET_ID
const sheetName = process.env.SHEET_NAME
const url = 'https://sheets.googleapis.com/v4/spreadsheets/' + spreadsheetId + '/values/' + sheetName
const response = await fetch(url, {
headers: {
'Authorization': 'Bearer ' + accessToken,
},
})
const data = await response.json()
return NextResponse.json(data)
}
ステップ3: Difyワークフローの設定
Difyで営業データ分析用のワークフローを作成します。
図2: Difyワークフローの全体像
ワークフロー構成
- データ入力ノード: スプレッドシートから取得したデータを受け取る
- データ前処理ノード: データを分析用に整形
- AI分析ノード: LLMでデータ分析を実行
- 結果整形ノード: 分析結果をスプレッドシート用に整形
AI分析プロンプト
以下の営業データを分析し、以下の観点で分析結果を提供してください:
1. 売上トレンド分析
2. 顧客別パフォーマンス分析
3. 商品・サービス別売上分析
4. 改善提案
データ: {{input_data}}
分析結果は以下のJSON形式で出力してください:
{
"trend_analysis": "売上トレンドの分析結果",
"customer_performance": "顧客別パフォーマンス分析",
"product_analysis": "商品・サービス別分析",
"recommendations": "改善提案のリスト"
}
ステップ3: Difyワークフロー統合APIルートの実装
データ取得、Dify分析、結果書き戻しを統合したAPIルートを作成します。
// app/api/workflows/sales-analysis/route.ts
import { readSpreadsheet, writeSpreadsheet, createSheetIfNotExists, clearSheet } from '@/lib/google-sheets'
import { difyClient } from '@/lib/dify-client'
import { NextRequest, NextResponse } from 'next/server'
import { cookies } from 'next/headers'
export async function POST(request: NextRequest) {
try {
const { spreadsheetId, sheetName } = await request.json()
if (!spreadsheetId || !sheetName) {
return NextResponse.json(
{ error: 'spreadsheetId and sheetName are required' },
{ status: 400 }
)
}
const cookieStore = await cookies()
const accessToken = cookieStore.get('google_access_token')?.value
if (!accessToken) {
return NextResponse.json(
{ error: 'Not authenticated. Please login with Google first.' },
{ status: 401 }
)
}
// ステップ1: Google Sheetsからデータ読み取り
const salesData = await readSpreadsheet(accessToken, spreadsheetId, sheetName)
if (!salesData || salesData.length === 0) {
return NextResponse.json(
{ error: 'No data found in spreadsheet' },
{ status: 400 }
)
}
// ステップ2: Dify Workflowで分析
const analysisResult = await difyClient.analyzeSalesData(salesData)
// ステップ3: 分析結果をGoogle Sheetsに書き込み
const currentDate = new Date().toISOString().split('T')[0]
const resultSheetName = '分析結果'
// 分析結果用のシートを作成(存在しない場合)
const isNewSheet = await createSheetIfNotExists(accessToken, spreadsheetId, resultSheetName)
// 既存シートの場合はクリアして最新の結果のみを保持
if (!isNewSheet) {
await clearSheet(accessToken, spreadsheetId, resultSheetName)
}
// Markdown形式の分析結果を改行で分割して行として書き込む
const analysisLines = analysisResult.split('\n').map(line => [line])
// ヘッダー情報と分析結果を書き込み
await writeSpreadsheet(
accessToken,
spreadsheetId,
resultSheetName,
[
['分析日時', currentDate],
['元データシート', sheetName],
[''],
['=== 分析結果 ==='],
[''],
...analysisLines,
]
)
return NextResponse.json({
success: true,
analysisResult,
message: '分析が完了し、結果を「' + resultSheetName + '」シートに書き込みました',
})
} catch (error: any) {
return NextResponse.json(
{ error: error.message || 'Failed to analyze sales data' },
{ status: 500 }
)
}
}
共通: Difyワークフローの設定
パターンA(GAS)とパターンB(Next.js)の両方で使用するDifyワークフローを設定します。
図2: Difyワークフローの全体像
ワークフロー構成
- データ入力ノード: スプレッドシートから取得したデータを受け取る
- データ前処理ノード: データを分析用に整形
- AI分析ノード: LLMでデータ分析を実行
- 結果整形ノード: 分析結果をスプレッドシート用に整形
AI分析プロンプト
以下の営業データを分析し、以下の観点で分析結果を提供してください:
1. 売上トレンド分析
2. 顧客別パフォーマンス分析
3. 商品・サービス別売上分析
4. 改善提案
データ: {{input_data}}
分析結果は以下のJSON形式で出力してください:
{
"trend_analysis": "売上トレンドの分析結果",
"customer_performance": "顧客別パフォーマンス分析",
"product_analysis": "商品・サービス別分析",
"recommendations": "改善提案のリスト"
}
ステップ4: Google Sheets操作ライブラリの実装
Google Sheets APIを扱うための補助ライブラリを作成します。
// lib/google-sheets.ts
import { google } from 'googleapis'
export async function readSpreadsheet(
accessToken: string,
spreadsheetId: string,
sheetName: string
) {
const auth = setCredentials({ access_token: accessToken })
const sheets = google.sheets({ version: 'v4', auth })
const response = await sheets.spreadsheets.values.get({
spreadsheetId,
range: sheetName,
})
return response.data.values || []
}
export async function writeSpreadsheet(
accessToken: string,
spreadsheetId: string,
sheetName: string,
values: any[][]
) {
const auth = setCredentials({ access_token: accessToken })
const sheets = google.sheets({ version: 'v4', auth })
const response = await sheets.spreadsheets.values.append({
spreadsheetId,
range: sheetName,
valueInputOption: 'RAW',
requestBody: {
values,
},
})
return response.data
}
export async function createSheetIfNotExists(
accessToken: string,
spreadsheetId: string,
sheetName: string
): Promise<boolean> {
const auth = setCredentials({ access_token: accessToken })
const sheets = google.sheets({ version: 'v4', auth })
// 既存シートを取得
const spreadsheet = await sheets.spreadsheets.get({
spreadsheetId,
})
const sheetExists = spreadsheet.data.sheets?.some(
(sheet) => sheet.properties?.title === sheetName
)
if (sheetExists) {
return false
}
// 新しいシートを作成
await sheets.spreadsheets.batchUpdate({
spreadsheetId,
requestBody: {
requests: [
{
addSheet: {
properties: {
title: sheetName,
},
},
},
],
},
})
return true
}
ステップ5: Difyクライアントの実装
Dify APIを呼び出すためのクライアントライブラリを作成します。
// lib/dify-client.ts
export class DifyClient {
private apiKey: string
private baseUrl: string
constructor() {
this.apiKey = process.env.DIFY_API_KEY || ''
this.baseUrl = process.env.DIFY_API_BASE_URL || 'https://api.dify.ai/v1'
}
async analyzeSalesData(salesData: any[][]): Promise<string> {
const workflowId = process.env.DIFY_SALES_ANALYSIS_WORKFLOW_ID
if (!workflowId) {
throw new Error('DIFY_SALES_ANALYSIS_WORKFLOW_ID is not set')
}
// 2次元配列をタブ区切りテキストに変換
const dataText = salesData.map((row) => row.join('\t')).join('\n')
// Difyワークフローを実行
const url = this.baseUrl + '/workflows/run'
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + this.apiKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
inputs: {
sales_data: dataText,
},
response_mode: 'blocking',
user: 'sales-analysis-user',
}),
})
if (!response.ok) {
const errorData = await response.json()
throw new Error('Dify API error: ' + errorData.message)
}
const result = await response.json()
// ワークフローの出力から分析結果を取得
const analysisResult = result.data.outputs?.analysis_result ||
result.data.outputs?.text ||
'分析結果を取得できませんでした'
return analysisResult
}
}
export const difyClient = new DifyClient()
ステップ6: フロントエンドの実装
Next.jsのフロントエンドでワークフローを実行するコンポーネントを作成します。
🎯 実際のデモアプリケーション
このコードを実装したデモアプリケーションは /demo/sales-analysis で実際に動作を確認できます。
// app/demo/sales-analysis/page.tsx
'use client'
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
export default function SalesAnalysisPage() {
const [spreadsheetId, setSpreadsheetId] = useState('')
const [sheetName, setSheetName] = useState('Sheet1')
const [analysisResult, setAnalysisResult] = useState<string | null>(null)
const [analyzing, setAnalyzing] = useState(false)
const [error, setError] = useState('')
const handleAnalyze = async () => {
setAnalyzing(true)
setError('')
try {
const response = await fetch('/api/workflows/sales-analysis', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ spreadsheetId, sheetName }),
})
if (!response.ok) {
const errorData = await response.json()
throw new Error(errorData.error || 'Failed to analyze data')
}
const result = await response.json()
setAnalysisResult(result.analysisResult)
} catch (err: any) {
setError(err.message)
} finally {
setAnalyzing(false)
}
}
return (
<div className="container mx-auto px-4 py-8 max-w-4xl">
<h1 className="text-3xl font-bold mb-6">営業データ自動分析</h1>
<Card className="mb-6">
<CardHeader>
<CardTitle>スプレッドシート情報入力</CardTitle>
<CardDescription>
読み取りたいGoogle Sheetsの情報を入力してください
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div>
<label className="block text-sm font-medium mb-2">
スプレッドシートID
</label>
<Input
placeholder="1ABC...xyz"
value={spreadsheetId}
onChange={(e) => setSpreadsheetId(e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium mb-2">
シート名
</label>
<Input
placeholder="営業データ"
value={sheetName}
onChange={(e) => setSheetName(e.target.value)}
/>
</div>
<Button
onClick={handleAnalyze}
disabled={analyzing || !spreadsheetId}
className="w-full"
>
{analyzing ? '分析中...' : '分析実行'}
</Button>
</CardContent>
</Card>
{error && (
<Card className="mb-6 border-red-500">
<CardContent className="pt-6">
<p className="text-red-500">エラー: {error}</p>
</CardContent>
</Card>
)}
{analysisResult && (
<Card className="mb-6">
<CardHeader>
<CardTitle>分析結果</CardTitle>
<CardDescription>
AIによる営業データ分析レポート
(「分析結果」シートにも保存されています)
</CardDescription>
</CardHeader>
<CardContent>
<div className="prose max-w-none">
{analysisResult}
</div>
</CardContent>
</Card>
)}
</div>
)
}
実装のポイント
1. 営業データの設計
効果的な分析を行うためには、スプレッドシートのデータ構造が重要です。
推奨データ項目
| カテゴリ | 項目 | 説明 |
|---|---|---|
| 基本情報 | 受注日 | YYYY-MM-DD形式で統一 |
| 案件ID | 一意の識別子 | |
| 案件名 | 商談内容の概要 | |
| 金額情報 | 売上金額 | 税込金額 |
| 原価 | 粗利計算に必要 | |
| 粗利額 | 売上金額 - 原価 | |
| 粗利率 | 粗利額 / 売上金額 | |
| 予算 | 月次・四半期目標 | |
| 顧客情報 | 顧客名 | 企業名または個人名 |
| 業界 | 製造業、IT、小売など | |
| 地域 | 都道府県または営業所 | |
| 新規/既存 | 顧客区分 | |
| 商品情報 | 商品名 | 販売商品・サービス名 |
| 商品カテゴリ | 大分類・中分類 | |
| 数量 | 販売個数 | |
| 担当者情報 | 営業担当者 | 氏名またはID |
| 所属部門 | 営業部、支店など |
2. セキュリティ対策
- OAuth 2.0認証: 安全な認証フロー
- トークン管理: アクセストークンの適切な管理
- スコープ制限: 必要最小限の権限のみ付与
- 機密情報の保護: 顧客名や金額などの営業機密データの取り扱い
3. エラーハンドリング
- API エラー処理: 各API呼び出しでのエラーハンドリング
- リトライ機能: 一時的なエラーに対するリトライ
- ログ出力: デバッグ用のログ出力
- 通知機能: 分析完了・エラー発生時のSlack/Email通知
4. パフォーマンス最適化
- データ量の制限: 1回の分析で処理するデータ量を適切に設定(GASは6分制限)
- キャッシング: 頻繁にアクセスするデータのキャッシュ
- バッチ処理: 大量データは分割して処理
- 非同期処理: 長時間かかる分析はバックグラウンドで実行
運用とカスタマイズ
定期実行の設定
cronジョブやVercel Cronを使用して、定期的に分析を実行できます。
// vercel.json
{
"crons": [
{
"path": "/api/scheduled-analysis",
"schedule": "0 9 * * 1"
}
]
}
分析項目のカスタマイズ
Difyのプロンプトを変更することで、営業組織のニーズに合わせた様々な分析が可能です。以下、実務で特に効果の高い分析項目を紹介します。
🎯 基本分析項目
1. 売上トレンド分析
- 日次・週次・月次・四半期・年次の売上推移
- 前月比・前年同月比の増減率
- 売上目標に対する達成率
- 成長率の鈍化・加速の検知
2. 顧客セグメント分析
- ABC分析(パレートの法則に基づく顧客分類)
- 新規顧客 vs 既存顧客の売上比率
- 顧客ライフタイムバリュー(LTV)分析
- 離反リスクの高い顧客の特定
3. 商品・サービス別分析
- 商品カテゴリー別の売上構成比
- 利益率の高い商品の特定
- クロスセル・アップセルの機会分析
- 在庫回転率と販売効率
📊 高度な分析項目
4. 地域別・エリア別分析
- 都道府県・市区町村別の売上分布
- 営業拠点ごとのパフォーマンス比較
- 商圏分析と市場浸透率
- 地域特性に応じた戦略立案
5. 業界・業種別分析
- ターゲット業界ごとの売上実績
- 業界別の平均受注単価・商談期間
- 業界特有のニーズと提案パターン
- 参入すべき新規業界の特定
6. 予算・売上目標分析
- 予算達成率と乖離要因の分析
- 四半期・年間目標に対する進捗
- 目標未達部門・担当者の早期特定
- リカバリープランの自動提案
7. 営業担当者別分析
- 個人別の売上実績とランキング
- 商談成約率・平均商談期間
- 訪問件数と受注件数の相関分析
- トップセールスの行動パターン分析
- 育成が必要な担当者の特定
🔮 予測・将来分析
8. 季節性・トレンド分析
- 月別・四半期別の季節変動パターン
- 繁忙期・閑散期の特定と対策
- 前年同期比での成長トレンド
- 季節要因を考慮した売上予測
9. 売上予測分析
- 過去データに基づく翌月・翌四半期の売上予測
- 商談パイプラインからの受注予測
- 目標達成に必要な追加商談数の算出
- リスクシナリオ分析(楽観・標準・悲観)
10. 競合比較分析
- 競合製品との価格・機能比較
- 失注理由の分析と改善策
- 競合に勝っている商材・エリアの特定
- 競合対策の有効性評価
💼 実装例:カスタム分析プロンプト
あなたは経験豊富な営業分析のエキスパートです。
以下の営業データを多角的に分析し、実行可能なアクションプランを提案してください。
【分析データ】
{{sales_data}}
【分析項目】
1. 売上トレンド分析
- 前月比・前年同月比の増減率
- 目標達成率と乖離要因
- 成長が加速/鈍化している領域
2. セグメント別分析
- 地域別:都道府県・営業所別の実績
- 業界別:主要業界ごとの売上構成
- 商品別:売れ筋商品と不振商品
- 担当者別:トップ5とボトム5の特定
3. 顧客分析
- ABC分析:上位20%の顧客で何%の売上を占めるか
- 新規顧客の獲得状況
- 既存顧客の継続率・離反リスク
4. 営業効率分析
- 商談成約率の推移
- 平均商談期間の長期化/短縮
- 訪問件数と受注の相関
5. アクションプラン
- 今月注力すべき3つの施策
- リスク項目と対策
- 来月の売上予測と必要アクション
【出力形式】
Markdown形式で、経営層にも分かりやすく、
具体的な数値と改善提案を含めてレポートしてください。
✅ プロンプト設計のコツ
• ペルソナを明確にする:「営業分析のエキスパート」など役割を指定
• 具体的な分析項目を列挙:曖昧な指示ではなく、見たい数値を明記
• 出力形式を指定:JSON、Markdown、表形式など用途に合わせて指定
• 実行可能性を求める:分析だけでなく改善アクションまで出力させる
まとめ
DifyとGoogleスプレッドシートを連携させることで、営業データの分析を完全自動化できます。この実装により:
- 分析時間の大幅短縮: 数時間の作業が数分で完了
- 属人化の解消: 誰でも同じ品質の分析結果を取得
- リアルタイム分析: データ更新と同時に分析実行
- スケーラブルな運用: データ量が増えても対応可能
図3: 分析結果がスプレッドシートに自動的に書き込まれる
この実装により、営業チームはデータ分析に時間を取られることなく、より戦略的な業務に集中できるようになります。




