Excel

Excel の WEBSERVICE 関数で外部データ取得

More than 3 years have passed since last update.

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")

image

3. セルに robots.txt が挿入される

image

セルの幅・高さを調整して 折り返して全体を表示 を有効にするとこのような表示になります。

image

エラーが起きるケースではこのような表示になります。

image

サーバ側では?

手元のサーバで試してみたところ、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 関数を使ったワークシートを作成して、保存してみます。

image

これを再度開いたとき、デフォルトでは Web サービス機能は無効になっています との警告が出ます。

image

このように WEBSERVICE 関数は明示的に有効化して使用する必要があります。マクロなんかと同様のセキュリティレベルにあるといえます。用途に応じては、関数部分を値だけコピーしたり、そもそも CSV にして配布する、といった方法が歓迎されるかもしれません。

まとめ

WEBSERVICE 関数を紹介しました。マクロを使わずに外部サービスのデータを利用できる便利なものですが、反面、制限が多く使い方にも注意が必要です。