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

「営業リスト作成に毎週何時間もかけている」「手作業でのリスト収集は限界がある」と感じていませんか?本記事では、Google Apps Script(GAS)を使って営業リストを自動収集する仕組みを実際に作った過程を、コードとともに詳しく解説します。

GASとGoogleスプレッドシートを組み合わせれば、Web上の公開情報を定期的に収集・整形して、常に最新の営業リストを自動更新する仕組みが作れます。ツール費用ゼロ、プログラミング初心者でも再現できる方法を紹介します。

この記事でできること

  • GASを使ってWebページから企業情報を自動取得する
  • 取得データをスプレッドシートに整形して保存する
  • 重複チェック機能で同じ企業が二重登録されるのを防ぐ
  • 時間ベーストリガーで毎日自動実行する仕組みを構築する

事前準備(10分)

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

  • Googleアカウント(無料)
  • Googleスプレッドシート(新規作成)
  • Google Apps Script(スプレッドシートから起動)
  • 収集対象となる公開Webページ(企業ディレクトリ・業界団体サイトなど)

スプレッドシートを開き、メニューの「拡張機能」→「Apps Script」をクリックしてGASエディターを起動します。

STEP 1:スプレッドシートのシート構成を設計する

まず収集データを格納するシートを作成します。スプレッドシートに「営業リスト」シートを追加し、以下のヘッダーを1行目に入力してください:

A列: 会社名
B列: WebサイトURL
C列: 業種
D列: 所在地
E列: 取得日時
F列: ステータス(未対応/対応中/完了)

次に「収集設定」シートも作成し、A列にターゲットURL、B列に収集ルールを記録できるようにしておきます。これで設定変更がコードを触らずにできるようになります。

STEP 2:Webページから情報を取得するコードを書く

GASのUrlFetchAppを使って対象ページのHTMLを取得し、正規表現でデータを抽出します。以下は基本的な取得コードです:

function fetchSalesLeads() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const listSheet = ss.getSheetByName('営業リスト');
  const configSheet = ss.getSheetByName('収集設定');
  
  // 収集設定シートからURL一覧を取得
  const urls = configSheet.getRange('A2:A' + configSheet.getLastRow()).getValues()
    .filter(row => row[0] !== '')
    .map(row => row[0]);
  
  urls.forEach(url => {
    try {
      const response = UrlFetchApp.fetch(url, {
        muteHttpExceptions: true,
        headers: {
          'User-Agent': 'Mozilla/5.0 (compatible; GoogleBot/2.1)'
        }
      });
      
      if (response.getResponseCode() !== 200) {
        console.log('取得失敗: ' + url);
        return;
      }
      
      const html = response.getContentText('UTF-8');
      extractCompanyInfo(html, url, listSheet);
      
      // 連続アクセスを避けるため1秒待機
      Utilities.sleep(1000);
      
    } catch(e) {
      console.error('エラー: ' + url + ' / ' + e.message);
    }
  });
  
  console.log('取得完了: ' + new Date());
}

STEP 3:HTMLから企業情報を抽出してシートに書き込む

正規表現を使ってHTMLから必要な情報を取り出し、スプレッドシートに書き込む関数を実装します:

function extractCompanyInfo(html, sourceUrl, sheet) {
  // 企業名を抽出(例:h2タグ内のテキスト)
  const companyPattern = /<h2[^>]*class="company-name"[^>]*>([^<]+)<\/h2>/g;
  // 所在地を抽出
  const locationPattern = /<span[^>]*class="location"[^>]*>([^<]+)<\/span>/g;
  
  const companies = [];
  let match;
  
  while ((match = companyPattern.exec(html)) !== null) {
    companies.push({
      name: match[1].trim(),
      website: sourceUrl,
      location: ''
    });
  }
  
  // 重複チェックしながらシートに追記
  companies.forEach(company => {
    if (!isDuplicate(sheet, company.name)) {
      sheet.appendRow([
        company.name,
        company.website,
        '未設定',
        company.location,
        new Date(),
        '未対応'
      ]);
    }
  });
}

STEP 4:重複チェックと自動トリガーを設定する

同じ企業が複数回登録されるのを防ぐ重複チェック関数と、毎日自動実行するトリガー設定を実装します:

function isDuplicate(sheet, companyName) {
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return false;
  
  // A列(会社名)の全データを取得
  const existingNames = sheet.getRange('A2:A' + lastRow)
    .getValues()
    .map(row => row[0].toString().trim().toLowerCase());
  
  return existingNames.includes(companyName.trim().toLowerCase());
}

// 毎朝9時に自動実行するトリガーを設定
function setupDailyTrigger() {
  // 既存のトリガーを削除
  ScriptApp.getProjectTriggers().forEach(trigger => {
    if (trigger.getHandlerFunction() === 'fetchSalesLeads') {
      ScriptApp.deleteTrigger(trigger);
    }
  });
  
  // 毎朝9時に自動実行
  ScriptApp.newTrigger('fetchSalesLeads')
    .timeBased()
    .everyDays(1)
    .atHour(9)
    .create();
  
  console.log('トリガー設定完了:毎日9時に自動実行');
}

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

GASエディターの「実行」ボタンでfetchSalesLeadsを手動実行して動作確認します。初回実行時は権限の承認が求められますので「許可」をクリックしてください。確認後、setupDailyTriggerを実行してトリガーを設定すれば完了です。

よくあるエラーと対処法

  • 「Exception: Request failed」→ 対象サイトがボット対策をしている可能性。User-Agentを変更するか収集対象を見直す
  • 「文字化け」→ getContentText('Shift_JIS')など文字コードを明示的に指定する
  • 「実行時間超過(6分制限)」→ 1回の実行URL数を減らし複数トリガーに分割する
  • 「重複が登録される」→ 全角・半角正規化(normalize())を比較ロジックに追加する

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

  • Slack通知連携:新規リスト追加時にSlackへ自動通知して営業担当に即報告
  • Gemini API連携:企業情報をAIが自動分析してアプローチ優先度を判定
  • Google Mapsリンク自動生成:所在地情報からリンクを作成して訪問計画を効率化
  • 業種フィルタリング:特定キーワードを含む企業だけを自動抽出してリスト品質を向上
  • メール自動通知:リスト追加をトリガーに担当者へメールで自動通知

まとめ

GASを使った営業リスト自動収集の仕組みを構築することで、毎週数時間かかっていたリスト作成作業をゼロにできます。

  • GASのUrlFetchAppでWebページを取得し、正規表現でデータ抽出
  • 重複チェック機能で同じ企業の二重登録を防止
  • 時間ベーストリガーで毎日自動実行し、常に最新リストを維持
  • 設定シートを分離することでコードを触らずURL追加が可能
  • Slack・Gemini APIと連携してさらに高度な自動化も実現できる

業種・地域・規模など自社の営業戦略に合わせてカスタマイズすれば、質の高い営業リストを自動で維持できます。導入方法や自社への適用についてご相談があれば、お気軽にお問い合わせください。

お問い合わせはこちら

コメント

コメントを残す

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

CAPTCHA