カテゴリー: 業務効率化

  • Difyで社内AIエージェントを作る最短手順

    Difyで社内AIエージェントを作る最短手順

    ノーコードでAIエージェントを構築できる「Dify」を使えば、プログラミング不要で社内業務に特化したAIアシスタントをすぐに作り始められます。

    ChatGPTのような汎用AIは便利ですが、「自社の規定に沿って回答させたい」「社内マニュアルをもとに質問に答えさせたい」といった用途には少し工夫が必要です。そこで注目されているのがDifyです。Difyはオープンソースのノーコードプラットフォームで、プロンプト設計・RAG(文書検索)・ワークフロー自動化までをGUIで構成できます。

    本記事では、Difyのクラウド版を使って「社内FAQに答えるAIエージェント」を最短手順で作る方法を解説します。初期設定からドキュメントのアップロード、チャットボット公開まで30分以内に完成します。

    この記事でできること

    • Difyのアカウント作成とワークスペース初期設定
    • 社内マニュアルや規定をナレッジベースとして登録
    • RAGを活用してドキュメントに基づいた回答を生成するチャットボットの構築
    • チャットボットを社内向けに公開(共有リンク生成)

    事前準備

    以下を用意してください。

    • Difyアカウント(dify.aiでメールアドレス登録、無料プランで本記事の手順はすべて実行可能)
    • AIモデルのAPIキー(OpenAI GPT-4oもしくはAnthropic Claude推奨。DifyのSettings → Model Providerで登録)
    • ナレッジとして使うドキュメント(PDF・Word・Markdown・テキストファイルなど)

    DifyはクラウドホストのSaaS版を利用します。自社サーバーに自己ホストすることも可能ですが、本記事ではクラウド版で進めます。

    STEP 1: Difyにログインしてアプリを新規作成する

    ブラウザで dify.ai にアクセスしてログインします。ダッシュボード左上の「Create App」をクリックし、アプリタイプに Chatbot を選択してください。

    • App Name: 例)社内FAQ AIアシスタント
    • Description: 例)社内規定・マニュアルをもとに質問に答えるAIです

    「Create」ボタンを押すとアプリ編集画面(Orchestrate画面)が開きます。中央にチャット画面のプレビュー、左側にコンテキスト設定パネルが表示されます。

    STEP 2: ナレッジベースを作成してドキュメントを登録する

    左メニューから「Knowledge」→「Create Knowledge」をクリックします。ナレッジ名(例:社内マニュアル)を入力して「Create」を押した後、ドキュメントのアップロード画面に進みます。

    「Upload File」ボタンから社内ドキュメントをアップロードします。PDF・DOCX・TXTなど複数ファイルを一度にドロップ可能です。アップロード後の設定は基本的にデフォルトのままで構いません。

    • Chunk Size: 500〜800トークン程度が標準。文書が長い場合は大きめに設定
    • Embedding Model: OpenAI text-embedding-3-smallが高精度でコスト低め

    「Save & Process」をクリックするとドキュメントの分割・ベクトル化が始まります。ファイルサイズによりますが数秒〜数分で完了します。

    # ドキュメントが多い場合のヒント
    # Dify APIを使ってプログラムからバッチアップロードも可能
    # curl -X POST https://api.dify.ai/v1/datasets/{dataset_id}/document/create_by_file #   -H "Authorization: Bearer YOUR_API_KEY" #   -F "data={"name":"マニュアル","indexing_technique":"high_quality"}" #   -F "file=@manual.pdf"
    

    STEP 3: チャットボットにナレッジを紐づける

    アプリ編集画面に戻り、左パネルの「Context」セクションで「Add」ボタンをクリックします。先ほど作成したナレッジ(社内マニュアル)を選択して追加します。

    次に「Instructions」(システムプロンプト)を設定します。以下のようなプロンプトを入力してください。

    あなたは社内規定・マニュアルに関する質問に答える社内AIアシスタントです。
    以下のルールを守って回答してください:
    - 提供されたドキュメントの内容に基づいて回答する
    - ドキュメントに記載のない情報は「資料に記載がありません」と伝える
    - 回答は日本語で、丁寧かつ簡潔に行う
    - 必要に応じてドキュメントの該当セクションを引用する
    

    プロンプトを入力したら右側のプレビュー画面でテスト送信してみましょう。ドキュメントの内容に沿った回答が返ってくれば設定成功です。

    STEP 4: 公開設定と共有リンクを生成する

    テストが完了したら、右上の「Publish」ボタンをクリックして公開します。公開後に表示される「Share」メニューから以下の形式で共有できます。

    • Embedded in website: HTMLのiframeコードをコピーして社内ポータルに埋め込む
    • Share link: URLを発行してブラウザで直接アクセスできるようにする
    • API Access: APIキーを発行して他システムと連携する(Slack・Notionなど)

    社内向けに公開する場合は「Share link」のURLを社内チャットやメールで共有するのが最も手軽です。アクセス制限(パスワード保護)もDifyのWeb App設定から有効化できます。

    STEP 5: 応答品質を改善する(チューニング)

    公開後に回答精度を上げたい場合は以下の設定を調整します。

    • Retrieval Setting(ナレッジ設定): 「Top K」を3〜5に設定すると関連チャンクを複数参照して精度が上がる
    • Score Threshold: 0.5〜0.7に設定すると関連性の低い情報を無視できる
    • Rerank Model: Cohere Rerankなどを有効にするとさらに精度が向上

    また、「Logs & Annotations」メニューから実際の会話履歴を確認し、誤回答があった場合はアノテーション(正解例の登録)を追加することで継続的に改善できます。

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

    • □ ドキュメントのインデックス処理が完了しているか(Knowledgeメニューでステータス確認)
    • □ APIキーが正しく登録されているか(Settings → Model Provider)
    • □ ナレッジがアプリに紐づいているか(Orchestrate画面のContextセクション)
    • □ システムプロンプトに矛盾する指示がないか
    • □ アップロードしたファイルが文字化けしていないか(スキャンPDFは文字認識が必要)
    • □ モデルの利用上限に達していないか(OpenAI/Anthropicの使用量を確認)

    応用・発展

    基本的なFAQボットが完成したら、以下の発展活用を検討してください。

    • Workflowアプリ化: 単純なチャットではなく、入力→処理→出力の複雑なフローをノーコードで構築可能。例えば「テキストを受け取り要約してメール文を生成→Slack送信」といったパイプライン
    • SlackBot連携: DifyのAPIとGASまたはSlack Appを連携させて、Slackから直接AIエージェントに質問できる仕組みを構築
    • 複数ナレッジの組み合わせ: 部門別・製品別にナレッジを分けて作成し、チャットボットで動的に切り替えることも可能
    • 自己ホスト(セルフホスト): Dockerで自社サーバーに展開すれば、社外にデータを出さずに運用できる(オンプレミス対応)

    まとめ

    • Difyのクラウド版を使えば、プログラミング不要で30分以内に社内AIエージェントを作れる
    • ナレッジベース機能(RAG)により、自社ドキュメントに基づいた精度の高い回答が可能
    • 公開方法は埋め込み・共有リンク・APIの3種類で用途に合わせて選択できる
    • ログ・アノテーション機能で継続的に回答精度を改善できる
    • 慣れてきたらWorkflowアプリやSlack連携など発展的な活用も視野に入れよう
  • Salesforceなしで中小企業が営業管理できるGoogleツール構成

    Salesforceなしで中小企業が営業管理できるGoogleツール構成

    高額なCRMツールを使わなくても、Googleのツールを組み合わせるだけで中小企業の営業管理は十分に回せます。

    「Salesforceを導入したいが費用が高い」「Excelで管理しているが属人化してしまっている」——こうした悩みを抱える中小企業の営業担当者・経営者は少なくありません。実際、Salesforceのライセンス費用は1ユーザーあたり月額数千円〜数万円になり、5名のチームでも相当なコストになります。

    一方、Googleワークスペース(Google Workspace)は多くの企業がすでに導入しており、スプレッドシート・フォーム・カレンダー・GmailといったツールはCRMの基本機能を代替できます。本記事では、Googleツールだけで営業パイプライン管理・顧客情報管理・日次レポートまでをカバーする構成を具体的に解説します。

    この記事でできること

    • Googleスプレッドシートで営業パイプライン(案件進捗)を一元管理する
    • Googleフォームで商談メモ・訪問報告を入力し、自動でスプレッドシートに蓄積する
    • Googleカレンダーと連携して次回アクションをチーム共有する
    • GASで週次サマリーメールを自動送信する
    • Looker Studio(旧Googleデータポータル)でダッシュボードを可視化する

    事前準備

    以下のGoogleサービスを使います。すべて無料〜Googleワークスペース標準機能の範囲内で動作します。

    • Googleスプレッドシート(顧客・案件データの管理台帳)
    • Googleフォーム(商談メモ・訪問報告の入力)
    • Googleカレンダー(次回アクションの予定管理)
    • Gmail(週次レポートの自動送信先)
    • Google Apps Script(GAS)(自動化ロジック)
    • Looker Studio(ダッシュボード可視化・オプション)

    Googleアカウント(またはGoogle Workspace契約)があれば追加費用ゼロでスタートできます。

    STEP1: 営業管理スプレッドシートを作る

    まずは営業管理の中心となるスプレッドシートを作成します。シートは「案件リスト」「顧客マスタ」「アクション履歴」の3シート構成が基本です。

    「案件リスト」シートには以下の列を用意します。

    A列: 案件ID(例: OPP-001)
    B列: 顧客名
    C列: 担当者名
    D列: ステージ(リード / 商談中 / 提案済 / 受注 / 失注)
    E列: 受注見込額(円)
    F列: 受注予定日
    G列: 最終接触日
    H列: 次回アクション内容
    I列: 次回アクション日
    J列: メモ

    ステージ列はデータの入力規則でプルダウン選択式にすることで、表記ゆれを防ぎます。セルを選択 → データ → データの入力規則 → リストから設定してください。

    STEP2: Googleフォームで商談メモ入力フォームを作る

    営業担当者がスマートフォンからも簡単に商談メモを記録できるよう、Googleフォームを使います。フォームの回答は自動的にスプレッドシートに蓄積されます。

    フォームに設定する項目の例:

    ・担当者名(プルダウン)
    ・顧客名(短文テキスト)
    ・商談日(日付)
    ・商談ステージ(プルダウン: リード/商談中/提案済/受注/失注)
    ・商談内容メモ(長文テキスト)
    ・次回アクション(短文テキスト)
    ・次回アクション予定日(日付)
    ・受注見込額(数値)

    フォームの「回答」タブ → スプレッドシートアイコンをクリックすると、回答が自動集計されるシートが生成されます。このシートをSTEP1の「案件リスト」シートとVLOOKUPやIMPORTRANGEで連携させることで、情報の二重入力を防げます。

    STEP3: Googleカレンダーで次回アクションをチーム共有する

    案件リストの「次回アクション日」列をもとに、GASでGoogleカレンダーへ予定を自動登録します。以下のスクリプトをApps Scriptエディタ(拡張機能 → Apps Script)に貼り付けて実行してください。

    function syncActionsToCalendar() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet()
        .getSheetByName('案件リスト');
      const calendar = CalendarApp.getCalendarById('your-calendar-id@group.calendar.google.com');
      const lastRow = sheet.getLastRow();
      
      for (let i = 2; i <= lastRow; i++) {
        const actionDate = sheet.getRange(i, 9).getValue(); // I列: 次回アクション日
        const action = sheet.getRange(i, 8).getValue();     // H列: 次回アクション内容
        const customer = sheet.getRange(i, 2).getValue();   // B列: 顧客名
        
        if (actionDate && action) {
          const title = `[営業] ${customer}: ${action}`;
          calendar.createAllDayEvent(title, actionDate);
        }
      }
      Logger.log('カレンダー同期完了');
    }

    カレンダーIDはGoogleカレンダーの「設定と共有」→「カレンダーの統合」で確認できます。チーム共有カレンダーを指定すれば全員に通知が届きます。

    STEP4: GASで週次サマリーメールを自動送信する

    毎週月曜日の朝に、案件リストの集計結果をメールで送信する仕組みを作ります。

    function sendWeeklySummary() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet()
        .getSheetByName('案件リスト');
      const data = sheet.getDataRange().getValues();
      
      let total = 0, active = 0, won = 0;
      for (let i = 1; i < data.length; i++) {
        const stage = data[i][3];
        const amount = Number(data[i][4]) || 0;
        if (stage !== '' && stage !== '失注') {
          active++;
          total += amount;
        }
        if (stage === '受注') won++;
      }
      
      const body = `【週次営業サマリー】
    
    ` +
        `アクティブ案件数: ${active}件
    ` +
        `受注件数: ${won}件
    ` +
        `パイプライン合計: ${total.toLocaleString()}円
    
    ` +
        `詳細はスプレッドシートを確認してください。`;
      
      GmailApp.sendEmail(
        'your-email@example.com',
        '【週次営業サマリー】' + new Date().toLocaleDateString('ja-JP'),
        body
      );
      Logger.log('週次メール送信完了');
    }

    このスクリプトにトリガーを設定します。Apps Scriptの「トリガー」メニューから「時間主導型 → 週ベースのタイマー → 毎週月曜日 → 午前8時〜9時」と設定するだけです。

    STEP5: Looker Studioでダッシュボード化する(オプション)

    スプレッドシートのデータをLooker Studio(無料)で可視化すると、経営層への報告が格段に楽になります。

    設定手順:

    1. Looker Studio(datastudio.google.com)にアクセス
    2. 「レポートを作成」→「データソース」でGoogleスプレッドシートを選択
    3. 管理しているスプレッドシートの「案件リスト」シートを選択して接続
    4. 棒グラフで「ステージ別案件数」、折れ線グラフで「月別受注額」などのグラフを追加
    5. URLを共有設定にして、経営者・マネージャーに共有

    スプレッドシートを更新するだけでダッシュボードも自動的に最新データに反映されます。

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

    • GASが実行されない → トリガーの設定時刻・トリガーの種類を再確認する
    • カレンダーに予定が追加されない → カレンダーIDが正しいか、GASにカレンダーへのアクセス権限を付与したか確認
    • フォームの回答がスプレッドシートに反映されない → フォームの「回答先スプレッドシートの選択」で正しいシートを指定しているか確認
    • メールが届かない → GmailApp.sendEmail のメールアドレス部分が正しいか確認。スパムフォルダも確認
    • Looker Studioでデータが表示されない → スプレッドシートの共有設定が「リンクを知っている全員が閲覧可」になっているか確認

    応用・発展

    この構成をベースに、以下のような拡張が可能です。

    • Slack連携: GASのUrlFetchAppを使ってSlackに商談更新通知を飛ばす
    • 名刺管理との連携: SansanやEight経由でエクスポートしたCSVをスプレッドシートにインポートして顧客マスタを更新
    • 見積書自動生成: GASでGoogleドキュメントのテンプレートから見積書PDFを自動生成してメール送付
    • LINE通知: 重要なアクション期日が近づいたらLINE Messaging APIで担当者に通知

    将来的に本格的なCRMが必要になった場合も、スプレッドシートにデータが蓄積されていれば、HubSpotやZoho CRMへのCSVインポートも容易です。まずはゼロコストで始めて、業務フローが固まってから有料ツールへ移行するアプローチが中小企業には最適です。

    まとめ

    • Googleスプレッドシート・フォーム・カレンダー・GmailをGASで連携するだけで、Salesforceに相当する営業管理フローが構築できる
    • 初期費用ゼロ、月額コストもGoogle Workspaceの通常費用のみで運用可能
    • フォーム入力 → スプレッドシート蓄積 → カレンダー同期 → 週次メール送信という自動フローで属人化を排除できる
    • Looker Studioで可視化すれば経営層への報告コストも削減できる
    • 業務フローが固まった段階で有料CRMへの移行もスムーズに行える
  • GASで営業リストを自動収集する仕組みを作った話

    GASで営業リストを自動収集する仕組みを作った話

    Google Apps Scriptを使えば、Web上の企業情報を自動で収集してスプレッドシートに整理する営業リスト自動化の仕組みが無料で作れます。

    「新規営業のためにリストを作りたいけど、手作業で企業情報を集めるのが大変…」そんな悩みを持つ営業担当者や中小企業経営者は多いのではないでしょうか。

    実はGoogle Apps Script(GAS)を使えば、Googleスプレッドシート上で動く営業リスト自動収集ツールを無料で作れます。この記事では実際に筆者が作った仕組みの手順を公開します。

    この記事でできること

    • GASでWebサイトから企業情報を取得してスプレッドシートに保存
    • 業種・地域などの条件で絞り込んだリストを自動生成
    • 収集した情報に重複チェックを自動適用
    • 毎朝定時にリストを自動更新するトリガー設定

    事前準備

    必要なものはGoogleアカウントのみです。GASはGoogleスプレッドシートに標準搭載されているため、追加のツールや費用は一切かかりません。また、収集対象サイトの利用規約は必ず確認してください。

    STEP1: スプレッドシートとGASプロジェクトを準備する

    まず新しいGoogleスプレッドシートを作成し、「ツール」→「Apps Script」からGASエディタを開きます。シートには以下のヘッダー行を用意します。

    A列: 企業名 / B列: URL / C列: 業種 / D列: 所在地 / E列: 電話番号 / F列: 収集日時

    STEP2: ページ取得の基本コードを書く

    GASのUrlFetchAppを使ってWebページを取得し、正規表現でデータを抽出します。

    function fetchCompanyInfo(url) {
      var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
      if (response.getResponseCode() !== 200) return null;
      var html = response.getContentText();
      var telMatch = html.match(/\d{2,4}-\d{2,4}-\d{4}/);
      var tel = telMatch ? telMatch[0] : '';
      return { url: url, tel: tel };
    }

    STEP3: スプレッドシートへの書き込みと重複チェック

    取得したデータをシートに保存する関数と、URLベースの重複チェックを実装します。

    function saveToSheet(data) {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var lastRow = sheet.getLastRow();
      var existingUrls = sheet.getRange(2, 2, lastRow, 1).getValues().flat();
      if (existingUrls.indexOf(data.url) !== -1) return false;
      sheet.appendRow([data.companyName, data.url, '', '', data.tel, new Date()]);
      return true;
    }

    STEP4: 定時自動実行のトリガーを設定する

    GASエディタの左メニューから「トリガー」→「トリガーを追加」を選択し、以下のように設定します。

    • 実行する関数: collectLeads
    • イベントのソース: 時間主導型
    • 時間ベースのトリガーのタイプ: 日タイマー
    • 時刻: 午前7時〜8時

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

    • 「アクセスが拒否されました」エラー → User-Agentヘッダーを設定しているか確認
    • 取得したHTMLが空 → JavaScriptレンダリング必須のサイトはGASでは取得不可
    • 1日の実行上限エラー → GASの無料枠は1日6分が上限。対象URLを絞るか頻度を下げる
    • データが重複して追加される → 重複チェック対象列のインデックスが正しいか確認

    応用・発展

    収集したリストをそのままGmailの差し込みメール送信と連携させることで、「リスト収集→メール送信」を完全自動化できます。また、Google Sheetsのフィルタ機能と組み合わせて、担当者ごとにリストを振り分ける仕組みも簡単に作れます。

    まとめ

    • GASのUrlFetchAppでWebの企業情報を自動収集できる
    • 重複チェック・定時実行を組み合わせれば完全自動の営業リスト生成が実現
    • 無料・ノーコードで始められ、他のGoogle Workspaceツールとの連携も容易
  • AppSheetで営業日報アプリを作る【ゼロから解説】

    AppSheetで営業日報アプリを作る【ゼロから解説】

    「営業日報をExcelで管理しているが、集計が面倒」「入力が手間でメンバーが続かない」——そんな悩みをお持ちではないですか?Googleが提供するノーコードツール「AppSheet」を使えば、プログラミング不要で本格的な営業日報アプリを作れます。この記事では、Googleスプレッドシートをデータソースにした営業日報アプリの作り方をゼロから解説します。

    AppSheetはGoogleが2020年に買収したノーコードプラットフォームです。スプレッドシートをデータベースとして、スマートフォン・PCで動作するアプリを数時間で構築できます。無料プランでも十分な機能が使えるため、中小企業の業務改善に最適なツールです。

    この記事でできること

    • スプレッドシートと連携した営業日報アプリの構築
    • スマートフォンからの日報入力・閲覧
    • 上長への自動通知設定
    • 月次レポートの自動集計ビュー作成

    事前準備(10分)

    以下のものを用意してください。

    • Googleアカウント(無料)
    • Googleスプレッドシート(新規作成)
    • AppSheetアカウント(Googleアカウントで無料登録可)

    まずGoogleスプレッドシートに以下の列を作成します。

    A列: 日付
    B列: 担当者名
    C列: 訪問先
    D列: 活動内容(訪問/電話/メール)
    E列: 商談ステータス(初回面談/提案/見積/受注/失注)
    F列: 金額(円)
    G列: 次回アクション
    H列: 備考
    I列: 入力日時(自動)

    ヘッダー行を1行目に入力したら、シート名を「日報データ」に変更しておきましょう。

    STEP 1:AppSheetでアプリを作成する

    AppSheet(appsheet.com)にアクセスし、Googleアカウントでログインします。

    • 「Start for free」からログイン
    • 「Create」→「App」→「Start with your own data」を選択
    • 先ほど作成したGoogleスプレッドシートを選択
    • アプリ名を「営業日報」などに設定して「Create App」をクリック

    AppSheetがスプレッドシートの列を自動認識してアプリのひな形を作成します。この時点でスマートフォンからデータの入力・閲覧ができる基本アプリが完成しています。

    STEP 2:カラム設定を最適化する

    左メニューの「Data」→「Columns」から各列のデータ型を設定します。

    • 日付:Type を「Date」に変更
    • 活動内容:Type を「Enum」に変更し、「訪問」「電話」「メール」を選択肢として登録
    • 商談ステータス:Type を「Enum」に変更し、各ステージを登録
    • 金額:Type を「Price」に変更(自動でカンマ区切り表示)
    • 入力日時:Type を「DateTime」、Initial value を「NOW()」に設定(自動入力)

    担当者名は「担当者マスタ」シートを別途作成し、Refタイプで参照設定すると選択式になり入力ミスを防げます。

    STEP 3:ビュー(画面)を設計する

    左メニューの「UX」→「Views」からアプリの画面構成を設定します。

    • 日報入力フォーム:View Type「Form」で新規入力画面を作成
    • 日報一覧:View Type「Table」で一覧表示。Sort設定で「日付」降順にする
    • マイ日報:View Type「Gallery」、Filterで「担当者名 = USEREMAIL()」を設定して自分の日報だけ表示
    • 月次サマリー:View Type「Chart」で金額の月別積み上げグラフを作成

    「月次サマリー」ビューの設定例:

    Chart Type: Bar Chart
    X-axis: MONTH(日付)
    Y-axis: SUM(金額)
    Group by: 商談ステータス

    STEP 4:自動通知・承認フローを設定する

    左メニューの「Automation」→「Bots」から自動化を設定します。

    日報提出時のメール通知設定:

    • 「New Bot」を作成
    • Event:「When a row is added」(日報データシート)
    • Action:「Send an email」
    • Toに上長のメールアドレス、件名に「【日報】<<担当者名>>さんが日報を提出しました」を設定
    • 本文に各フィールドの値を埋め込む

    受注時のSlack通知(Webhookを使用):

    Event: When a row is added or updated
    Condition: [商談ステータス] = "受注"
    Action: Call a webhook
    URL: https://hooks.slack.com/services/YOUR_WEBHOOK_URL
    Method: POST
    Body: {"text": "🎉 受注!担当: <<担当者名>> 金額: <<金額>>円"}

    動作確認とトラブルシュート

    トラブルシュートチェックリスト

    • ✅ スプレッドシートへの書き込み権限があるか(Googleアカウントを確認)
    • ✅ Enumの選択肢が正しく登録されているか(Data → Columns で確認)
    • ✅ 通知メールが届かない場合は「Security → Require sign-in」を確認
    • ✅ スマートフォンで表示が崩れる場合はView設定のResponsiveを有効化
    • ✅ データが更新されない場合はSync間隔の設定(Manage → Integrations)を確認

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

    • GPS位置情報の記録:LatLong型のカラムを追加し、訪問先の位置を自動記録する
    • 写真添付機能:Image型のカラムを追加してスマートフォンから名刺・提案資料を撮影保存
    • GASとの連携:月次になったタイミングでGASで集計しPDF化して自動メール送信
    • 承認フロー:ChangeData機能でワンクリック承認ボタンを設置して上長確認を効率化
    • 地図ビュー:Map Viewで営業活動エリアを可視化してテリトリー管理に活用

    まとめ

    AppSheetを使えばプログラミング不要で本格的な営業日報アプリが作れます。Googleスプレッドシートとシームレスに連携するため、既存のデータ資産をそのまま活用できる点も大きな強みです。

    • スプレッドシートをデータソースにしてノーコードでアプリ化
    • Enum型で入力ミスを防ぎ、データ品質を向上
    • Automation機能で日報提出時の通知・承認フローを自動化
    • Chart ViewやGASとの連携で月次分析も効率化
    • 無料プランで最大10ユーザーまで利用可能

    AppSheetの詳細な設定方法や、貴社の業務フローに合わせたカスタマイズについてお気軽にご相談ください。

    お問い合わせはこちら
  • Gemini APIとGASで営業メールを自動生成する方法【プロンプト付き】

    Gemini APIとGASで営業メールを自動生成する方法【プロンプト付き】

    「提案メールを毎回ゼロから書いてる…」「顧客ごとに文面を変えるのが面倒」――そんな悩みをGemini APIとGoogle Apps Scriptで解決します。スプレッドシートに顧客情報を入力するだけで、パーソナライズされた営業メールを自動生成できる仕組みを、コードから丁寧に解説します。

    AIを使ったメール生成というと「ChatGPTに貼り付けて手動でコピー」というイメージがあるかもしれません。でも、GASと組み合わせればスプレッドシートのボタン1つで100件分の個別メールを自動生成できます。しかも無料(Gemini APIの無料枠内)で始められます。

    この記事でできること

    • スプレッドシートの顧客リストをもとにGemini APIで個別メール文面を自動生成
    • 生成したメールをGmailで自動送信(または下書き保存)
    • プロンプトを変えるだけで提案・フォローアップ・御礼メールにも対応
    • 実装に必要なGASコード一式を本記事で公開

    事前準備(10分)

    必要なものは以下の3つです。すべて無料で揃います。

    • Googleアカウント(Gmailアドレスがあれば可)
    • Gemini APIキー(Google AI Studioで取得・無料)
    • Googleスプレッドシート(GASプロジェクトを作成する)

    Gemini APIキーの取得方法

    1. Google AI Studio にアクセスし、Googleアカウントでログイン
    2.「Get API key」→「Create API key in new project」をクリック
    3. 表示されたAPIキー(AIzaで始まる文字列)をコピーして保存

    APIキーはスクリプトプロパティに保存します(コードに直書きしないこと)。GASの「プロジェクトの設定」→「スクリプトプロパティを追加」で GEMINI_API_KEY というキー名で貼り付けてください。

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

    新しいGoogleスプレッドシートを作成し、シート名を「顧客リスト」に変更します。1行目にヘッダーを作成してください。

    A列(会社名)B列(担当者名)C列(メールアドレス)D列(業種)E列(課題・ニーズ)F列(送信ステータス)
    株式会社〇〇山田 太郎yamada@example.com製造業月次レポート作成に毎月10時間かかっている(空欄)

    「課題・ニーズ」列がポイントです。ここに顧客の具体的な悩みを記入することで、AIがその悩みに刺さるパーソナライズメールを生成します。

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

    スプレッドシートのメニュー「拡張機能」→「Apps Script」を開き、以下のコードを貼り付けます。

    /**
     * Gemini API x GAS 営業メール自動生成ツール
     */
    
    const SHEET_NAME = '顧客リスト';
    const SENDER_NAME = '松下 浩平';
    const YOUR_SERVICE = 'GASxAI業務自動化サービス';
    const DRAFT_MODE = true; // true=下書き保存, false=即送信
    
    function generateAndSendEmails() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
      const lastRow = sheet.getLastRow();
      if (lastRow < 2) {
        SpreadsheetApp.getUi().alert('顧客データがありません。');
        return;
      }
      const data = sheet.getRange(2, 1, lastRow - 1, 6).getValues();
      let successCount = 0;
      let skipCount = 0;
      data.forEach((row, index) => {
        const [company, name, email, industry, needs, status] = row;
        if (status === '送信済み' || !email) { skipCount++; return; }
        const emailContent = generateEmailContent(company, name, industry, needs);
        if (!emailContent) return;
        if (DRAFT_MODE) {
          GmailApp.createDraft(email, emailContent.subject, emailContent.body);
        } else {
          GmailApp.sendEmail(email, emailContent.subject, emailContent.body, { name: SENDER_NAME });
        }
        sheet.getRange(index + 2, 6).setValue(DRAFT_MODE ? '下書き保存済み' : '送信済み');
        successCount++;
        Utilities.sleep(1000);
      });
      SpreadsheetApp.getUi().alert('完了!
    生成: ' + successCount + '件
    スキップ: ' + skipCount + '件');
    }
    
    function generateEmailContent(company, name, industry, needs) {
      const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
      if (!apiKey) { console.error('GEMINI_API_KEY が未設定'); return null; }
      const prompt = 'あなたは営業メールの専門家です。以下の顧客情報をもとに自然な営業メールを作成してください。
    
    【顧客情報】
    ・会社名: ' + company + '
    ・担当者名: ' + name + ' 様
    ・業種: ' + industry + '
    ・課題: ' + needs + '
    
    【提供サービス】
    ' + YOUR_SERVICE + '
    
    【ルール】
    ・件名は30文字以内
    ・本文は250〜350文字
    ・共感ファーストで書く
    ・返信促進文を末尾に
    ・署名不要
    
    【出力形式】
    件名: [件名]
    本文:
    [本文]';
      const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-lite:generateContent?key=' + apiKey;
      const payload = { contents: [{ parts: [{ text: prompt }] }], generationConfig: { temperature: 0.7, maxOutputTokens: 500 } };
      try {
        const response = UrlFetchApp.fetch(url, { method: 'POST', contentType: 'application/json', payload: JSON.stringify(payload) });
        const result = JSON.parse(response.getContentText());
        const text = result.candidates[0].content.parts[0].text;
        const subjectMatch = text.match(/件名:s*(.+)/);
        const bodyMatch = text.match(/本文:
    ([sS]+)/);
        return {
          subject: subjectMatch ? subjectMatch[1].trim() : company + ' ' + name + '様へのご提案',
          body: bodyMatch ? bodyMatch[1].trim() : text
        };
      } catch (error) {
        console.error('Gemini API エラー:', error);
        return null;
      }
    }
    
    function onOpen() {
      SpreadsheetApp.getUi()
        .createMenu('メール自動生成')
        .addItem('メールを生成・送信', 'generateAndSendEmails')
        .addToUi();
    }

    STEP 3:APIキーをスクリプトプロパティに登録する

    APIキーをコードに直書きするのはセキュリティ上NGです。必ずスクリプトプロパティに保存してください。

    1. GASエディタ左メニューの「プロジェクトの設定(歯車アイコン)」をクリック
    2. 「スクリプトプロパティ」セクションで「プロパティを追加」
    3. プロパティ名: GEMINI_API_KEY、値: 取得したAPIキーを貼り付け
    4. 「スクリプトプロパティを保存」をクリック

    STEP 4:動作確認

    1. スプレッドシートに戻り、顧客データを2〜3行入力する
    2. メニュー「メール自動生成」→「メールを生成・送信」をクリック
    3. 初回は権限の許可ダイアログが表示されます。「許可」をクリック
    4. 処理完了後、Gmailの「下書き」フォルダを確認する

    トラブルシュートチェックリスト

    • 「GEMINI_API_KEY が未設定」→ スクリプトプロパティのキー名を確認
    • 「Request failed」→ APIキーが正しいか、Gemini APIが有効か確認
    • 「下書きが届かない」→ DRAFT_MODE が true になっているか確認
    • API制限エラー → Utilities.sleep(4000) に変更して再試行

    応用:プロンプトを変えるだけで用途が広がる

    このツールの強みはプロンプトを変えるだけで用途が無限に広がる点です。

    • フォローアップメール:「先日ご提案した件について〜」の文体に変更
    • 御礼メール:「本日はお時間をいただきありがとうございました」に変更
    • リマインドメール:返信のない顧客への再アプローチ文
    • 件名A/Bテスト:複数パターンを生成してスプレッドシートに記録

    さらに発展させると、Gmailの送信記録をスプレッドシートに自動記録したり、返信があった顧客を自動でフラグ立てしたりすることも可能です。

    まとめ

    Gemini APIとGASを組み合わせることで、顧客の課題に合わせたパーソナライズ営業メールを自動生成できます。

    • スプレッドシートに顧客情報を入力するだけでOK
    • Gemini APIの無料枠で月数百件まで対応可能
    • プロンプト変更で提案・フォロー・御礼など多用途に展開できる

    「このコードをうちの営業フローに合わせてカスタマイズしてほしい」「CRMと連携させたい」という方は、下記からお気軽にご相談ください。

    お問い合わせはこちら
  • Googleスプレッドシートで営業進捗を自動集計する仕組みの作り方【GASコード付き】

    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の実装・運用定着まで一気通貫でサポートします。

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