Excel 2013 から導入された WEBSERVICE 関数を使うとマクロを使わずに外部のデータを取得することができます。この記事では WEBSERVICE 関数の使い方やはまりどころなどを紹介します。
基本情報
以下の書式で使用することができます。
WEBSERVICE(URL)
URL (必須) によって指定された URL に対して GET リクエストを発行して、その結果文字列を返す、というのが基本的な挙動です。以下のような注意書きがついています。
- 引数がデータを返せない場合、エラー値 #VALUE! が返されます。
- 引数が無効な文字列と判明した場合、または引数がセルの許容範囲である 32767 文字を超える文字列になった場合、エラー値 #VALUE! が返されます。
- URL の文字列が GET 要求の許容範囲である 2048 文字を超える場合、エラー値 #VALUE! が返されます。
- ftp:// や file:// などのサポートされていないプロトコルの場合、WEBSERVICE はエラー値 #VALUE! を戻します。
使い方
ためしに Qiita の robots.txt http://qiita.com/robots.txt を取得してみましょう。
手順は以下のとおりです。
1. 新規の Excel ワークシートを作成
2. A1 セルにて以下の関数を入力
=WEBSERVICE("http://qiita.com/robots.txt")
3. セルに robots.txt が挿入される
セルの幅・高さを調整して 折り返して全体を表示 を有効にするとこのような表示になります。
エラーが起きるケースではこのような表示になります。
サーバ側では?
手元のサーバで試してみたところ、WEBSERVICE 関数からのリクエストには以下のような HTTP ヘッダが設定されていました。サーバ側では User-Agent を使って判定することができるかもしれません。
Connection: Keep-Alive
User-Agent: Excel/15.0
Host: localhost
あと、コンテンツの文字コードは UTF-8 にしておくのが無難なようです。 ためしに text/plain; charset=Shift_JIS のように設定したコンテンツは EXCEL 側で文字化けを起こしていました。
制限事項
ファイル形式
WEBSERVICE 関数は FILTERXML 関数 と組み合わせることで、XML を返す Web API からのデータの取得が想定されています。もしも JSON や CSV のようなデータ形式を扱おうとすると、EXCEL の関数だけでパースをしなければならないので難易度が高いです(マクロを使ったほうが簡単)。
入力文字数
URL の文字列が GET 要求の許容範囲である 2048 文字を超える場合 にエラーになるという制限があるので、たとえば SPARQL Endpoint に SPARQL Query を投げるようなケースでは注意が必要になります。
出力文字数
セルの許容範囲である 32767 文字を超える文字列になった場合 にエラーになるという制限があるので、あまり大きなレスポンスが返ってくるようなサービスと組み合わせるとうまくいかないことがあります。
関数の同時呼び出し
WEBSERVICE 関数を入力したセルを別のセルにコピー&ペーストする場合には、ペーストされた直後に一斉に WEBSERVICE 関数が実行されることになります。これは結構負荷の高い処理になりがちなので注意が必要です。Excel から一時的に応答がなくなったり、挙動が不安定になることもあります。なお、一度実行された結果は計算結果としてキャッシュされるので、明示的に指定しないかぎり再計算は発生しない挙動のようです。
セキュリティ
WEBSERVICE 関数を使ったワークシートを作成して、保存してみます。
これを再度開いたとき、デフォルトでは Web サービス機能は無効になっています との警告が出ます。
このように WEBSERVICE 関数は明示的に有効化して使用する必要があります。マクロなんかと同様のセキュリティレベルにあるといえます。用途に応じては、関数部分を値だけコピーしたり、そもそも CSV にして配布する、といった方法が歓迎されるかもしれません。
まとめ
WEBSERVICE 関数を紹介しました。マクロを使わずに外部サービスのデータを利用できる便利なものですが、反面、制限が多く使い方にも注意が必要です。