見出し画像

会社からURLを取得して,業種から同業他社の成功事例を書き出して、営業資料にしたよ


function processSuccessCases() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var lastRow = sheet.getLastRow();
  var successCasesRange = sheet.getRange(2, 20, lastRow - 1); // T列のデータ範囲
  var tdbIndustryRange = sheet.getRange(2, 12, lastRow - 1); // L列のデータ範囲
  var successCases = successCasesRange.getValues();
  var tdbIndustries = tdbIndustryRange.getValues();
  
  for (var i = 0; i < successCases.length; i++) {
    var cellVaおさらい

前回は画像データからエクセルデータを作成し、さらに"企業名"と"業種"から営業で効果的な提案内容を追加してもらいました。

さらに深堀するために

これだけだと”業界の最新トレンドを調査し、DX化やサスティナビリティを重視した戦略を立ててください”といった無難な提案分しか表示されません。もっと詳しい提案を書いてもらうため、企業情報をAIに知ってもらうために企業名からURLを取得する処理を追加したいと思います。

URLの取得

今までエクセルデータで処理していたのですが、企業URLを取得するためにGoogle Spreadsheetにデータをインポートします。

Googleスプレッドシートに対して直接操作するためには、Google Apps Scriptを使用します。その前に。。

GOOGLE_API_KEYと_CSE_IDの取得

url取得するためにGoogle Cluld ConsoleとかCustom Search EngineからIDを取得する必要があります。
よく分かってない世界になりあまりうまく説明できずすいません。。

Google Cloud ConsoleでAPIキーを確認

コンソールへ移動

  • プロジェクトを選択し、「APIs & Services」 > 「Credentials」からAPIキーを確認します。

  1. プロジェクトを選択し、「APIs & Services」 > 「Credentials」からAPIキーを確認します。

新規の場合は画面上部のプロジェクトの検索ボックスを選択して、プロジェクトを作成します。

APIとサービスから認証情報を選択

  1. APIキーが有効であることを確認します。また、必要に応じて新しいAPIキーを作成します。

認証情報 → +認証情報を作成 ➡ APIキー
ここでgoogle api keyをゲット


  1. Custom Search Engineの設定を確認

  2. Custom Search Engineにアクセスします。

右上の使ってみるボタン押下
  1. 正しい検索エンジンIDを取得し、検索エンジンの設定が正しいことを確認します。

  2. カスタム検索エンジンが「全Web」を検索するように設定されているか確認します。

検索エンジン名を記入し、ウェブ全体を検索にチェックして作成(でいいよね..?)

作成したエンジン(URL取得)を選択

作成した検索IDをコピー。メモしておきます。

ここでCSE_IDをゲット

GASコード

コードはGPT4oに作ってもらいました。ええそこはAIで

  1. Googleスプレッドシートを開く: あなたのスプレッドシートのURLにアクセスします。

  2. Google Apps Scriptエディタを開く: 「拡張機能」メニューから「Apps Script」を選択します。

  3. 新しいスクリプトを作成する: 以下のコードをコピーしてスクリプトエディタに貼り付けます。

  4. スクリプトを保存して実行: スクリプトを保存し、実行します。

変更点としては以下の箇所です。

const apiKey = 'YOUR GOOGLE API_KEY'
const cedId = 'YOUR_CSE_ID'
シート名は”シート1”,B列に企業名が入っている前提となっています。
E列にURLが記入されます。同じ会社名も全国に多いので、一度確認する必要はありますね。
一番右列にURL列を追加して、企業名からURLを取得します。

function addCompanyURLs() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var headerRow = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
  var urlColumnIndex = headerRow.indexOf('URL') + 1;
 
  // "URL"列がない場合、新しい列を追加
  if (urlColumnIndex === 0) {
    urlColumnIndex = lastColumn + 1;
    sheet.getRange(1, urlColumnIndex).setValue('URL');
  }
 
  // B列の会社名を取得
  var companyNames = sheet.getRange(2, 2, lastRow - 1).getValues();
 
  for (var i = 0; i < companyNames.length; i++) {
    var companyName = companyNames[i][0];
    if (companyName) {
      var url = fetchCompanyURL(companyName);
      sheet.getRange(i + 2, urlColumnIndex).setValue(url);
    }
  }
}


function fetchCompanyURL(companyName) {
  var apiKey = ここにAPIキー'; // ここにAPIキーを入力
  var cx = 'ここにカスタムエンジンID(cd_id)'; // ここにカスタム検索エンジンIDを入力
  var query = companyName + ' 公式サイト';
  var url = 'https://www.googleapis.com/customsearch/v1?q=' + encodeURIComponent(query) + '&cx=' + cx + '&key=' + apiKey;
 
  try {
    var response = UrlFetchApp.fetch(url);
    var json = JSON.parse(response.getContentText());
   
    if (json.items && json.items.length > 0) {
      return json.items[0].link;
    } else {
      return 'URLが見つかりませんでした';
    }
  } catch (e) {
    return 'エラー: ' + e.message;
  }
}

GASは6分制限があるため、データが大量になる場合、途中で処理が終了する可能性あります。

エラーになった場合

原因はいろいろあるのですが、API関係が多いかもしれません。Custom Search APIが無効になっているケースは以下の処理で確認できます(できるそうです)またエラー内容をGPTに投げれば解決方法を提示してくれるので、壁打ちのような形で何度も試してみましょう。

  1. Google Cloud Consoleにアクセス:

    • Google Cloud Consoleにアクセスし、Googleアカウントでログインします。

    • プロジェクトを作成するか、既存のプロジェクトを選択します。

  2. Custom Search APIを有効にする:

    • 左側のナビゲーションメニューから「APIs & Services」 > 「Library」を選択します。

    • 検索バーに「Custom Search API」と入力し、検索結果から「Custom Search API」を選択します。

    • 「Enable」ボタンをクリックしてAPIを有効にします。

有効になっていなかったら、”有効にする”が表示される

同業他社の成功事例をネットから取得

URLは会社名から取得しているので、同盟の企業名があると正確に反映されないケースがあります。そこで営業が提案する際に同業他社の成功事例もシートに書き込むことにしました。
そこでスプレッドシートにもう一つシートを作ります。”成功事例シート”データが少なければ分ける必要なないのでしょうが、数が多くなるとうまく処理できなかったので、分けることにしました。

"成功事例シート"はシンプルな構成でA列に業種、B列に成功事例の2列だけです。

業種から成功事例を取得するGASコードが以下になります。
spreadsheetidには該当のスプレッドシートIDを記入

成功事例.js

function addSuccessStories() {
  // スプレッドシートのIDとシート名を指定
  var spreadsheetId = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
  var sheetName = '成功事例';  // 対応するシート名に変更してください

  // スプレッドシートとシートを取得
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);

  // A列の業種を取得
  var data = sheet.getRange('A2:A' + sheet.getLastRow()).getValues();

  // 業種に対応する成功事例を定義
  var successStories = {
    "喫茶店": "成功事例: スターバックスは、サステナブルなコーヒー調達と環境への配慮を通じて、ブランドロイヤルティを高めました。",
    "宝飾品店": "成功事例: ジュエリーショップは、カスタムデザインサービスを提供し、顧客の個別ニーズに対応しました。",
    "児童福祉サービス": "成功事例: 児童福祉サービスは、家庭訪問プログラムを強化し、子供と家族の支援を拡充しました。",
    "住宅住まいサービス": "成功事例: Home Depotは、DIY向けの製品とサービスを提供し、顧客の住宅改善プロジェクトをサポートしました。",
    "生鮮魚介卸": "成功事例: Tsukiji魚市場は、効率的な物流システムを導入し、新鮮な魚介類の迅速な配送を実現しました。",
    "肥料・飼料卸": "成功事例: Yara Internationalは、持続可能な肥料を提供し、農業生産性を向上させました。",
    "貸事務所業": "成功事例: WeWorkは、フレキシブルなオフィススペースを提供し、スタートアップ企業やリモートワーカーのニーズに応えました。"
  };

  // A列の業種に対応する成功事例をB列に記載
  for (var i = 0; i < data.length; i++) {
    var industry = data[i][0];
    if (successStories[industry]) {
      sheet.getRange('B' + (i + 2)).setValue(successStories[industry]);
    }
  }
}
...d/ここの部分がスプレッドシートID/edit

// 業種に対応する成功事例を定義
var successStories = {
この箇所に業種別の成功事例を定義していき、最後の比較.jsで該当業種があれば、当てはめるという処理をしていきます。そこで業種ごとの成功事例取得に別のGASコードを記載します。

"シート1"にある。F列の"業種"からネットで同じ業種を調べて、G列に追記

function addSuccessStories() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); // シート名を指定
  var data = sheet.getRange('F2:F').getValues(); // F列のデータを取得
  var successStories = [];

  // 各業界の成功事例をリストに追加
  data.forEach(function(row) {
    var industry = row[0];
    var successStory = getSuccessStory(industry); // 成功事例を取得
    successStories.push([successStory]);
  });

  // 成功事例の列をG列に追加
  sheet.getRange(2, 7, successStories.length, 1).setValues(successStories);
}

// 指定された業界の成功事例を取得する関数
function getSuccessStory(industry) {
  var stories = {
    "包装用品卸": "成功事例:大手包装用品卸会社のパッケージデザインの革新。",
    "税理士事務所": "成功事例:デジタルツールを導入した税理士事務所の効率化。",
    "無料事務所": "成功事例:クラウドベースの無料事務所ソフトウェアの利用。",
    "建築物設備事務所": "成功事例:エネルギー効率化プロジェクトの成功。",
    "鮮魚・魚類小売": "成功事例:新鮮な魚介類を提供するサプライチェーンの構築。",
    // 他の業界の成功事例を追加
  };
  return stories[industry] || "成功事例なし";
}

ほかの業種についても調べる場合はGPTで以下のプロンプトで教えてくれるのですが、数が多いと対応しきれなくなってしまいました。
ChatGPTプロンプト

https://docs.google.com/spreadsheexxxxxxxxxxxxxxxxxxs/d/x/edit#gid=929275900

あなたは優れたデータアナリストです。

F列全て調べて、同じ業界の成功事例をネットで調べてください。
その後、一番右列に成功事例の列を追加する、GASコードを記述して

ChatGPTプロンプト

...
包装用品包装卸
学校事務所
解体業
建設サービス
農業
鮮魚販売
上記の成功事例もネットから見つけて

こんな感じで区分けしてました。。取得した成功事例を成功事例.jsの以下の箇所に追記していきます。
// 業種に対応する成功事例を定義
var successStories = {

こんな感じでずらーってなるます

ファイルの結合処理

次に業種から成功事例を取得する事例を記載し、それを各シートに当てはめる処理を行います。
比較.js
シート1(まとめ用)と成功事例(業種毎の成功事例)

function compareAndFillSuccessStories() {
  // スプレッドシートのIDとシート名を指定
  var spreadsheet1Id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  var sheet1Name = 'シート1';
  var spreadsheet2Id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
  var sheet2Name = '成功事例';

  // スプレッドシートとシートを取得
  var spreadsheet1 = SpreadsheetApp.openById(spreadsheet1Id);
  var sheet1 = spreadsheet1.getSheetByName(sheet1Name);
  var spreadsheet2 = SpreadsheetApp.openById(spreadsheet2Id);
  var sheet2 = spreadsheet2.getSheetByName(sheet2Name);

  // シート1の業種とシート2の業種および成功事例を取得
  var data1 = sheet1.getRange('F2:F' + sheet1.getLastRow()).getValues();
  var data2 = sheet2.getRange('A2:B' + sheet2.getLastRow()).getValues();

  // シート2の業種と成功事例を辞書に格納
  var successDict = {};
  for (var i = 0; i < data2.length; i++) {
    var industry = data2[i][0];
    var successStory = data2[i][1];
    successDict[industry] = successStory;
  }

  // シート1の業種に対応する成功事例をH列に記載
  for (var j = 0; j < data1.length; j++) {
    var industry1 = data1[j][0];
    if (successDict[industry1]) {
      sheet1.getRange('H' + (j + 2)).setValue(successDict[industry1]);
    }
  }
}


これで

最終的にこんな感じに


なんかもっとスマートにできる方法が絶対あると思うのですが、やったのは以下の項目だけなのです。。

1.会社名からURLをゲット
2.業種から成功自体他業種をゲット
3.営業リストの業種に当てはめていって完成


なんかあまり楽じゃなかった。もっと賢い子になれるよう頑張ります。。




ご注意

※スクレイピングはやみくもにやって良いものではなく、主に官公庁などのパブリックデータを活用するためなどに利用されます。

他社のサービスを利用して自社の商用に利用したり、他社のサーバーに不可をかけたりしてしまうと法に触れる可能性がございます。

そちらを念頭に置いた上で利用しましょう。

※今回の記事からスクレイピングをおこなった際の問題には責任を追いかねますのでご了承ください

Google Search APIの料金

このAPIには無料版と有料版があります。 無料版では1日100回検索でき、100回以上は1000回当たり5ドル費用がかかります。 有料版ではGoogleと同じ検索技術を使うことができます。 価格形態は、個人サイト用から大規模ビジネス用まで用意されています。(2024年5月時点)

この記事が気に入ったらサポートをしてみませんか?