質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

Googleスプレッドシート内のGAS実行時にエラー503となり返ってくる

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 930

Kei.Nakamura

score 2

前提・実現したいこと

Googleスプレッドシートにて、
Googleの検索結果数を取得するツールを作成しています。

取得方法は、GASにて。

発生している問題・エラーメッセージ

検索結果数を取得する際に、
UrlFetchApp.fetch()を使用しているのですが、
以下のようなエラーとなり、取得できないでいます。

しかし、10回~20回ほど連続してスクリプトを実行すると正常に取得する場合があります。

https://www.google.co.jp/search?q=%E4%B8%8A%E5%B1%B1%20%E7%AB%9C%E6%B2%BB のリクエストに失敗しました(エラー: 503)。サーバー応答の一部: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><meta http-equiv="content-type" content="text/html; charset=utf-8"><me...(応答の全文を見るには muteHttpExceptions オプションを使用してください)

このエラーの内容から察するに、恐らくGoogleからのキーワードの取得回数に制限でもあるのでしょうか。
それとも、https://www.google.co.jp/complete/search?hl=jp&output=toolbar&q= からのAPIに対して取得制限がかかっているのでしょうか?

どのようなロジックになっているのか検討がつかなく、大変困っております。

実現したい内容としては、エラーをなくしたいと思っております。

知恵をお持ちのかたの回答を切望いたします。

該当のソースコード

//関数
function suggest() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('data');
  var keyWord = sheet.getRange("A1").getValue();
  var options = {
    headers: {
      'accept-language': 'ja',
      'muteHttpExceptions' : true
    }
  };
//Googleサジェストの取得
  var response = UrlFetchApp.fetch("https://www.google.co.jp/complete/search?hl=jp&output=toolbar&q="+encodeURI(keyWord), options );
  var Regexp = /<suggestion data="([\s\S]*?)"\/>/gi;
  sheet.getRange('D1:F10').clear();
  var items = response.getContentText().match(Regexp);
  var suggestions = []
  for(var i in items) {
    var result = items[i].replace(/<suggestion data="/, "").replace(/"\/>/, "");
    suggestions.push([result, getRival(result), getDemand(result)]);
  }
  var ash = SpreadsheetApp.getActiveSpreadsheet()
  var pushsheet = ash.getSheetByName("data")
  pushsheet.getRange(1, 4, suggestions.length, 3).setValues(suggestions)
}

//Googleの検索結果数を取得
function getRival(keyWord) {
  var response = UrlFetchApp.fetch("https://www.google.co.jp/search?q="+encodeURI(keyWord));
  var tmp = response.getContentText().match(/id="resultStats">約 ([\s\S]*?)件<\/div>/)
  if(!tmp) { return 0 }
  return tmp[1];
}

//Googleの検索需要を取得
function getDemand(keyWord) {
  var response = UrlFetchApp.fetch("http://aramakijake.jp/keyword/index.php?keyword="+encodeURI(keyWord));
  var tmp = response.getContentText().match(/id="retrievals">([\s\S]*?)<\/div>/)[0]
  if(!tmp) { return 0 }
  var tmp2 = tmp.match(/alt="Google"\s\/>\s<span>([\s\S]*?)<\/span>/);
  return !tmp2 ? 0 : tmp2[1]
}

試したこと

10回ほど連続実行 ⇛ 取得する場合あり。

補足情報(言語/FW/ツール等のバージョンなど)

Googleスプレッドシート
GoogleAppsScript

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • coco_bauer

    2017/10/17 13:29

    まずは、サーバからの応答の全文の中身を検討しましょう。応答の全文を見れば、少なくともどこで問題が生じているのが判りますからね。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる