Twitterのフォロワー数を取得してGoogleSpreadsheetへ記入してみよう
このレッスンのゴール
このレッスンでは、Google Apps Scriptで毎日特定のアカウントのフォロワー数を自動取得して、取得した内容をSlackに通知するプログラムを作成するために、まずはTwitterのフォロワー数を取得し、スプレッドシートにデータを記入するまでの流れを、Google Apps Scriptで作成していきます。
このレッスンの流れ
それではこのレッスンの流れを少し詳しく見ていきましょう。このレッスンは次のような流れでプログラムを実装していきます。
- Google Spreadsheetと接続する
- Google Spreadsheetのシートをすべて取得する
- シート名から、TwitterのIDを呼び出し、フォロワー数を取得する
- Google Spreadsheetに値を書き込む
プログラムの全体像を確認しよう
次に、このレッスンで作成するプログラムの全体像を確認します。
function getFollowers() {
// 1. Google Spreadsheetと接続する
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
// 2. Google Spreadsheetのタブをすべて取得する
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
try {
// 3. タブ名からTwitterのIDを呼び出しフォロワー数を取得する
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
var object = JSON.parse(json.getContentText()); //JSONをパースして、データを操作できるようにします。
// 4. Google Spreadsheetに値を書き込む
sheet.appendRow([new Date(), object[0].followers_count]); //スプレッドシートの列に、今日の日付とフォロワー数を追加します
} catch (e){
Logger.log(e);
}
}
}
Step1. Google Spreadsheetと接続する
それでは早速プログラムを書いていきましょう。
まず前回のレッスンで用意したスプレッドシートとGoogle Apps Scriptエディタを開きましょう。準備ができていない人は、まずは「このチュートリアルの成果物と事前準備」から学習を始めましょう。
getFollowers関数の定義
Google Apps Scriptエディタでは、最初に次のようなコードが表示されています。
function myFunction() {
}
今回は別の関数を使いたいので、こちらを削除して、次のコードで関数getFollowers()
を定義します。
function getFollowers() {
}
紐づいているスプレッドシートを取得
次にGoogle Apps Scriptで紐付いているスプレッドシートを取得します。
SpreadsheetAppクラスのgetActive()メソッドで紐付いているシートを取得できます。
スプレッドシートのシートを取得する際の、各クラスとメソッドについては次の記事に詳しく書いてあるので参考にしてください。
GASでSpreadsheetを操作する自分的ベストプラクティス - Qiita
それでは書いていきましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
}
コードが書けたら、保存をしてから実行してみましょう。
実行すると、「承認が必要です」というポップアップが出てきます。次のステップで承認をしましょう。
ここまで完了したら、エディタ画面に戻りましょう。
実行ログに「実行完了」と出ていればOKです。
これで紐付いているスプレッドシートを取得することができました。
Step2. Google Spreadsheetのシートをすべて取得する
次のステップでは、スプレッドシートの中のシートを取り出して変数に代入します。
今回のプログラムではシートは1つだけですが、複数のアカウントのフォロワー情報を取得したい場合などを想定して、複数シートでも運用できるようなプログラムを実装していきます。
スプレッドシートのシートを取得するには、getSheets()
メソッドを利用します。
今回は全てのシートを取得する方法を見ますが、もちろんシート名を指定して取得することも可能です。詳しくは次の記事を見てください。
Google Apps Script で Spreadsheet にアクセスする方法まとめ - Qiita
それでは、実装していきましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
}
これですべてのシートを取得できました。
シートを1つずつ取り出す
さてこれで全てのシートが変数sheetsに代入されました。
実際にフォロワー数を取得するときには、このシートを1枚ずつ使いたいので、sheetsから一つずつシートを取り出します。
この処理には、繰り返し構文のfor文を利用して、以下のように書きます。まずはコードを見てみましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
}
}
for文の箇所を見てください。
sheetsの個数からindexを取り出しています。言い換えると、例えばsheetsに5つの要素(今回はシート)がある場合、0から始まって、1、2、3、4がindexとして順に取り出されます。
このindexを使って、sheets[index]
とすると、sheets[0]=1枚目のシート、sheets[1]=2枚目のシートにアクセスできます。上のプログラムでは、取得したシートを変数sheetに代入しています。
シート名を取得する
それではこのレッスンの最後に、シート名を取得してみましょう。事前準備でシートの名前は、今回フォロワー数を取得したいTwitterアカウントの名前になっていると思います。
シート名の取得には、getName()
関数を用います。詳しくはこちらの記事が参考になります。
Google apps scriptでスプレッドシートのドキュメントの名前を取得する | GASでスプレッドシートを操作する
では実装してみましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
}
}
前のステップで、indexを使って取得したシートを変数sheetに代入しました。
今回はこのsheetにgetName()関数を使って、シート名を取得し、変数screenNameに代入をしています。
さて、ここまできたら一度うまくいっているか確認してみましょう。
今回はscreenNameがうまく取得できていればOKなので、console.log()を用いて確認してみます。
下のコードを実装して、[実行]してみましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
console.log(screenName); //実行ログにscreenNameを表示します
}
}
うまくいっていると、画面下の実行ログにシート名(例えば、manajob_jpなど)が出力されます。
出力されない場合は、その前でうまくいっていない場合があるので、前に戻って確認してみましょう。
今回追記したconsole.log(screenName)はこのステップの確認用なので、削除して、次に進みましょう。
Step3. シート名から、TwitterのIDを呼び出し、フォロワー数を取得する
さていよいよTwitterのフォロワー数を取得していきます。
取得する方法はいくつかあるのですが、今回は簡単に次のURLで取得する方法をみていきます。最後の「ここにアカウントID」と書いてあるところに、TwitterのアカウントIDを入力すると、フォロワー数などの情報が取得できます。
https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=ここにアカウントID
実際にTwitter公式アカウントで試してみましょう。
https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=twitter
アクセスすると、JSONファイルがダウンロードされます。
開いてみると以下のような内容が表示されます。
※フォロワー数などは取得時点のデータなので異なります
[
{
"following":false,
"id":"783214",
"screen_name":"Twitter",
"name":"Twitter",
"protected":false,
"followers_count":58649064,
"formatted_followers_count":"58.6M followers",
"age_gated":false
}
]
フォロワー数以外にも、いろいろなデータが出ているのですが、今回はこの中の"followers_count":58649064,を利用します。
それでは実際のコードにこのURLを実装しましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
}
}
先ほど取得したscreenNameを、URLの後ろに足して、変数followUrlに代入しました。
このURLを使ってフォロワー数を取得します。
フォロワーのデータを外部サイトから取得する
Google Apps Scriptでは、UrlFetchAppクラスのfetch(()関数を利用すると、外部サイトからデータを取得することができます。詳しくはこちらの記事も確認してください。
Google Apps Script でできることを5つのメソッドと関数から考えた
今回はこの関数を使って、フォロワー数を取得します。それでは実装しましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
}
}
ここまで書けたら、一度実行してみましょう。
すると最初に実行したときのように、承認を求められるので、以前と同様の手順で承認をしてください。
JSONをオブジェクトに変換する
次にJSON形式で取得したデータを、パースしてオブジェクトとして利用できるようにします。
この処理は少しむずかしいので、参考リンクから内容を確認してみてください。
【JavaScript入門】JSONの作成とparse() / stringify()の使い方! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
それでは実装してみましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
var object = JSON.parse(json.getContentText()); //JSONをパースして、データを操作できるようにします。
}
}
これでTwitterのフォロワー数などの情報を、変数objectに格納できました。
このステップの最後に、前回と同様に最後にconsole.log(object)を使って内容を出力してみましょう。
取得したいアカウントの情報が表示されていれば成功です。
Step4. Google Spreadsheetに値を書き込む
ここまできたら後は少しです。GoogleSpreadsheetに取得した値を書き込みましょう。
今回は行を追加して値を書き込むので、appendRow()メソッドを利用します。使い方についてはこちらのサイトがわかりやすいです。
Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
それでは実装してみましょう。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
var object = JSON.parse(json.getContentText()); //JSONをパースして、データを操作できるようにします。
sheet.appendRow([new Date(), object[0].followers_count]); //スプレッドシートの列に、今日の日付とフォロワー数を追加します
}
}
この処理では、取得したsheetのappendRow()関数を使って行を追加しています。追加する内容は2つです。
new Date()はその時点の日付、object[0].followers_countはobjectの中の1つ目の要素のfollowers_countを取得する、という意味です。今回はobjectの中には1つの要素しか入っていないので、0を指定します。またフォロワー数以外の値を取得したい場合は、object[0].以下を他のものに変えれば取得できます。
それではここまで実装したら、実行してみましょう。
以下のように値が追加されていたら成功です。1行目に値を入れていた場合は、2行目以降に値が追加されます。
エラー処理を追加する
さて、これで今回のプログラムの実装は完了なのですが、こういう場合にエラーが起きてしまう可能性があります。
- getNameメソッドで取得したシート名が、不適切なツイッターID(スクリーンネーム)の場合、エラーが起こって処理が止まる
- 仮に5つシート名があったとして、最初の1個が止まると、ほかの4個も止まる
業務効率を狙ってプログラムを書いたのに、1つうまくいかないと全部が止まってしまう、というのはできれば避けたいところです。問題を避けたいので、エラーが起きたときの処理を考えます。
そこでtry catchを利用してエラーの処理を行います。参考URLをこちらに載せておきます。
【JavaScript入門】try…catchの使い方と例外処理のまとめ! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
また、エラーが起こった時には、そのエラー内容を取得したいので、catchの中にeというエラーの値を出力するようにします。
それでは、実装します。
function getFollowers() {
var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
var sheet = sheets[index] //シートを取得します
try {
var screenName = sheet.getName(); //シート名を取得します
var followUrl = "https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=" + screenName; //フォロワーが取得できるURLにアクセスします
var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
var object = JSON.parse(json.getContentText()); //JSONをパースして、データを操作できるようにします。
sheet.appendRow([new Date(), object[0].followers_count]); //スプレッドシートの列に、今日の日付とフォロワー数を追加します
} catch (e){
Logger.log(e);
}
}
}
どこかのシートでエラーが起きても次に進めるように、シート名を取得する以降の流れをtry catch文で囲っています。これでtryの中でエラーが起きたときには、catchの処理が行われて、そのまま次のループが始まるようになります。
またcatchの中では、Logger.log(e)という処理が書いてあります。このコードを書いておくと、エラーが起きたときにログを出力してくれます。
これでプログラムは完成です!
最後にもう一度、問題なく動作するか、実行して確認してみましょう。
スプレッドシートに値が追加されていればOKです。
毎日同じ時刻に設定するためのトリガーを設定する
と、ここで完了にしたいところですが、最後にもう一つ大事な設定が残っています。
今のままでは、毎日取得したいときにプログラムの実行を手動で行わないとフォロワー数が取得できず、これでは手動でスプレッドシートに値を入力するとの大きく変わりません。
Google Apps Scriptでは、以下の手順でトリガーを設定し、プログラムを指定した期間で定期実行することができます。
これで完成です!お疲れ様でした!
これで毎日同じ時間にTwitterのフォロワー数がスプレッドシートに追記されていきます。
次のレッスンでは、今回作ったプログラムから取得したデータをSlackへ通知するプログラムを作成しましょう。
このチュートリアルはこれで終了です。