NumbersでWebから表組みをコピーして、そのままの形式で貼り付ける方法

NumbersでWebから表組みをコピーして、そのままの形式で貼り付ける方法


NumbersでWebページにあるテーブルタグ形式の部分をコピーし、

それをNumbersにセル分けした状態になるようにペーストしたいのですが、

Safariでやっても一行のセルにしかペーストできません。


一旦、Pagesやテキストエディットに貼り付けるとタブ分けされてちゃんと張り付くのですが、

それをコピー&ペーストしてもセル分けされてペーストできません。


良きアドバイスありましたらお願いします。

MacBook Pro (Retina, 15-inch, Mid 2015), OS X El Capitan (10.11.6)

投稿日 2016/10/28 05:24

返信
返信: 19

2016/10/31 02:31 T22T への返信

追記(修正): 1)のAppleScriptにつきまして、下記のように修正すると、行頭のスペースを取り除くことができました。


tell document 1 of application "Safari"


activate

set theScript to "var theMono=document.getElementsByClassName('mono');

var str=theMono[0].textContent;

var sbstr=str.substring(str.indexOf('コード 銘柄名'),str.indexOf('売上高')-2);

sbstr.replace(/ </g,'<').replace(/[  ]+/g, ' ')"

set theText to do JavaScripttheScript


set the clipboard totheText

end tell

具体的には、'コード銘柄名'のコの字の前のスペースを取り除き、' <'の文字列を'<'に置き換えた上で、スペース(半角及び全角)の連続をタブに置き換えています。 replace(/[  ]+/g, ' ')の、' 'の間には、\t が入っています。

ScriptEditor.appの環境設定で、メニューバーにスクリプトメニューを表示する項目にチェックを入れて、Safari.appを開いて、スクリプトメニューから、Safariスクリプトフォルダーを開くのコマンドを実行して表示されるフォルダ内にAppleScriptを保存しておくと、スクリプトメニューからAppleScriptを実行できるようになるので便利です。

2016/10/31 03:37 ぴーすけ への返信

すみません、色々と省略して説明してしまい、正しくお伝えできなかった様です。 私の環境はmacOS Sierraなので、お使いのMacとは少し手順が異なるかもしれませんが、


1)Safari.appの環境設定から、詳細タブを選択して、『メニューバーに”開発”メニューを表示』の項目にチェックを入れます。 そして、Safari.appのメニューバーにある開発メニューから、『AppleEventからのJavaScriptを許可』のコマンドを選択して、チェックを入れます。


2)Safari.appで、底打ちの7-9月期「増収増益」銘柄リスト 35社選出のページを表示します。


3)アプリケーションフォルダのユーティリティフォルダにある、スクリプトエディタ.appを起動させて、新規書類を作成して、ウィンドウに上記のスクリプトをコピペして、ツールバーにあるハンマーのアイコンを押して、コンパイルします。 (コピペの際に、replace(/[  ]+/g, ' ') の ' 'の間がタブではなく、スペースに置き換わってしまっているかもしれません。その際は、'\t' と書き換えて、コンパイルします。)

 ユーザがアップロードしたファイル


4)スクリプトエディタ.appのウィンドウのツールバーにある、実行ボタンユーザがアップロードしたファイルをクリックすると、Safari.appで表示しているページがアクディブになり、AppleScriptが実行されて、クリップボードにデータの表が入ります。 


5)Numbers.appの表を選択して、ペーストを実行します。


といった具合になります。 Safari.appで表示しているページのデータを選択してコピーする必要もなく、Jeditで編集する必要もないですよ。 ご確認ください。

2016/10/31 02:32 ぴーすけ への返信

度々、失礼致します。 


1)AppleScriptのSafari.app用のコマンドでJavaScriptを実行できます。 このコマンドを使った、一つの方法を考えてみました。 このスクリプトは、


底打ちの7-9月期「増収増益」銘柄リスト 35社選出


のWebページを対象にしています。 Safari.appでこのページを表示した状態でAppleScriptを実行するとクリップボードにTSV形式でデータが入りますので、それをNumbers.appにペーストします。 実行するには、Safari.appの環境設定>詳細で、デヴェロッパメニューを表示するにチェックを入れて、メニューの『Apple EventsからのJavaScriptを許可』の項目にチェックを入れておきます。


処理の考え方としては、まず、取り出したいデータの部分のHTMLのエレメントのクラス属性?がmonoという名前だったので、その部分を切り出して、テキストを抽出しています。 次に、” コード 銘柄名”から、”*売上高”の文字列の前の部分までを取り出し、スペース(半角と全角)の連続をタブに置き換えています。 行頭のスペースを取り除きたかったのですが、私の知識では無理でした。 なお、このような処理の性質上、他のページで実行してもデータを取り出せないと思います。


tell document 1 of application "Safari"


activate

set theScript to "var theMono=document.getElementsByClassName('mono');

var str=theMono[0].textContent;

var sbstr=str.substring(str.indexOf(' コード 銘柄名'),str.indexOf('売上高')-2);

sbstr.replace(/[  ]+/g, ' ')"

set theText to do JavaScripttheScript


set the clipboard totheText

end tell


(Script Editor.appの新規書類に上記のAppleScriptをコピペして実行ボタンを押します。スクリプトの実行はスクリプトメニューやAutomator.appのサービスなどを使うとより簡単に実行できます)


2)表タグを使ったWeb Pageの表からデータを取り出してクリップボードへコピーする試みについては、中途半端な状態ですが、こちらのスレッドを参考にして見て下さい。


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


3)1)の方法では、コードの文字列のリンクが取り除かれてしまいます。 リンクを取り入れる場合は、他の方法(AppleScriptObjCなど)も可能だと思います。 色々な方法があるとは思いますが、参考になれば幸いです。


サポートコミュニティーの皆様、他にも良いアイディアがありましたら、ご教授下さい。 宜しくお願い申し上げます。

2016/11/02 21:36 ぴーすけ への返信

ぴーすけ 様、


うまく動いた様で、何よりです。 以下の2つのWeb Pageは、同じ様なデータ表示の構造を持っているので、どちらからでもデータを取り出せますね。 エレメントのクラス名が ’mono'で、データの最初と最後に『コード 銘柄名』、『※売上高』の文字列があって、<やスペースなどでデータが区切られています。



他のページでも、HTMLのソースコードを調べてエレメントを特定できれば、JavaScriptを使ってデータを抽出できそうです。 私はこちらのページを参考にしてスクリプトを作りました。

 

2016/10/28 07:16 T22T への返信

返信、ありがとうございます。


以下のような裸のままのものなのですが。。


https://kabutan.jp/news/marketnews/?b=n201610280543


表というよりか、タブもしくはスペースで区切られた文字列です。

・10月27日版 底打ちの7-9月期「増収増益」銘柄リスト 35社選出

の下の行の塊になります。


よろしくお願いします。

2016/10/31 02:31 T22T への返信

度々、恐れ入ります。

色々やっていただき、コードまで書いていただきありがとうございました。


わかりました!(笑)

漸く、おっしゃっていることがわかりました。で、出来たと思います。

AppleScriptでSafariから選択部分を書き出させた後に、editorへ持っていき

Spaceをtabに検索・全て置き換え→コピーしてNumbersへ張り込むと出来ました🙂

きれいに入っていると思います。


素晴らしいです。

色々とどうもありがとうございました。m(__)m

2016/10/31 04:14 T22T への返信

行頭のスペースを取り除く

コピペの際に、replace(/[  ]+/g, ' ') の ' 'の間がタブではなく、スペースに置き換わってしまっているかもしれません。その際は、'\t' と書き換えて


こんな感じでどうでしょうか?スクリプトエディタ.app にそのままコピペしても大丈夫だと思います。


tell document 1 of application "Safari" activate set theScript to "var $my001 = (function() { var theMono=document.getElementsByClassName('mono'); var str=theMono[0].textContent; var sbstr=str.substring(str.indexOf(' コード 銘柄名'),str.indexOf('※売上高')-2); var a1 = sbstr.split('\\n'); var a2 = []; for (var i = 0; i < a1.length; i++) { a2.push(a1[i].replace(/^ /, '').replace(/[\\u3000\\u0020]+/g, '\\t')); } return a2.join('\\n'); })(); $my001;" set theText to do JavaScript theScript set the clipboard to theText theText end tell


動作確認

・Mac OS X 10.6.8 / Safari 5.1.10

2016/10/31 04:25 Hiro__S への返信

Hiro.S 様、


いつも有難うございます。 私の環境で、ScriptEditor.appに提示してくださったスクリプトをコピペしてコンパイルしても、タブや改行文字が自動的に変換されてしまうこともなく、狙い通りにNumbers.appの表へペーストできることを確認致しました。 なるほどです。 初めに、改行文字で分割した上で、正規表現の^で行頭のスペースを取り除き、連結し直すのですね。 スペースをユニコードで指定する方法も勉強になりました。 有難うございます。

2016/10/31 05:05 T22T への返信

T22T さん


確認ありがとうございます。


スペースをユニコードで指定する方法


実はこれ手抜きです。問題が起きる文字はなさそうなので、このようにしました。詳細を書くと脱線になってしまうので、リンクだけ貼っておきますね。


javascript - \uXXXXを使わない理由

http://blog.livedoor.jp/dankogai/archives/50984995.html


ーーーーー


ぴーすけ さん


T22T さんのコードにちょっと手を加えたもので大丈夫のようですから、試してみてください。

2016/11/02 19:02 Hiro__S への返信

T22T様

Hiro.S 様

お世話様です。

※OSをSierraにアップグレードしていたので、お返事遅くなりすみません。

出来ました!!凄いっす。(^^)

ちゃんとtabに置き換わってます。

どうもありがとうございましたm(__)m



以前、言語の勉強したこともあるのですが、私にはちょっとハードルが高かったようで、中途挫折してしまいましたが、やはりTechnologyって凄いですね。

お二方に、感謝です。

色々どうもありがとうございました。

2016/11/18 22:02 Hiro__S への返信

前のスクリプトは変数汚染の回避方法に誤りがありました。この場合に限って言えばそのままでも問題ありませんが、一応修正しておきます。すみませんでした。


それとついでに空行も削除してみました。これを応用すると、特定の銘柄を除外する等のフィルタ処理ができます。


tell document 1 of application "Safari" activate set theScript to "(function() { var theMono=document.getElementsByClassName('mono'); var str=theMono[0].textContent; var sbstr=str.substring(str.indexOf(' コード 銘柄名'),str.indexOf('※売上高')-2); var a1 = sbstr.split('\\n'); var a2 = []; for (var i = 0; i < a1.length; i++) { if (/./.test(a1[i])) { a2.push(a1[i].replace(/^ /, '').replace(/[\\u3000\\u0020]+/g, '\\t')); } } return a2.join('\\n'); })();" set theText to do JavaScript theScript set the clipboard to theText theText end tell


また、分岐処理を行わないなら、もっと簡単に次のようにしても良いでしょう。


tell document 1 of application "Safari" activate set theScript to "(function() { var theMono=document.getElementsByClassName('mono'); var str=theMono[0].textContent; var sbstr=str.substring(str.indexOf(' コード 銘柄名'),str.indexOf('※売上高')-2); var a1 = sbstr.split('\\n'); for (var i = 0; i < a1.length; i++) { a1[i] = a1[i].replace(/^ /, '').replace(/[\\u3000\\u0020]+/g, '\\t'); } return a1.join('\\n'); })();" set theText to do JavaScript theScript set the clipboard to theText theText end tell

2016/10/28 07:30 ぴーすけ への返信

テーブルのタグは使われていないですよ。 スペースとline breakのタグしかないのではないでしょうか?

 ユーザがアップロードしたファイル

この場合は、連続するスペースをタブに置き換えてやる処理を実行すれば良さそうです。方法等も少し考えて見ますので、暫く時間をください。

2016/10/28 05:55 ぴーすけ への返信

失礼致します。 

例えば、どのようなWeb Pageの表でしょうか? アメダスの表などであれば、Numbersへ正常にコピペできますよ。 → http://www.jma.go.jp/jp/amedas_h/today-50066.html?areaCode=000&groupCode=34

おそらく、コピーした後に改行などの文字コードを変更する処理が必要だと思います。

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

NumbersでWebから表組みをコピーして、そのままの形式で貼り付ける方法

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