他人のページに勝手に「このテーブルをダウンロード」ボタンを付けて、ダウンロードできるようにする工夫。(Tampermonkey)を初めて知ったときは、「なるほど。こんなことができるんだ」と大いに感激したものだ。以下のスクリプトを使うと、他人のページのテーブルの下部にダウンロードボタンが現れる。押すと、テーブルの内容がCSVファイルでダウンロードされる。自分のページは自分だけが改変できるし、他人のページはその管理者だけが改変できる、というのは必ずしも正しくない。勝手にボタンを付けることは可能だ(他にもいろいろできる)。ハッキング(不正侵入)とは違う。相手方がこちらのブラウザーに送り届けた画面情報を、こちらのブラウザーの側で変更しているだけだ。相手のサーバー上にあるデータを変更しているわけではないし、相手のサーバーに特別なデータを出させているわけでもない。通常は、相手は、こちらが改変していることを感知できない。(ただし、相手の著作権や商標権の侵害にはなり得るので、改変した画面の二次利用には注意。)ネットに同等品は幾つかあるが、JCBのサイトでworkしなかったので作った。jQueryはGreasemonkey/Tampermonkeyで動く動かないという話があるようだが、少なくとも現時点では最新のChromeブラウザ(Windows)と最新のjQueryの組合せで特に問題ないようだ。次のライブラリを使用。tr'を加えた方が良い。この文章を書いた翌日、DCカードの明細(速報)画面に仕様変更があり、上記のコードでは正常にテーブルを取れなくなった。こんなに短いならbookmarkletでもできそうだが、bookmarkletだと別スクリプトや外部ファイル(ライブラリなど)をincludeできないはず。仕事でJavaScriptを始めた人を除き、何がJavaScriptを使うきっかけになるのだろうか。私はChromeブラウザとJavaScriptを使うと、画面上に書いてある情報を抜き出すのが楽になる(手作業で一つ一つコピペしなくて済む)ことだった。三井住友銀行のページから、「今月」のPDF(毎日アップされる)の、URL一覧を取得したいとする。仕様が変更されたら動かない。Toolsを開き(F12キーを押す)、Consoleタブにスクリプトを記入・実行する。スクリプトは、一行ずつConsoleに書くのではなく、メモ帳に書いてから、全部の行の分をまとめてConsoleにペーストする。'url.txt';a.click();手作業でやるより簡単で、間違いがない。スプレッドシートが便利だ。†データの取得は左側のように1次元のことが多いだろう。内容を把握するには右側のような2次元にするのが普通だ(クロス集計)。Sheetsを使うと簡単だ。「=B3」みたいに個々ベタに埋め込むとメンテが困難を極める。=FILTER($B:$B,$E3=$C:$C,F$1=$A:$A)F2だけなら「=FILTER(B:B,E2=C:C,F1=A:A)」でよい。これを他のセルにコピーするため絶対番地にする。†やり方は色々あるが,私がよく使うのはfilter関数。スプレッドシートのもの。)軽くて,条件設定も柔軟。シート1の列Bと列D,列FからG,以上から(このように飛び飛びでもよい),列Aの値が4で,かつ列Cの値が"車"の行だけを取り出すなら=filter({'シート1'!b:b,'シート1'!d:d,'シート1'!f:g},'シート1'!a:a=4,'シート1'!c:c="車")UNIXのパイプのようにそのままsortやuniqueをかけられるのも重宝する。†vlookupだと、条件を一つしか付けられないが、filterなら幾つでも付けられる。これはExcelにはない大きな利点だ。filterはarrayformulaと組みにできない不利もある。複数条件のvlookupをarrayformulaと組みにするため、複数条件のvlookupを1条件に書き直すアプローチもある。求める値がC列、検索語と検索範囲のペアが、A列に対しD列、B列に対しE列(2条件)のとき、つまり=filter(c:c,a2=d:d,b2=e:e)のとき(行2の式)、A列とB列を連結して1列にし、同じくD列とE列も連結して1列にすることで、1条件に書き換えることができる。arrayformula({a2:a&b2:b,c2:c})=arrayformula(vlookup(d2:d&e2:e,arrayformula({a2:a&b2:b,c2:c}),2,false))しかしかなり遅いようだ。†これもやり方は色々あるが,私が使うのはimportrangeとquery関数。これに対しimportrangeとfilter関数でも同じことができ、この方がとっつきやすいが、filter関数を使って別ファイルから取り込むには何回もimportrangeを書く必要があり、記述がごちゃごちゃする。(後日、変更があったとき、直すのに手間が増える。)なお、「ファイル」は正確には「spreadsheet」。spreadsheetの中の個別のシートが「worksheet」または「sheet」。Col12>=5")記法の違い:importrangeは読み込み範囲を飛び飛びで指定できないので,一旦広く取り込む。取り込んだ列に順にCol1,...の番地が付く。where以下に行の条件を書く。親ファイルで作業シートを作り,それを別ファイルでimportしても同じことはできる。それならfilterだけで抽出できるので,query関数を新たに覚える必要がない。200万セル制限があるので,作業シートを作る(特に親ファイルで)のはなるべく避けたい。†シートの最終行を知りたいとき、対象列がIMPORTRANGEで読み込んだ列の場合、getLastRow()はworkしないようだ。自力で地道に中身を検査する必要がある。現在のcells[i]は空行を指しているので、cells[i-1]が最終行になり、最終行の行番号はi。//Perlのlastはbreak。continueはnext。「109.69」と「=(P707+Q707)/2」など、ベタに値を入れたセルと、計算式で値を作ったセルとが混在していると、queryで取り込んだとき、値が空になることがある。query関数は、列の型が数値か文字列かを自動判定しており、その際、どちらが多いかで判定するそうだ。列が数値と判定されると、文字列はblankに変換される。GoogleスプレッドシートのQuery関数で結果が空になる謎仕様と回避策。間にfilterがあっても、違いは引き継がれる模様。†ARRAYFORMULAとcountifは組合せ可能。countifは(ARRAYFORMULAと組む際)「(検索範囲,条件範囲)」の順。†x2TSV段落区切りデータや,スペース文字で桁揃えして表のように整形されたデータを,TSVに変換する。その他,行と列の入替え,PukiWiki表への変換などもできる。例1入力(データを作る際は段落区切りの方が楽である。TSVへの加工は機械にやらせればよい。ゼネラル石油コード<4523.T><4528.OS><5012.T>出力2(行列入替え)銘柄コードエーザイ<4523.T>小野薬品工業<4528.OS>東燃ゼネラル石油<5012.T>例2(スペース文字で桁揃えして表のように整形されたデータ)入力(人間には意味が取れるが,エクセルには入力できない。5出力(TSV)1)エーザイ<4523.T>5.11%884,659172)小野薬品工業<4528.OS>5.03%434,449113)東燃ゼネラル石油<5012.T>4.88%448,7555コラム数を指定して変換することもできるし,自動認識もできる。場合場合だが,自動の方がうまく行くことが多いようだ(アルゴリズムが違う。