無題(2015/03/09)
公開すんのわすれてたw
ニコニコ動画の方書けてないです。いつか必ず。
1ヶ月待ってみたけどデータ取得元がもう死にかけでこっちも死にそう
とりあえず諦めたから!ボク怒ッテナイヨ!
余計なことは言わないほうがいいな、って思った。
簡単だけど難しいですよね。
明日も真面目にがんばるぞ。
Google Apps Scriptでtwproの検索APIからデータを取得する
どんなものか
図1
これを入力しておき、実行すると
図2
こうなるものを作ります。
これです。
function getTwpro() { var sheet = SpreadsheetApp.getActiveSheet(); //選択されたシートを得る for(var i=1; i<=sheet.getLastRow(); i++) { //入力した数だけ繰り返す var name = sheet.getRange(i, 1).getValue(); //入力しておいた名前を取得 var responseURL = "http://api.twpro.jp/1/search?q=" + name + "&num=1"; //取得先のurlを設定 var response = UrlFetchApp.fetch(responseURL); //データを取得 var json = JSON.parse(response.getContentText()); //JSONをパース var result = json.total; //パースしたもののうち、total要素をresultとする sheet.getRange(i,2).setValue(result); //名前の横のセルにresultを入力する Utilities.sleep(10000); //待機時間 } }
参考サイト等
Google Apps Scriptって何だ?という場合
ASCII.jp:Google Apps Scriptのキホンと使い方 (1/4)|Web制作をちょっと便利にするGoogle Apps Script入門
ASCII.jp:Google Apps Scriptのキホンと使い方 (2/4)|Web制作をちょっと便利にするGoogle Apps Script入門
とりあえず2ページ目まででおk。
時間があるならドットインストールへ
Google Apps Script入門 (全16回) - プログラミングならドットインストール
選択されたシートを得る
var sheet = SpreadsheetApp.getActiveSheet();
スプレッドシート利用の基本(1/5):初心者のためのGoogle Apps Scriptプログラミング入門
現在開いているスプレッドシートのアクティブなシートを「sheet」と定義します。
入力した数だけ繰り返す
for(var i=1; i<=sheet.getLastRow(); i++) {
まずはfor文について
for文-JavaScript入門
for(var i=1; i<=sheet.10; i++) {
とすれば10回繰り返すことになります。
つぎはsheet.getLastRow()について
[GAS][スプレッドシート]シートの最終行を取得するには : 逆引きGoogle Apps Script
sheet.getLastRow()とすると、最終行が数字で返ってきます。
図1においては返り値は5となります。これを利用して、データ取得を5回繰り返す、という仕組みになります。
入力しておいた名前を取得
var name = sheet.getRange(i, 1).getValue();
iはループの回数によって変わっていく。1回目のループの時は1が、2回目のループの時は2が代入される。
sheet.getRange(1, 1)と書くと、「sheetの座標(1,1) = A1 = 1行1列を指定すること」という意味になる。
このあとに.getValue()を続けることで、そのセルの値を取得する事ができる。
取得したもの = 入力していたものはnameと定義される。
取得先のurlを設定
ツイプロ (twpro) について
http://api.twpro.jp/1/search?q=データを取得したいキーワード&num=1
にアクセスすればデータを得ることが出来る。
文字列演算子「+」「+=」 - JavaScript(ジャバスクリプト)リファレンス
文字列は+でくっつけることができる。
var responseURL = "http://api.twpro.jp/1/search?q=" + name + "&num=1";
"http://api.twpro.jp/1/search?q=" と name と "&num=1"をくっつける。nameは「入力しておいた名前を取得」で定義したものが代入される。キーワードが日本語になっていても変換されるので問題はない。
これをresponseURLとする。
データを取得
var response = UrlFetchApp.fetch(responseURL);
UrlFetchとXmlデータの利用(1/6):Google Apps Scriptプログラミング [中級編]
responseURLにアクセスし、データを得る。返り値はresponseと定義する。
JSONをパース・・・の前に
JSONって何?の場合はJavaScriptプログラミング講座【JSON について】。
読んでもわからんから触って覚えるべし。
例えば、
function getJSON() { var responseURL = "http://api.twpro.jp/1/search?q=三澤紗千香&num=1"; //取得先のurlを設定 var response = UrlFetchApp.fetch(responseURL); //データを取得 var json = JSON.parse(response.getContentText()); //JSONをパース Logger.log(定義していないもの); }
と書いてデバッグ(虫マークのボタンをクリック)すると、
となる。
ここで欲しいのは599という数字で、これにはtotalという名前が付いている。
JSONってそういう仕組みらしいです。
JSONをパース
var result = JSON.parse(response.getContentText());
まずはresponseをgetContentText()する。これはUrlFetchとXmlデータの利用(1/6):Google Apps Scriptプログラミング [中級編]を見てください。
これでJSONが得られました。
JSON.parse - JavaScript リダイレクト 1 | MDN
パースする、っていうのはさっきデバッグした時みたいにJSONを読み込むということ。
この結果をjsonと定義する。
パースしたもののうち、total要素をresultとする
var result = json.total;
jsonの1階層下にtotalがあるのでこういう書き方になる。更に階層を潜るなら付け加えていくことになる。
これをresultと定義する。
名前の横のセルにresultを入力する
sheet.getRange(i,2).setValue(result);
名前は(i,1)に入力されているので、(i,2)にするとその右隣になる。
[GAS][スプレッドシート]シートに値をセットするには : 逆引きGoogle Apps Script
選択したセルに.setValue()とする(カッコの中を)そのセルに入力できる。
resultを書き込みたいので.setValue(result)とする。
待機時間
Utilities.sleep(10000);
5秒間に1回以上アクセスしないようにする。
その他
5分以上かかる処理はエラーが出ますので、1回の処理で動かせるデータ数の上限はあると思います。
できたー。
やっとここまで
来ることができました。
成果物↓
大久保瑠美 - Lisiograph
洲崎綾 - Lisiograph
松井恵理子 - Lisiograph
藤田咲 - Lisiograph
金元寿子 - Lisiograph
赤﨑千夏 - Lisiograph
三上枝織 - Lisiograph
高森奈津美 - Lisiograph
浅倉杏美 - Lisiograph
内田真礼 - Lisiograph
内田彩 - Lisiograph
大坪由佳 - Lisiograph
まとめよう
作業ログがクッソ汚いので、きちんと言語化しておこうと思う。
・Google Apps Scriptでtwproのデータを取得して一覧する
・Google Apps Scriptでニコニコ動画 『スナップショット検索API』のデータを取得して一覧する
とりあえずこの2つ、早いうちに。
感想
記録を見ると作業開始は12月23日でした。本気でやれば2週間ぐらいで終わるだろうと思ってました無理でした。
積み残しの課題もあるので、片付けていきます。
Google Apps Scriptを触ってみるの巻 - その2
読んでもらうために書いたものではないので、読みにくいと思います。
続きを読む