UrlFetchAppの並列処理でタイムアウト克服|Google App Script

Google App Script

Google App Script(GAS)で、複数のURLリストからHTTPリスエストする方法はUrlFetchApp.fetch()を使って、for構文のループ処理で順番にresponseを取得する方法があります。

でも、この方法だと処理時間が掛かるし、件数によってはGASのタイムアップでエラーになることもある。

そこで、並列処理を行う方法に変更しました。

 

やること

スプレッドシートにあるURLリストを読み込み、UrlFetchApp.fetch()を使ってHTTPリクエストし、レスポンスを受け取る。

 

順次処理の場合

まずはfor構文でロープ処理して、順次HTTPリクエストを行う方法です。

 

function gethttpresponse1() {
  var spreadsheet = SpreadsheetApp. getActiveSpreadsheet().getSheetByName('シート1');

  // getLastRow()でデータがセットされている最終行を取得する
  var lastRow = spreadsheet.getLastRow();

  // 配列urlsを宣言
  var urls = [];

  // 配列responseを宣言
  var responses = [];

  //配列urlsにURLリストを読み込む
  for(var j=1; j<=lastRow; j++){

    // スプレッドシートの A列にURLが記載されている
    // 1行目から順にをURL取得し変数urlにセットする
    urls.push(spreadsheet.getRange(j, 1).getValue());
  }

  // 変数urlにセットされているURL対してHTTPリスエスト
  // 配列responsesにレスポンスを格納する
  for(var i=1; i<=lastRow; i++){
    responses.push(UrlFetchApp.fetch(urls));
  }

  // 取得結果responseをログ出力
  Logger.log(responses);
}

 

この方法の場合、件数が少ない場合は気にならないのですが、件数に比例して処理時間が長くなってしまいます。

GASは処理時間が6分を超えるとタイムアウトになって、処理が中断されてしまいます。

 

そこで並列処理する方法に変更しましょう。

 

並列処理に変更

修正したのは、下記の箇所です。

var responses = UrlFetchApp.fetchAll(urls);

これにより、ループ処理すること無く1回の処理でHTTPリクエストを行うことができます。

 

function gethttpresponse2() {
  var spreadsheet = SpreadsheetApp. getActiveSpreadsheet().getSheetByName('シート6');

  // getLastRow()でデータがセットされている最終行を取得する
  var lastRow = spreadsheet.getLastRow();

  // 配列urlsを宣言
  var urls = [];

  // 配列responseを宣言
  var responses = [];

  //配列urlsにURLリストを読み込む
  for(var j=1; j<=lastRow; j++){
    // スプレッドシートの A列にURLが記載されている
    // 1行目から順にをURL取得し変数urlにセットする
    urls.push(spreadsheet.getRange(j, 1).getValue());
  }

  // 変数urlにセットされているURL対してHTTPリスエスト
  // 配列responsesにレスポンスを格納する
  var responses = UrlFetchApp.fetchAll(urls);

  // 取得結果responseをログ出力
  Logger.log(responses);
}

 

参考にしたサイト

UrlFetchApp.fetchの応答3種 タイムアウトがつらい – Qiita

Google Apps Script試行錯誤 Blog: UrlFetchApp.fetchAllを使って複数のfetchを同時にやって実行時間の短縮を試みる (pre-practice.net)

コメント