このチュートリアルで完成するもの

Google Apps Scriptで、毎日特定のアカウントのフォロワー数を自動取得して、Google Spreadsheetに反映します。

このチュートリアルでできるようになること

このチュートリアルでは、以下のことができるようになります。

  • Google Apps Scriptと、Google Spreadsheetを連携して、ツイッターのフォロワー数を毎日24時に自動取得して列に加えることができる

Google Apps Scriptとは、Googleが提供しているプログラミング言語、および開発環境です。通称GASと呼ばれています。ExcelでいうVBAに近いです。
大きく違う点は、Google Apps ScriptはほぼJavaScriptで書かれている点で、JavaScriptと本当にささいな表現の違いだけを押さえておけば、簡単にコードを書くことができます。
また、Google Apps ScriptはほかのGoogleサービスと連携することができます。例えば、

  • Google DocsのテキストをGoogle Spreadsheet用に自動変換
  • Google Formで送信されたメッセージが来たら自動でSlackに飛ばす

みたいな処理をGoogle Apps Scriptを利用することで実装することができるようになります。

受講における必須学習項目

Google Apps Scriptは、ほとんどJavaScriptと同じなので、JavaScriptの基礎レベルが理解できていれば問題ありません。
もしこのチュートリアルを試してみて、難しければ、ProgateのJavaScript基礎の無料部分を完了してから進めてみてください。

準備編

それでは、さっそく準備していきましょう。まずはGoogleアカウントを用意しておきます。もしない場合は、新しく作ってください。

すでに存在している場合は、スキップしてかまいません。

Google SpreadsheetとGoogle Apps Scriptを準備する

次に、Google Apps Scriptを準備しましょう。Google Driveの画面から、Google Spreadsheetを準備する容量でアプリを作成することができます。準備方法はこちらに詳しくまとまっておりますので、みてみてください。以下のページのように、最初にGoogle Spreadsheetを開き、次にGoogle Apps Scriptを開きます。

  • Googleドライブからスプレッドシートを作成する
  • スプレッドシートからスクリプトエディタを開く

詳しくは、こちらの記事を参考にしてみてください。
【初心者向けGAS】本当の最初の一歩!スクリプトエディタでプロジェクトを開く

実装編

関数の定義

実行する関数の定義を行います。

function getFollowers() {
}

紐づいているスプレッドシートを取得

次に、SpreadSheetAppクラスから、現在紐づいているスプレッドシートを取得できる、getActive()メソッドを実行します。こうすることで、spreadSheetで、スプレッドシートを取得することができます。
各クラスとメソッドについては、下記記事が詳しいです。

それでは、書いていきましょう。

function getFollowers() {
 var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
}

スプレッドシートから、すべてのシートを取得する

今度は、スプレッドシート一つを取得することができました。今度は、スプレッドシートの中のシートをすべて取り出して、変数に代入してあげます。
そのさい、getSheetsメソッドを利用すると、リスト形式でシートを取得することができます。

それでは、実装していきましょう。

function getFollowers() {
 var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
 var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
}

これですべてのシートを取得することができました。

for文ですべてのシートを一つ一つ取り出す

さて、最後にfor文ですべてのシートを一つ一つ取り出します。以下のようなコードで、sheetsの個数から、indexを取り出す。これは簡単に言うと、例えばsheetsの中に5つの要素がある場合、0,1,2,3,4がindexとして順に取得することができます。それぞれのシートにsheets[1], sheets[2], sheets[3]のようにアクセスすると、それぞれのシートを取得することができるのです。参考URLを乗っけておきます。

それでは、実装してみます。

function getFollowers() {
 var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
 var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
 for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
 }
}

シート名を取得する

シート名を一つ一つ取得します。シート名をシートから取得できるのが、getName関数です。これを利用します。

では、実装してみます。

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(); //シート名を取得します
 }
}

フォロワーを取得できるURLを設定する

今度は、フォロワーの値をダウンロードできるURLを指定します。JSONという形式で取得できます。

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にアクセスします
 }
}

フォロワーのデータを外部サイトから取得する

指定したURLから、データを取得します。UrlFetchAppクラスのfetchを利用すると、外部サイトからデータを取得することができます。詳しくはこちらの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にアクセスします
   var json = UrlFetchApp.fetch(followUrl); //フォロワーを取得可能なURLからデータを取得します。
 }
}

JSONをオブジェクトに変換

JSON形式で取得したデータを、パースしてオブジェクトとして利用できるようにします。※ここの解説はちょっと難しいので、この参考リンクから何をしているのかを学ぶのがよいと思います。

実装します

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]); //スプレッドシートの列に、今日の日付とフォロワー数を追加します
 }
}

スプレッドシートの列の追加

最後に、取得したデータをスプレッドシートに追加します。appendRowメソッドを利用します。使い方についてはこちらのサイトがわかりやすいです。

では実装してみます。

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]); //スプレッドシートの列に、今日の日付とフォロワー数を追加します
 }
}

エラー処理

さて、上記のコードでも一応動くのですが、こういう場合はエラーが起こってしまいます。

  • getNameメソッドで取得したシート名が、不適切なツイッターID(スクリーンネーム)の場合、エラーが起こって処理が止まる
  • 仮に5つシート名があったとして、最初の1個が止まると、ほかの4個も止まる

こういう問題を避けたいので、エラーが起きたときの処理を考えます。そこでtry catchを利用します。参考URLをこちらに載せておきます。

また、エラーが起こった時には、そのエラー内容を取得したいので、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);
    }
 }
}

これで完成です。
一応、最終的なコードをすべて載せておきます。

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

動作を確認

では、最後に動作を確認してみましょう!このの実行ボタンをクリックすると、コードが実行されます。関数単位で実行されます。

初回の場合は認証が必要になりますので、こちらの動画を参考にしつつ進めてみてください。うまくいくと、スプレッドシート上に現在のフォロワー数を取得することができるようになります。

トリガーの設定

次に、実行するタイミングを決めるトリガーを指定します。こちらも下記動画を参考に進めてみてください。

最後に

どうでしたでしょうか、うまく作れましたでしょうか?Google Apps ScriptとGoogle Spreadsheetを利用すると、このように簡単にデータの自動集計等が簡単になります。
特にマーケティング職ですと、

  • 広告効果の日時集計
  • ツイッター上の口コミの自動集計

等を行うことがあるので、こういう処理をエンジニアではなくビジネスサイドの人が書けるのは非常に強い点だと思います。


もしこの #DAINOTE をやって、自動化できた場合は、ツイッター上で以下のように感想を教えてもらえると嬉しいです。

①感想
②ハッシュタグ #DAINOTE
③勉強した #DAINOTE のURL