無題(2015/03/09)

公開すんのわすれてたw

ニコニコ動画の方書けてないです。いつか必ず。

1ヶ月待ってみたけどデータ取得元がもう死にかけでこっちも死にそう

とりあえず諦めたから!ボク怒ッテナイヨ!

余計なことは言わないほうがいいな、って思った。

簡単だけど難しいですよね。

明日も真面目にがんばるぞ。

Google Apps Scriptでtwproの検索APIからデータを取得する

どんなものか

図1
f:id:lisiograph:20150214210739p:plain
これを入力しておき、実行すると

図2
f:id:lisiograph:20150214210746p:plain
こうなるものを作ります。

これです。

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);
    //待機時間
  }
}

参考サイト等

選択されたシートを得る

  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();

セルの選択&値の取得: Googleスプレッドシート メモ

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=f:id:lisiograph:20150214211527p:plain" と 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(定義していないもの);
}

f:id:lisiograph:20150214212052p:plain
と書いてデバッグ(虫マークのボタンをクリック)すると、

f:id:lisiograph:20150214212106p:plain
となる。
ここで欲しいのは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回の処理で動かせるデータ数の上限はあると思います。

できたー。

まとめよう

作業ログがクッソ汚いので、きちんと言語化しておこうと思う。

Google Apps Scriptでtwproのデータを取得して一覧する
Google Apps Scriptでニコニコ動画 『スナップショット検索API』のデータを取得して一覧する

とりあえずこの2つ、早いうちに。

感想

記録を見ると作業開始は12月23日でした。本気でやれば2週間ぐらいで終わるだろうと思ってました無理でした。

積み残しの課題もあるので、片付けていきます。