9

私はAppsスクリプトを持っています。私は自分のGoogle Analyticsアカウントをループして、特定のプロフィール に到達します。別の関数に比べ
if (profileItems[i].getName() == "Dev Test")
(下記参照)私は、GoogleアナリティクスAPIへの呼び出しを行うと、常に例外がスローされます:例外:クォータエラー:ユーザレートリミットは

例外:クォータエラー:ユーザーレート制限を超えました

function getReportDataForProfile(profileId) { 
var tableId = 'ga:' + profileId; 
var startDate = getLastNdays(14); // 2 weeks (a fortnight) ago. 
var endDate = getLastNdays(0);  // Today. 

var optArgs = { 
    'dimensions': 'ga:keyword',    // Comma separated list of dimensions. 
    'sort': '-ga:visits,ga:keyword',   // Sort by visits descending, then keyword. 
    'segment': 'dynamic::ga:isMobile==Yes', // Process only mobile traffic. 
    'filters': 'ga:source==google',   // Display only google traffic. 
    'start-index': '1', 
    'max-results': '250'      // Display the first 250 results. 
}; 

// 
//Exponential Backoff 
// 
for (var n=0; n<6; n++) { 
try { 
    var results = Analytics.Data.Ga.get(
    tableId,     // Table id (format ga:xxxxxx). 
    startDate,    // Start-date (format yyyy-MM-dd). 
    endDate,     // End-date (format yyyy-MM-dd). 
    'ga:visits,ga:pageviews', // Comma seperated list of metrics. 
    optArgs); 
} catch(e) { 
    if (n == 5) { 
    //var results = e; 
    //throw new Error('Quota ERROR'); 
    throw (e) 
    } 
    Utilities.sleep((Math.pow(2,n)*1000) + (Math.round(Math.random() * 1000))); 
    }  
} 
return results; 
} 
を超過
  • APIコンソールでユーザーあたりの制限数を10.0に変更しました。
  • 使用率は6%です
  • そして私は、私はまたによってはちょうど私が は、通話の私の電話番号をexageratingないです訪問とページビューを求めていることを信じている指数バックオフ
  • を適用します。

The full code

どれideias何が起こっていますか?

答えて

2

それはあなたが1秒あたり10以上の要求を照会することができないためです。それは他の人を助けるかもしれないので、私は(それは古い質問だとしても)ここに解決策を掲載しています:

/** 
* CallLimiter 
* @param {Number} numberOfCalls how many calls per duration are we allowed to do 
* @param {Number} duration  duration in ms 
*/ 
function CallLimiter(numberOfCalls, duration){ 
    var lastCall = 0; 
    var tokens = 0; 

    return function limiter(f){ 
    var now = +new Date(); 

    if (now - lastCall > duration) { 
     tokens = numberOfCalls; 
    } 

    if (tokens <= 0) { 
     tokens = numberOfCalls; 
     // wait for `duration` before calling limiter(f) again 
     return setTimeout(limiter.bind(this, f), duration); 
    } 

    tokens--; 
    lastCall = now; 
    f(); 
    }; 
} 

そして、ここではそれを使用する方法である:

// Stub... 
var Analytics = {Data: {Ga:{get:function(cb){ 
     cb(); 
}}}}; 

function app(){ 
    // Wrap the api call inside a limiter 
    limiter(function(){ 

    Analytics.Data.Ga.get(function(err, data){ 
     // do something with the data... 

     // ... then, loop if necessary 
     app(); 
    }); 

    }); 
} 

// Start 
app(); 

そしてここでは、ブロッキングScalaのバージョンであります:

class CallLimiter(rate: Throttler.Rate) { 
    var lastCall  = 0 
    var duration  = rate.duration.toMillis 
    var current_tokens = 0 

    def apply[A](f:() => A): A = { 
    val d = new Date().getTime 

    if (d - lastCall > duration) { 
     current_tokens = rate.numberOfCalls 
    } 
    if (current_tokens <= 0) { 
     // wait for `duration` before calling f() 
     Thread.sleep(duration) 
     current_tokens = rate.numberOfCalls 
    } 
    current_tokens = current_tokens - 1 
    lastCall = d 
    f() 
    } 
} 

使用法:

import akka.contrib.throttle.Throttler 

val limiter = new CallLimiter(new Rate(10, Duration(1, TimeUnit.SECONDS))) 
val accounts = limiter(() => analytics.management().accounts().list().execute().getItems) 
+0

あなたのソリューションは良いですが、私は10コールの制限を待っている20回のコールを持っている場合は、あなたのクリティカルセクションは、レート制限を打つ、それらのすべてを一度に解放された状態で終了。 –

1

Developers Consoleの[Quotas]セクションで、[ユーザーごとのレート制限]を自分で更新できます。

この制限は、偶発的な使用からあなたを守るためのものです。

あなたはここで多くを学ぶことができます。 https://developers.google.com/console/help/new/#cappingusage

関連する問題