SpreadsheetでGoogle検索結果の取得

SEO対策の一環としてターゲットとしているキーワードの競合調査が極めて重要です。
上位表示を狙うページのコンテンツ作成に必要な情報を競合サイトからたくさんのヒントを得られます。
昔はいろいろと無料で使えるツールがありましたが、Googleのアップデートによってほとんど使えなくなってしまいました。
もちろん、有料のツールを使えば済む話なんですが、そこまで利用頻度もなく、手軽に競合調査する程度なら、
SpreadsheetにGASを導入して簡易なツールを作れば、後々使う道に沿っていろいろカスタマイズもできます。
以前作ったGASのコードをご紹介しますので、ご活用をできれば幸いです。

Spreadsheetに入力されたキーワードに基づいて、Google検索結果の上位１０サイトの
タイトル、URL、ディスクリプション、h1、キーワードの出現数をとってきて保存します。

```getSearchData.js
function getSearchData(){

  //設定シートから設定情報を読み込む
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('kwTool'); //シート名を置き換えてください。
  var word = sheet.getRange(3,2).getValue(); //入力されるキーワードの位置を指定してください。
  //上位10件のデータを取得後の表示範囲をD8〜J18にしていますが、ご自由に移動してください。
  //既存データの削除
  sheet.getRange(8, 5, 10, 6).clearContent();

  //事前にGoogle検索APIのキー、ID情報を取得しておくように
  var apiKey = 'xxxxxxxxxxxxxxxxxx'; //apiキーを入力してください
  var apiUrl = 'https://www.googleapis.com/customsearch/v1/';
  var query  = '?q='+ encodeURIComponent(word);
  query += '&cx=' + 'xxxxxxxxxxxxxxxxxx'; //カスタム検索エンジンID
  query += '&key='+apiKey;

  apiUrl = apiUrl + query;

  var response = UrlFetchApp.fetch(apiUrl);
  if (response.getResponseCode() !== 200) {
    throw new Error('エラーのため取得できませんでした');
  } else {
    var res =  JSON.parse(response);
  }

  //データを取得する
  try {

    //データシートを取得する
    var sheet = spreadsheet.getSheetByName('kwTool');

    //1位から10位のタイトル名
    var titles =[];
    var i = 0;
    for (i = 0; i < 10; i++) {
      titles.push([res.items[i]["title"].toString()]);
    }
    sheet.getRange(8,5,10,1).setValues(titles); //配列で書き込む

    //urlを取得する
    var urls = [];
    for (i = 0; i < 10; i++) {
      urls.push([res.items[i]["link"].toString()]);
    }
    sheet.getRange(8,6,10,1).setValues(urls); //配列で書き込む

    //概要を取得する
    var snippets = [];
    for (i = 0; i < 10; i++) {
      snippets.push([res.items[i]["snippet"].toString()]);
    }
    sheet.getRange(8,7,10,1).setValues(snippets); //配列で書き込む

  } catch(e) {
    return e.toString();
  }

  //各htmlからデータの取得ループ実行
  for (var i = 8; i <= 17; i += 1) {
    var url = sheet.getRange(i, 6).getValue();
    try{
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');
      var html = html.toLowerCase();
      //文字コードを分岐し、Shift-JISの場合読み直し
      if ( html.indexOf('shift_jis') != -1){
        var sjs = response.getContentText('Shift_JIS');
        //キーワードの出現数をカウント
        var countNum = ( sjs.match( new RegExp( word, "g" ) ) || [] ).length ;
        //h1を取得
        var h1 = sjs.match(/<h1.*>(.*?)<\/h1>/)[1];
        //メタキーワードを取得
        var keywords = sjs.match(/keywords.*.content="(.*?)">/)[1];
      } else {
        //キーワードの出現数をカウント
        var utf = response.getContentText('UTF-8');
        var countNum = ( utf.match( new RegExp( word, "g" ) ) || [] ).length ;
        //h1を取得
        var h1 = utf.match(/<h1.*>(.*?)<\/h1>/)[1];
        //メタキーワードを取得
        var keywords = utf.match(/keywords.*.content="(.*?)">/)[1];
    }
    } catch(e){}
    //取得結果をそれぞれの箇所に格納
    sheet.getRange(i, 8).setValue(h1);
    sheet.getRange(i, 9).setValue(keywords);
    sheet.getRange(i, 10).setValue(countNum);
  }
  Browser.msgBox("入力されたキーワードの上位10サイトのデータ取得が完了しました。");
}

```

一部情報が古くなってしまって、動かない場合はご了承してください。