by manamana
3. 7月 2013 09:00
Yahoo! の Web API 一覧を見ていたらショッピングWeb APIがありました。
Yahoo! JAPANが提供するショッピングWebAPI
以前、VSTOで Amazonや楽天のサービスを使い画像を取得するアドインを組んだことがありますが、
それと同様のことが Excel PowerShell Tool でも簡単に構築できそうです。
…ということで作ってみました。 サンプルとして机上にあった商品を検索してみました。
簡単に出来るつもりでしたが、結構ハマりました。
Invoke-RestMethod で XMLデータを取得すると何故か文字化けをするのです。
Encode には UTF-8 を利用しているし、これといった問題は見つかりません。
念の為に UTF-8 -> UTF-16(=Unicode) への手動変換とかしてみましたが効果なし。
真面目に調べると時間がかかるので、JSONにて処理をしたところ普通に動きました。
※ただし、ドキュメントとは微妙にエントリー位置が異なったりする
Invoke-RestMethod + XML に関しては後日検証しなければ…
MSはWebサービスに対してSOAP形式を推していましたが、世の中はREST+JSONが主流です。
REST+JSONは必要な機能を備えているし、テキストベースでも開発できますからね。
ExcelでJSONデータの編集をするツールでも作ってみるかな~
4b40a698-1ea2-4291-90b2-fc8414338368|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
1. 7月 2013 13:00
天気予報が簡単だったので、調子にのって「でんき予報」も作ってみました。
使えそうなサービスはないかと探した所、Yahoo! Japan のWebサービスが充実しています。
YAHOO! Japan デベロッパーネットワーク
いろいろなサービスがありますが、それらを使うには「アプリケーションID」を取得する必要があります。
このIDはおいそれと公開するものではないので、今回はスクリーンショットにとどめておきましょう…
先日からの PS Tool 用ソースの使い回しなので、2時間程度で形になりました。
興味の有る方はご連絡ください。
ブラウザで得られる情報をExcelに取得するのに意味があるのか? という質問がありましたが、大いにあります。
Excel 上で行われる作業は個人や会社のノウハウの塊です。
いくらブラウザが進化しても、Excel の必要性が無くなるとは思えません。
Excel で重要なのは、必要なデータを素早く正確に取得することです。手打ちは出来るだけ避けたいところです。
PS Tool を使ってデータ取得の自動化に挑戦してみてください。
4b03b6d1-f3b0-4025-bcec-a6d0de714197|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
28. 6月 2013 12:00
昨日の気象情報取得で使ったのは、WebServiceX.Net という海外のサイトです。
データが英語なのでちょっと使いにくいかもしれません。
もう少し一般的な情報源はないかとさがしたところ、ライブドアの天気予報を見つけました。
ライブドアお天気Webサービス
このサービスは XML ではなく JSON でデータを返してくれます。
…実は JSON を扱った事がなかったのですが、便利なコマンドレットがありました。
Invoke-RestMethod
このコマンドレットは、PowerShell 3.0から追加された Webサービス用のものです。
特筆すべきは、XML/JSONのパースを自動的に行う点で、何も考えずにサービスが利用できます。
便利過ぎます。
#@PSTOOL
$ws = $_Excel.Activesheet
$ws_master = $_Excel.ActiveWorkbook.Worksheets.Item("Master")
$addin = $_Excel.ComAddins.Item("ExPSTool").Object
#==== 天気情報格納用の型
$MyType = @"
public class OtenkiType {
public string dateLabel;
public string date;
public string telop;
public string imageurl;
public string temperature;
}
"@
#--- 型の追加(※既存の場合はエラーになるので SilentlyContinue)
Add-Type -TypeDefinition $MyType -ErrorAction:SilentlyContinue
$Otenki = New-Object -TypeName OtenkiType
$city = $ws.Range("LWWSId").Value2
$json = Invoke-RestMethod -uri "http://weather.livedoor.com/forecast/webservice/json/v1?city=$city"
#--- 概況等は直接出力
$ws.Range("LWWS_URL").Value2 = $json.link
$ws.Range("LWWS_Time").Value2 = $json.publicTime
$ws.Range("LWWS_Description").Value2 = $json.description.text
#--- 3日分のデータはMasterシートのテーブルに出力して参照する
$List = $ws_master.ListObjects.Item("LWWSResultTable")
$rg = $List.HeaderRowRange
$addin.SetStartRange($rg)
$json.forecasts | foreach {
$Otenki.dateLabel = $_.dateLabel
$Otenki.date = $_.date
$Otenki.telop = $_.telop
$Otenki.imageurl = $_.image.url
$min = $_.temperature.min.celsius
$max = $_.temperature.max.celsius
$Otenki.temperature = "最低:"+$min +" 最高:"+$max
$Otenki
}
#--- せっかくだからお天気アイコンも付ける
$rg = $List.ListColumns.Item("imageurl").Range
$shape = $ws.Shapes.Item("LWWS_Img0")
$shape.Fill.UserPicture($rg.Cells.Item(2, 1).Value2)
$shape = $ws.Shapes.Item("LWWS_Img1")
$shape.Fill.UserPicture($rg.Cells.Item(3, 1).Value2)
$shape = $ws.Shapes.Item("LWWS_Img2")
$shape.Fill.UserPicture($rg.Cells.Item(4, 1).Value2)
PowerShell環境からExcelのオブジェクトを操作する際のコストは非常に大きなものがあります。
詳しい理由は知りませんが、COMオブジェクトとPSObjectの変換コストが原因だと思われます。
よく使う機能は DLL 化するなりの工夫が必要ですが、PS Tool の表出力はそこそこ速度があるので
直接Cellに書くような事をしないで、表形式で出力をしてやり、Excel上では式による参照をするのが効果的です。
今回は天気予報用の型を用意し、3日分のデータを表形式で出力しています。
文字だけでは芸がないので、Excelの図形に天気アイコンを埋め込みそれっぽくしてみました。
東京の天気予報
那覇の天気予報。あぁ、沖縄に行きたいww
PS Tool を使えば、Excel上でWebサービスの恩恵をうけることが可能になります。
天気予報などは一般的な例ですが、企業の内部データを直接Excel上に展開するといった使い方は便利でしょう。
何か案件がありましたご連絡ください。
ダウンロード ↓↓↓
天気予報.xlsx (31.31 kb)
dddb6ef0-9f2e-483a-addb-c4d3fe71826b|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
27. 6月 2013 12:30
VBAでは構築が困難な例として、Webとの連携が挙げられます。
その点、PowerShell は .Net の資産を有効に使えるので Web から簡単に情報を取得出来ます。
New-WebServiceProxy
このコマンドレットは、 任意のWebサービスに接続して情報をXML形式で受け取ります。
後はそれを好きに加工して表示してやればいろいろ面白いことが出来るわけです。
気象情報でも取得しよう! と思った所、先人が居られました。とても参考になります。
PowerShellでGlobalWeatherから天気情報取得してみる
ここでは、例によって Excel PowerShell Tool で動かすようにします。
予め、観測地点の一覧をテーブル化し、リストから選択するという Excel っぽい感じです。
ソースです。Cellに直接データを入れています。もう力技ですねww
#@PSTOOL
$ws = $_Excel.Activesheet
$addin = $_Excel.ComAddins.Item("ExPSTool").Object
$city = $ws.Range("WeatherInfoCity").Value2
$web = New-WebServiceProxy -uri http://www.webservicex.net/globalweather.asmx
[xml]$xml = $web.GetWeather($city, "Japan")
$CurrentWeather = $xml.CurrentWeather
$rg = $ws.Range("WeatherInfo")
$rg.Cells.Item(1, 1).Value2 = $CurrentWeather.Time
$rg.Cells.Item(2, 1).Value2 = $CurrentWeather.Wind
$rg.Cells.Item(3, 1).Value2 = $CurrentWeather.SkyConditions
$rg.Cells.Item(4, 1).Value2 = $CurrentWeather.Temperature
$rg.Cells.Item(5, 1).Value2 = $CurrentWeather.RelativeHumidity
$rg.Cells.Item(6, 1).Value2 = $CurrentWeather.Pressure
東京を選んでみました。
次は普天間基地です。30℃超えてますね…
PowerShellで Excel を操作すると、反応が異様に遅いです。表示が目で追えるレベルです。
今回のようにデータ数が少なければ良いのですが、大量のデータを PowerShell 経由で Excel に出力するには
それなりの工夫が必要になります。この辺はまたの機会に…
ダウンロード↓↓↓
お天気.xlsx (17.19 kb)
755092ae-cd17-41b4-b6d1-3349b70af9a7|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
26. 6月 2013 15:00
Windows Sever 2012 は Windows 8と同一カーネルのサーバーOSです。
デフォルトではインストールされていない、「デスクトップ エクスペリエンス」を有効にしてやれば
Windows ストアが利用できるようになり、モダンスタイルのアプリも楽しめます。
その中でも「星座表」はお勧めです。無料でこれは無いだろうとうクオリティです。
ところがこの星座表、アップデートをしたら Sever 2012で起動しなくなりました…
Windows Sever 2012では一部のゲームが動かなかったりします。
これは、Win8 にはあるのに Sever 2012 には存在しない Direct-X 関連のファイルが原因です。
どうやら星座表のアップデートに伴い、グラフィックス環境が大きく更新されてしまったようです。
この辺りの説明を~と思いましたが、@ITに詳しい記事がありました。
Windows Server 2012でWindowsストア・アプリを利用する (@IT)
記事の情報に従い、Win8の環境から数個のファイルをコピーすることで無事に星座表が動きました。
※多機能になりましたが、CPU負荷が半端ないです。6コアで90%を超えるとか…う~ん
この設定をすると、Server 2012上でストアアプリのソリティアやピンボールも動いてしまいます。
ご利用は計画的にww
ab2fc458-29ad-4fb0-9c9c-4fc6e9734e2e|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Server