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)
コメント