t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

WSH/JScriptで起動中のIEからURLを取得する。

先日買ったJavaScript本のコードを何度か写経して、そろそろ自分でもコードを書いてみたくなった。
thom.hateblo.jp

そこで、普段仕事でもよく使うIE操作のテクニックの準備段階である、開いているIEのURLを取得するコードを書いてみることにした。

普段はExcelVBScriptでコーディングする。

そこで、VBScriptで書いたコードをJavaScriptに直していくことにした。

以下はVBSで書いたコード。

Call test

Sub test()
    With CreateObject("Shell.Application")
        For i = 0 To .Windows.Count - 1
            Dim a: a = ""
            On Error Resume Next
            a = .Windows(i).document.URL
            On Error GoTo 0
	    If Len(a) > 0 Then MsgBox a
        Next
    End With
End Sub

JavaScriptに直してみたのがこちら。

test();

function test() {
    var sh = WScript.CreateObject("Shell.Application");
    for (var i = 0; i < sh.Windows().Count; i++) {
        var a = "";
        try {
            a = sh.Windows(i).document.URL;
        } catch(e) {
        }
        if(a) WScript.echo(a);
    }
}

出来上がってしまえばなんてことは無いのだが、作ってる最中は実行時エラーとの戦いだった。
セミコロンが抜けてるだのカッコが無いだのと、まぁ文句が多いこと。。
それと、大文字と小文字を厳格に区別するので、ifをIfと書いたり、echoをEchoと書いて動かなかったりした。

ひとつ、ハマってしまったのはsh.Windows().Countの部分。
最初sh.Windows.Countと書いていて、小文字にしても動かず途方に暮れて質問サイトで聞いてみたらあっさり回答が来た。sh.Windowsの後にカッコがいるらしい。

あとこれは自己解決したが、変数aの判定で最初、if(a.length > 0)としていたが、これではダメだった。
VBScriptのOn Error Resume Nextと違い、try ~ catchでは不明なプロパティをaに代入しようとするとundefinedが入ってしまうようだ。

undefinedや""はそのままifで判定するとfalseになり、1文字以上の文字列はtrueになる仕様のようなので、結局if(a)でやりたいことができた。

qiita.com

そういえばVBAも最初始めたころはエラー連発だったのを思い出した。
今でこそ、一気に書き上げてさくっと動いてしまったりするが、初心者の頃はちびちび作りながらコンパイルして、エラーが出て、何時間も悩んで…ということをやっていた。

繰り返し失敗して、悩むことでだんだんプログラミングの勘が養われてくるんだと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。