この連載では僕が所属しているノンプロ研で受講した、GAS初級講座での気づきをまとめています。前回の記事はこちらです。
前回までで、スプレッドシート操作について学びました。スプレッドシート上のデータを処理する方法が分かってきましたね。
今回は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にも挑戦します。お楽しみに!!