Google Apps Script @福岡

GASで面白Webサービス&コスト削減や!

Google Apps Script 講座中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」

はじめに

後藤銃士です。最近の趣味はWebプログラミングスクールのマネタイズの仕組みを調べることです。

そのために Google で検索をしているのですが、こういうのって1度に50〜100サイトぐらいざっとみないと大枠がつかめないことが多いと思うのです。で毎回感想を簡単に記録しておきたい。

そのために検索結果からリンクを踏んで該当サイトへいき、URLとサイト名を手でスプレッドシートに書くのは億劫!というわけで、 「Google検索結果のURLとタイトルを自動でスプレッドシートに追加する」GASを作りましたので共有いたします。

予め用意しておくのは、スプレッドシートと「検索ワード」という名前のシートです。検索する際、「検索ワード」シートに検索文字をいれてGASを起動すると、「検索ワード」でシートを追加し、そのシートに検索結果を追加してくれます。私的にすこぶる便利。

この機能が役に立つのは

広大なインターネッツの情報を労力少なめに調べ結果をまとめたい老若男女

今回は中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」

対象

学べること

講座スタート

いつもどおりコピペだけで大丈夫です。が、その前に使うスプレッドシートを用意して下さい。今回は「検索ワード」シートも用意して下さい。シート名を変えるだけです。

f:id:jijyoronn:20190104195236p:plain

用意が出来ましたか?では、

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  // スプレッドシート設定
  var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシートのURL');
  var sheet = spreadsheet.getSheetByName('検索ワード'); // 検索ワード記載シート
  var lastrow = sheet.getLastRow(); // 最後の行番号
  var searchWord = sheet.getRange(lastrow, 1).getValue();
    
  // シート設定
  var writeSheet = spreadsheet.getSheetByName(searchWord);
  if(writeSheet){
  }else{
    spreadsheet.insertSheet(searchWord);
  }
  
  // 検索結果取得
  var encodeWord = encodeURI(searchWord);
  var displayNum = 20; // 検索数
  var url = "https://www.google.com/search?q=" + encodeWord + "&num=" + displayNum;
  Logger.log(url);
  var response = UrlFetchApp.fetch(url).getContentText('UTF-8');

  
  // 抽出
  var myRegexp = /<h3 class=\"r\">([\s\S]*?)<\/h3>/gi;
  var elems = response.match(myRegexp);
  for(var i in elems) {
    
    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
    
    writeSheet = spreadsheet.getSheetByName(searchWord);
    Logger.log(writeSheet);
    var lastrow = writeSheet.getLastRow();
    writeSheet.getRange(lastrow +1, 1).setValue(title);
    writeSheet.getRange(lastrow +1, 2).setValue(url);
  }

をコピペして保存します。

f:id:jijyoronn:20190104195421p:plain

次に検索したいワードを「検索ワード」シートの1番最初に記載します。ここでは「ウェブカツ」とします。

f:id:jijyoronn:20190104195446p:plain

それでは実行してみましょう。

f:id:jijyoronn:20190104195522p:plain

こんな感じで検索ワードでシートが生成され、Google検索結果から、タイトルとURLを抽出しシートに書き込んでくれます。 ただGoogle先生のご機嫌が悪いと、うまく取れない場合があるようです。その場合は数秒おいてから再実行してみて下さい。

↓こんな場合ですね f:id:jijyoronn:20190104195655p:plain

では解説を少しだけ。

まずGoogleの検索処理URLの組み立てですが、実行後ログを見て下さい。

f:id:jijyoronn:20190104195728p:plain

こんなふうに生成されています。これこのままブラウザに入れると検索されます。

https://www.google.com/search?q=%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%84&num=20

このq=から、&num までの文字列(赤文字)が「ウェブカツ」という日本語を翻訳した文字列となります。Google先生に理解していただくための「おまじない」です。一般にはURLエンコードと呼ばれる処理で、本来はいろいろあるんですが、GAS上というか JavaScript 上では encodeURI() を使えばうまいことやってくれるのでそのまま利用しています。

今回一番のキモは抽出のあたりですね…このあたりはそうですね、別途「正規表現」の記事を書くとします。ざっくり説明すると、

  var myRegexp = /<h3 class=\"r\">([\s\S]*?)<\/h3>/gi;
  var elems = response.match(myRegexp);

指定した検索結果に対して、myRegexp で指定した正規表現指定でマッチ(合致)した部分、ここでは h3 タグに囲まれた部分ですが、欲しい情報はタグ内の情報、つまりh3 タグに挟まれたテキスト部分、つまりカッコ内です。カッコを指定するとカッコ内だけが取り出されます。 さ・ら・に、g オプションを付けておくと複数マッチした場合、その個数分 elems に配列形式で代入されます(何をいっているかわからん人、スマン…)。

<h3 class="r"><a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a></h3>

Googleの検索結果には上記のように出力されていますから、この場合は、a タグ部分が取得されるわけです。

<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

これが、num の数分基本取得されます。20 で設定しているので 20 URL分取得されます(が、Google先生の機嫌で前後します)。

  for(var i in elems) {
    
    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
    
    writeSheet = spreadsheet.getSheetByName(searchWord);
    Logger.log(writeSheet);
    var lastrow = writeSheet.getLastRow();
    writeSheet.getRange(lastrow +1, 1).setValue(title);
    writeSheet.getRange(lastrow +1, 2).setValue(url);
  }

取得された数だけ、for で繰り返します。

タイトル

タイトルは、赤文字なので、一旦、bタグを、replace で削除します。で、次に a タグに挟まれた文字列を取得しています。

    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];
<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

ここから

ウェブカツ

が取り出せます。

URL

同じように match を使って取り出しています。

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

ここから

https://webukatu.com/

が取り出せます。

まとめ

いやー、正規表現難しいっすよね…。これだけで専門書もある世界なので仕方ないんですけどね…。 ちなみに、「検索ワード」シートの検索文字ですが、getLastRow() を使っているのでどんどん下に追記していってもよいですよ。

f:id:jijyoronn:20190104202014p:plain

こんな感じなります。いやー調査が捗りますね。

f:id:jijyoronn:20190104202042p:plain

そんなわけで今回は、Google Apps Script 講座中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」でした。今回は普通に URL を叩いて取得してきましたが、次回は、ログイン処理が必要なサイトのデータの引っ張り方について調べて記事を上げたいと思います。

それでは、ご覧いただきありがとうございました。