ryoma's note

マイペース ੯•́ʔ̋ ͙͛*͛ ͙͛*͛ ͙͛̋و

GAS で URL Fetch に失敗したときに再試行する

GAS の URL Fetch Service を利用して Web API に接続する処理を書いたところ、ときどき接続に失敗してデータを取得できない場合があった。

トリガーを利用して定期実行していたので、リクエストの内容に問題がないにも関わらずデータの取得に失敗したときは、自動的に再取得を試行してもらいたかった。

UrlFetchApp のドキュメントを眺めてみたところ、 getResponseCode() を利用すると HTTP ステータスコードを取得できるようなので、200 以外のときに数回再取得を試みてもらうようにした。2回目以降は Utilities.sleep() を利用して、数秒の間隔を空けてから実行してもらう。

function fetchApi() {
...
  // 200のステータスコードが返されるまで3回実行する
  for (let i=0; i<3; i++) {
    try {
      response = UrlFetchApp.fetch(endpoint, options);
    } catch(e) {
      Logger.log(e);
    }

    if (getStatusCode(response) === 200) {
      break;
    }

    if (i >= 2) {
      return;
    }
    Utilities.sleep(5000);
  }
  return JSON.parse(response);
}

function getStatusCode(response) {
  if (response) {
    return response.getResponseCode();
  } else {
    return 400;
  }
}

今のところデータを取得できない事象は再発していないので、引き続き様子をみたいと思います。

参考