「営業リスト作成に毎週何時間もかけている」「手作業でのリスト収集は限界がある」と感じていませんか?本記事では、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と連携してさらに高度な自動化も実現できる
業種・地域・規模など自社の営業戦略に合わせてカスタマイズすれば、質の高い営業リストを自動で維持できます。導入方法や自社への適用についてご相談があれば、お気軽にお問い合わせください。







.jpg)

.jpg)