numbersでエクセルのwebクエリのような機能はありますか?

webのデータを自動取得をしたいのですが、numbersでできる方法がありますか?

MacBook Air (11-inch, Mid 2012), OS X Mountain Lion (10.8.2)

投稿日 2012/10/18 07:08

返信
返信: 19

2014/05/11 23:26 T22T への返信

do JavaScriptコマンドを実行して定義した変数は、Safari?に保持されているようなので、再度、do JavaScriptコマンドを実行する際にそのまま使うことが出来る様です。


ここに引っかかって、過去の自分のスクリプトを眺めてみたところ、重要なことを思い出しました。


do JavaScript だと、変数がグローバルになってしまうようなので、同名変数が既にある場合にちょっとまずいことになる可能性があります。変数汚染問題ってやつです。


これは無名関数にすると回避できますが、そうすると、値を返すことができなくなります。また、ページをリロードすればすべて御破算になりますが、ネットショッピング中とかはやるべきではありません。


根本的にひっくり返すような話で申し訳ありません。もっと早く思い出すべきでした。


ーーーーー


Bookmarklet - ブックマークレットのグローバル変数汚染デモ

http://www.teria.com/~koseki/memo/bookmarklets/blet_global.html


例えば、「表にクリックイベントを付ける(クリックした表のidを変数_theIdに保存」の変数名「i」を「n」にして、上記ページで試すと、クリックしても何も起こらなくなります。


もうちょっと分かりやすい例だとこんな感じ。


-- スクリプトA

tell document 1 of application "Safari"
    do JavaScript "
        document.body.style.color='green'
        var n = 5;
        n
    "
end tell


-- スクリプトB 無名関数

tell document 1 of application "Safari"
    do JavaScript "
        (function() {
            document.body.style.color='green'
            var n = 20;
            n
        })();
    "
end tell


検証手順

1. スクリプトA を実行した後で「アラート表示」ボタンを押す

2. ページをリロード

3. スクリプトB を実行した後で「アラート表示」ボタンを押す


アラート回数と値の取得状況を比べると良く分かると思います。

2014/05/12 04:25 Hiro__S への返信

Hiro.S 様、


 重要な情報を頂きまして、有り難うございます。 ページのJavaScriptで定義されているグローバル変数と同じ名前をAppleScript側で再定義してしまうと、本来のページの機能が損なわれてしまう訳ですね。 tablesとか、tableとか、rowsとか、theData、theIdなど、いかにも重複しそうな変数名を使うのは駄目ですね。 他の変数名を使うにしても、重複していないかどうか確かめる処理が必要になるので、複雑になりそうです。 もう少し考えてみます。 とても参考になりました。 改めて、御礼申し上げます。  

2014/05/16 18:02 Hiro__S への返信

度々、失礼致します。 WebページのJavaScriptで定義されているグローバル変数の一覧を含むプロパティをObject.keys(windows)で取得できるようです。なので、予め変数に重複があるかどうか調べることができました。


tell document 1 of application "Safari"


set theScript to "Object.keys(window)"

set theGVs to (do JavaScripttheScript)


set theKeywords to {"tables", "theData", "theId"}

repeat with theWord in theKeywords

if (theGVs contains theWord) then

display alert ("このページにはグローバル変数 " & quoted form of theWord & " を含んでいます。¬


do JavaScriptで定義する変数名を変える必要があります。")

end if

end repeat


end tell


少し手間ですが、変数汚染を回避する良い方法がみるかるまで、ひとつひとつのWebページでグローバル変数を調べる必要がありそうです。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

numbersでエクセルのwebクエリのような機能はありますか?

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。