Googleスプレッドシート関数術!営業日報からKPIを自動集計するレポートの作り方

「日々の営業活動の集計、手作業でやっていませんか?」

営業担当者が毎日入力してくれる営業日報。

しかし、その貴重なデータも、ただ蓄積されるだけでは宝の持ち腐れです。月末に慌てて集計したり、会議の直前にデータをまとめたり…そんな作業に時間を取られていませんか?

今回、30分プロトタイプ提案において、お客様管理を紙作業で行っているところで、Excel管理するのもちょっと面倒ということだったので、Gemini+スプレットシートで作ったのが以下になります。

今回作ったプロトタイプ

以下のように、
お客様の訪問管理と最終訪問日が知りたい営業チーム向けのスプレットシートを作成しました。

今回は、Googleスプレッドシートの関数を駆使して、日々の営業日報から顧客ごとの訪問回数や最終訪問日を自動で集計するレポートを作成する方法を、ステップ・バイ・ステップで詳しく解説します。

この方法を実践すれば、手作業での集計から解放され、いつでもリアルタイムな営業状況を把握できるようになります。

注意: 今回以下の関数についてAIで作成しました。細かいところはあってないかもしれないので、
    エラーが起こる場合には、Geminiで修正してください。(そしておそらく、それの方が楽です)

完成イメージ:日報データが自動で集計レポートに!

まず、どのようなものが出来上がるのかを見てみましょう。

【元データ】営業日報シート こちらが日々の活動を入力するシートです。営業担当者が毎日、訪問日時や顧客名、担当者などを記録していきます。

【完成形】自動集計シート そして、こちらが今回作成する集計シートです。「営業日報」シートにデータが追加されるたびに、こちらの集計表が自動で更新されます。

それでは、さっそく作成していきましょう!

Step 1: 「営業日報」と「集計」のシートを準備する

まず、Googleスプレッドシートに以下の2つのシートを準備します。

  1. 営業日報シート: 日々の活動を記録するシートです。最低でも以下の列が必要です。
    • A列: 日時
    • B列: 担当者
    • C列: 顧客/案件名
  2. 集計シート: レポートを表示するシートです。まずは以下のように見出しを作成しましょう。(例: A2セルから)
    • A列: 顧客/案件名
    • B列: 今月 訪問回数
    • C列: 今月 担当者
    • D列: 先月 担当者
    • F列: 最終訪問日

Step 2: 顧客リストを自動で作成する (UNIQUE + FILTER)

集計の軸となる「顧客リスト」を、「営業日報」シートから自動で取得しましょう。これにより、新しい顧客が登場しても自動でリストに追加されます。

A2セルに以下の関数を入力してください。

=UNIQUE(FILTER('営業日報'!C2:C, '営業日報'!C2:C<>""))

関数の解説

  • '営業日報'!C2:C: 「営業日報」シートのC列の2行目以降(見出しを除く)を範囲として指定します。
  • '営業日報'!C2:C<>"": C列が空欄でないという条件です。
  • FILTER(...): 上記の条件に合うデータ(空欄でない顧客名)だけを抽出します。
  • UNIQUE(...): FILTERで抽出したリストから、重複する顧客名を取り除いてユニークなリストを作成します。

エラーが出たら? 「#REF!」というエラーが表示された場合、A4セルより下に何かデータが入力されている可能性があります。この関数は結果を複数のセルに展開するため、A3以下のセルを空にしてから再度入力してください。

Step 3: 「今月の訪問回数」をカウントする (COUNTIFS)

次に、各顧客に対して「今月」何回訪問したかを自動でカウントします。

B3セルに以下の関数を入力してください。

=COUNTIFS(
    ARRAYFORMULA(TRIM('営業日報'!$C:$C)), TRIM($A3),
    '営業日報'!$A:$A, ">="&EOMONTH(TODAY(),-1)+1,
    '営業日報'!$A:$A, "<="&EOMONTH(TODAY(),0)
)

入力後、セルの右下に表示される■(フィルハンドル)をダブルクリックするか、下方向にドラッグして、顧客リストの最後まで関数をコピーします。

関数の解説

  • COUNTIFS(...): 複数の条件に一致するセルの数を数える関数です。
  • ARRAYFORMULA(TRIM('営業日報'!$C:$C)), TRIM($A3): 1つ目の条件。顧客名がA3セルと一致するかを判定します。TRIM関数で顧客名の前後の余分なスペースを削除し、ARRAYFORMULAと組み合わせることで、意図しないスペースによる集計漏れを防ぎます。
  • '>='&EOMONTH(TODAY(),-1)+1: 2つ目の条件。日付が「今月の1日」以降であるかを判定します。TODAY()で今日の日付を取得し、EOMONTHで先月末の日付を算出し、+1することで今月の初日を求めています。
  • '<='&EOMONTH(TODAY(),0): 3つ目の条件。日付が「今月の末日」以前であるかを判定します。

Step 4: 「今月・先月の担当者別訪問数」をまとめる (TEXTJOIN)

ここが一番複雑な関数ですが、これができるとレポートが一気に見やすくなります。「どの担当者が、何回訪問したか」を一覧で表示します。

C3セル(今月 担当者)に以下の関数を入力します。

=TEXTJOIN(", ", TRUE, ARRAYFORMULA(IF(
    UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-1)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),0))))<>"",
    UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-1)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),0)))) & ":" & COUNTIFS(
        ARRAYFORMULA(TRIM('営業日報'!$C:$C)), TRIM($A3),
        '営業日報'!$A:$A, ">="&EOMONTH(TODAY(),-1)+1,
        '営業日報'!$A:$A, "<="&EOMONTH(TODAY(),0),
        ARRAYFORMULA(TRIM('営業日報'!$B:$B)), UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-1)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),0))))
    ),
    "")))

D3セル(先月 担当者)も同様に、以下の関数を入力します。違いはEOMONTHの日付指定部分だけです。

=TEXTJOIN(", ", TRUE, ARRAYFORMULA(IF(
    UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-2)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),-1))))<>"",
    UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-2)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),-1)))) & ":" & COUNTIFS(
        ARRAYFORMULA(TRIM('営業日報'!$C:$C)), TRIM($A3),
        '営業日報'!$A:$A, ">="&EOMONTH(TODAY(),-2)+1,
        '営業日報'!$A:$A, "<="&EOMONTH(TODAY(),-1),
        ARRAYFORMULA(TRIM('営業日報'!$B:$B)), UNIQUE(FILTER('営業日報'!B:B, ('営業日報'!C:C=TRIM($A3))*('営業日報'!B:B<>"")*('営業日報'!A:A>=EOMONTH(TODAY(),-2)+1)*('営業日報'!A:A<=EOMONTH(TODAY(),-1))))
    ),
    "")))

関数の解説(少し複雑です!)

この関数は、いくつかの関数を組み合わせて「担当者名:回数」という文字列を生成し、最後に連結しています。

  1. FILTERUNIQUEで、今月(または先月)その顧客を訪問した担当者のユニークなリストを作成します。
  2. COUNTIFSで、そのユニークな担当者リストを条件に、各担当者の訪問回数を数えます。
  3. & ":" &で、「担当者名」と「回数」を連結します。(例: “山田 太郎:4″)
  4. TEXTJOINで、複数の担当者がいる場合に、それらの文字列をカンマ区切りで一つにまとめます。

エラーが出たら? 「#N/A」や「FILTER の評価で、一致するものは見つかりません。」というエラーが出た場合、その期間に該当する訪問データが存在しないことを意味します。データが入力されれば自動的に表示されます。

Step 5: 「最終訪問日」を求める (MAX + FILTER)

最後に、その顧客への最新の訪問がいつだったのかを表示します。これにより、長期間フォローできていない顧客を簡単に見つけられます。

F3セルに以下の関数を入力し、下方向にコピーしてください。

=MAX(FILTER('営業日報'!A:A, TRIM('営業日報'!C:C)=TRIM(A3)))

関数の解説

  • FILTER('営業日報'!A:A, ...): TRIM関数でスペースを整理しつつ、A3セルの顧客名と一致する行のA列(日時)だけを抽出します。
  • MAX(...): 抽出された日時データの中から、最大値(=最新の日付)を返します。

表示がおかしい? もし「45920.375」のような数字が表示された場合は、セルの書式が日付になっていません。F列を選択し、メニューの「表示形式」>「数字」>「日付と時刻」を選んでください。

まとめ

お疲れ様でした!
今回、初回で、意図しないプロトタイプ提案でしたが、普通に使えるものができたような気がします。

これで、日々の営業日報が自動で戦略的なデータに変わる集計レポートが完成しました。
この辺うまくいかない人は、スプレットシートのGeminiから質問すれば、関数はポン出しで出してくれるのでそれ使ってください。

今回ご紹介は、「担当者別の訪問件数」や「訪問目的別の集計」など、さらに詳細な分析も可能です。

日々の集計作業を自動化し、分析や次のアクションを考えるための貴重な時間を確保するために、
ぜひこの方法をお役立てください。

この記事を書いた人

宮崎翼

愛媛県出身・東京都在住。
国立工業高専(新居浜工業高等専門学校)卒業後、外資系ソフトウェア企業などで法人営業・IT導入支援に従事し、BtoB領域で多様な新規開拓やエンタープライズのDX推進を経験。

現在は「AppTalentHub」の理念、ノーコード/ローコードを活用したアプリ開発の標準化と、エンジニアのスキルの可視化による適正評価を実現するためのプロジェクトやコミュニティ運営に取り組んでいます。
https://tsubasa.tech/about