Googleスプレッドシートで営業進捗を自動集計する仕組みの作り方【GASコード付き】

GAS×スプレッドシートで作る営業ダッシュボード|日報入力だけで自動更新・無料・実装コードつき

「今月の営業進捗、今どこまで?」——この確認作業に、毎週30分以上かかっていませんか?

担当者に声をかけてスプレッドシートを開き、バラバラの入力を手動でまとめる。この繰り返しは、忙しい管理職にとって地味に重いタスクです。

この記事では、Google Apps Script(GAS)× Googleスプレッドシートを使って、営業担当者が日報を入力するだけでダッシュボードが自動更新される仕組みを実装する方法を解説します。コードはすべて掲載しているので、コピペで動かせます。

この記事でできること

  • 営業担当者が「日報入力シート」に入力するだけで進捗が自動集計される
  • 担当者別・ステータス別の進捗をダッシュボードシートで確認できる
  • 1時間おきに自動更新(手動操作一切不要)
  • 初期費用0円・追加ツール不要(Googleアカウントだけ)

事前準備(5分)

必要なのはGoogleアカウントだけです。特別な知識は不要です。

  • Googleアカウント(無料)
  • Googleスプレッドシートの基本操作ができること

STEP 1:スプレッドシートの準備

新しいGoogleスプレッドシートを作成し、以下の2つのシートを用意します。

シート1:日報入力

1行目に以下のヘッダーを入力します。

A列B列C列D列E列F列
日付担当者顧客名ステータス金額(円)備考
2026/04/01田中〇〇商事受注1500003ヶ月契約

ステータスは「商談中」「受注」「失注」の3種類に統一してください。表記ゆれがあるとコードが正しく集計できません。

シート2:ダッシュボード

シート名を「ダッシュボード」にしておくだけでOKです。中身はGASが自動で書き込みます。

STEP 2:GASのコードを貼り付ける

スプレッドシートのメニューから「拡張機能 → Apps Script」を選択します。エディタが開いたら、デフォルトのコードをすべて削除して以下のコードを貼り付け、保存してください。

/**
 * 営業進捗ダッシュボード自動更新スクリプト
 */

function updateDashboard() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const inputSheet = ss.getSheetByName('日報入力');
  const dashSheet = ss.getSheetByName('ダッシュボード');

  if (!inputSheet || !dashSheet) {
    Logger.log('シート名を確認してください');
    return;
  }

  const data = inputSheet.getDataRange().getValues();
  if (data.length < 2) { Logger.log('データなし'); return; }

  const rows = data.slice(1).filter(row => row[0] !== '');

  const now = new Date();
  const thisYear = now.getFullYear();
  const thisMonth = now.getMonth();

  const thisMonthRows = rows.filter(row => {
    const date = new Date(row[0]);
    return date.getFullYear() === thisYear && date.getMonth() === thisMonth;
  });

  const summary = {};
  let totalAmount = 0;

  thisMonthRows.forEach(row => {
    const person = row[1];
    const status = row[3];
    const amount = Number(row[4]) || 0;
    if (!person) return;
    if (!summary[person]) {
      summary[person] = { '商談中': 0, '受注': 0, '失注': 0, '受注金額': 0 };
    }
    if (status in summary[person]) { summary[person][status]++; }
    if (status === '受注') {
      summary[person]['受注金額'] += amount;
      totalAmount += amount;
    }
  });

  dashSheet.clearContents();

  const monthLabel = thisYear + '年' + (thisMonth + 1) + '月 営業進捗サマリー';
  dashSheet.getRange('A1').setValue(monthLabel);
  dashSheet.getRange('A1').setFontSize(14).setFontWeight('bold');
  dashSheet.getRange('G1').setValue('最終更新: ' + now.toLocaleString('ja-JP'));

  const headers = ['担当者', '商談中', '受注', '失注', '受注率', '受注金額(円)'];
  dashSheet.getRange(3, 1, 1, headers.length).setValues([headers]);
  dashSheet.getRange(3, 1, 1, headers.length)
    .setBackground('#1a73e8').setFontColor('#ffffff').setFontWeight('bold');

  const outputRows = Object.entries(summary).map(([person, stats]) => {
    const total = stats['商談中'] + stats['受注'] + stats['失注'];
    const winRate = total > 0 ? Math.round((stats['受注'] / total) * 100) + '%' : '-';
    return [person, stats['商談中'], stats['受注'], stats['失注'], winRate, stats['受注金額']];
  });

  if (outputRows.length > 0) {
    dashSheet.getRange(4, 1, outputRows.length, headers.length).setValues(outputRows);
    for (let i = 0; i < outputRows.length; i++) {
      const color = i % 2 === 0 ? '#f8f9fa' : '#ffffff';
      dashSheet.getRange(4 + i, 1, 1, headers.length).setBackground(color);
    }
  }

  const totalRow = 4 + outputRows.length;
  dashSheet.getRange(totalRow, 1).setValue('合計');
  dashSheet.getRange(totalRow, 6).setValue(totalAmount);
  dashSheet.getRange(totalRow, 1, 1, headers.length)
    .setBackground('#e8f0fe').setFontWeight('bold');

  Logger.log('ダッシュボード更新完了: ' + now.toLocaleString('ja-JP'));
}

STEP 3:トリガーを設定して自動化する

このままでは手動実行しかできません。1時間おきに自動実行するトリガーを設定しましょう。同じファイルの末尾に以下の関数を追加します。

/**
 * 自動実行トリガーを設定する(1回だけ実行すればOK)
 */
function setAutoTrigger() {
  // 既存トリガーを削除(重複防止)
  ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));

  // 1時間おきに updateDashboard を実行
  ScriptApp.newTrigger('updateDashboard')
    .timeBased()
    .everyHours(1)
    .create();

  Logger.log('トリガーを設定しました(1時間おき)');
}

コードを保存後、関数の選択ドロップダウンで「setAutoTrigger」を選んで▶ボタンで1回だけ実行します。これでトリガーが登録され、以降は自動で動き続けます。

トリガーの確認方法

左メニューの時計アイコン「トリガー」から設定済みのトリガーを確認できます。「updateDashboard - 1時間ごと」と表示されていれば設定完了です。

STEP 4:動作確認

「日報入力」シートにテストデータを数行入力してから、GASエディタで「updateDashboard」を手動実行します。「ダッシュボード」シートに担当者別の集計が表示されれば成功です。

うまく動かないときのチェックリスト

  • シート名の確認:「日報入力」「ダッシュボード」と完全一致しているか(スペース・全角半角に注意)
  • ステータスの表記ゆれ:「商談中」「受注」「失注」以外の表記が混入していないか
  • 日付のフォーマット:日付列はテキスト型ではなく日付型で入力されているか
  • 権限の許可:初回実行時にGoogleアカウントへのアクセス許可ダイアログが表示されます。「許可」を選んでください

応用:さらに便利にする拡張アイデア

この仕組みは土台にすぎません。以下の拡張でさらに強力になります。

  • Slack通知連携:毎週月曜朝9時にサマリーをSlackチャンネルへ自動投稿
  • メール送信:月末に営業全員に個別レポートをGmailで自動送信
  • グラフの自動生成:スプレッドシートのグラフAPIで担当者別棒グラフを自動作成
  • Googleフォーム連携:担当者がフォームで入力すると日報シートに自動記録

これらの実装方法は順次記事化していきます。「通知も自動化したい」という方はサイトをブックマークしておいてください。

まとめ

今回実装したのは以下の仕組みです。

  • 「日報入力」シートへの入力をもとに「ダッシュボード」シートが自動集計・更新される
  • 担当者別・ステータス別・受注率・受注金額を一覧で可視化
  • トリガー設定で1時間おきの自動実行を実現

「すごいけど自分の環境に合わせるのが難しそう」「自社の業務フローに合わせてカスタマイズしたい」という方は、お気軽にご相談ください。業務フロー設計からGASの実装・運用定着まで一気通貫でサポートします。

無料相談・お問い合わせはこちら

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA