HTTP通信(GASの学習_7)

この連載では僕が所属しているノンプロ研で受講した、GAS初級講座での気づきをまとめています。前回の記事はこちらです。

hirocom777.hatenadiary.org

前回までで、スプレッドシート操作について学びました。スプレッドシート上のデータを処理する方法が分かってきましたね。

今回はHTTP通信・APIです。ネットを通じて他のアプリと通信したりします。

HTTP通信

HTTP通信(Hyper Text Transfer Protocol)は、インターネットを経由して通信をする様式のことです。Webサイトの情報を取得してブラウズしたり、Web APIを経由してデータの送受信ができたりします。

GASではHTTP通信でリクエストを送信したり、レスポンスを解析したりする機能を提供するサービスがあります。これを「Url Fetchサービス」といい、2つのクラスが提供されています。

  • UrlFetchApp
    Url Fetchサービスのトップレベルオブジェクトです。

  • HTTPResponse HTTPレスポンスを取り扱う機能を提供します。

UrlFetchApp

HTTPリクエストを実行するには、UrlFetchAppのfetchメソッドを使用します。記述方式は以下になります。

UrlFetchApp.fetch(URL[, params])

paramsは、オブジェクト型で指定します。指定できる代表的なプロパティは、以下の通りです。

  • contentType
    コンテンツタイプ(text/plain,text/htmlなど)を指定します。デフォルトは 'application/x-www-form-urlencoded'です。文字列で指定します。

  • headers
    HTTPヘッダーを表します。オブジェクト型です。

  • method
    リクエストのHTTPメソッド(get、delete、patch、post、put)を指定します。デフォルトは'get'です。文字列で指定します。

  • payload
    POSTリクエストのボディです。オブジェクト型で指定します。

また、paramsは省略可能です。

HTTPResponse

UrlFetchAppのfetchメソッドを実行すると、戻り値としてHTTPResponseオブジェクトが返されます。以下はHTTPResponseオブジェクトで使用できるメソッドの一部です。

  • getHeaders()
    HTTPレスポンスのヘッダーの属性/値マップを返します。

  • getResponseCode()
    HTTPレスポンスのステータスコード(OKの場合は200番台、エラーの時は400/500番台等)を取得します。

  • getContentText()
    文字列にエンコードされたHTTPレスポンスの内容を返します。

それでは早速HTTPリクエストを実行してみましょう。

function myFunction() {

  const url = 'https://hirocom777.hatenadiary.org/';
  const response = UrlFetchApp.fetch(url);

  console.log(response.getHeaders());
  console.log(response.getResponseCode());
  console.log(response.getContentText().slice(0, 300));

} 

結果は長くなるので省略しますが、ヘッダー情報と実行結果(成功すると200)、内容(今回はsliceメソッドで300文字まで取得している)が返ってきました。

エラー時の処理

上のコードで実在しないURLを指定すると、当然エラーになります。たとえばURLを以下にすると、

  const url = 'https://hirocom777.hatenadiary.org/x';

以下が返ってきます。

  Exception: Request failed for https://hirocom777.hatenadiary.org returned code 404. 
  以下、長いので省略。

エラーなので404が返ってきます。これで処理が止まってしまうのですが、エラー発生時に別の処理(例外処理)を行う方法があります。try...catch文を使います。記述方式は以下になります。

try { //検知の対象となる処理 } catch(仮引数) { //例外が発生したときに実行する処理 }

仮引数には、エラー名(name)とエラーメッセージ(message)をプロパティに持つ、オブジェクトが返されます。

function myFunction() {

  const url = 'https://hirocom777.hatenadiary.org/x';

  try {
    const response = UrlFetchApp.fetch(url);
    console.log(response.getContentText().slice(0, 300));
  } catch (e) {
    console.log(e.name);
    console.log(e.message);
  }

}

これでe.nameにはエラー名(Exception)、e.messageには続く先ほどのメッセージが入力され、処理は継続します。

次回はPOSTリクエス

以下がでしょうか。Webからのデータ取得方法が朧気ながらわかってきました。今回はGETリクエスト(デフォルトで指定)でしたが、次回はPOSTリクエストを取り扱います。Web APIにも挑戦します。お楽しみに!!

hirocom777.hatenadiary.org GAS関連記事まとめ - HiroCom777の学習記録