Google SpreadsheetのデータをSlackに自動で通知する

所要時間:60分

このレッスンのゴール

このレッスンでは、Google Apps Scriptで毎日特定のアカウントのフォロワー数を自動取得して、取得した内容をSlackに通知するプログラムを作成するために、スプレッドシートのデータをSlackに通知する流れを、Google Apps Scriptで作成していきます。

今回はTwitterのフォロワー数をSlackに通知するプログラムを作成しますが、普段Slackを利用されている方だと、今回のプログラムを応用すると仕事で利用できます。今回のプログラムを応用することで、毎日通知したい情報を自動通知させるプログラムが作成できます。

このレッスンの流れ

それではこのレッスンの流れを少し詳しく見ていきましょう。このレッスンは次の流れでプログラムを実装していきます。

  1. Slackに登録する
  2. Webhook URLを取得する
  3. botの設定をする
  4. スプレッドシートからデータを取得する
  5. 通知するメッセージを作成する
  6. Slackに送信する

プログラムの全体像を確認しよう

次に、このレッスンで作成するプログラムの全体像を確認します。

var WEBHOOK_URL = "https://hooks.slack.com/services/TDRFGQE69/BF066S536/ly2sdgfdsgsdgs"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
   var message = ""
   var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
   var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
   for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
      var sheet = sheets[index] //シートを取得します
      var screenName = sheet.getName(); //シート名を取得します
      var followers = sheet.getRange("B:B").getValues().filter(String)
      var follower = followers[followers.length-1]
      var followerAcquisition = follower - (followers[followers.length-2])
      message = message + "Username: " + screenName + "\n" +
      "Follower: " + follower + "\n" +
      "Acquisition: " + followerAcquisition + "\n\n"
      }
   }
   var jsonData =
   {
      "username" : USERNAME,
     "icon_emoji": ICON,
     "text" : message
   };
   var payload = JSON.stringify(jsonData);
   var options =
   {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : payload
   };
   UrlFetchApp.fetch(WEBHOOK_URL, options);
   }
}

Step1. Slackに登録する

まず、Slackに登録しましょう。以下のURLにアクセスしてください。
https://slack.com/intl/ja-jp/

下の画像のようなページが出てくるので、メールアドレスを入力してSlackを始めるをクリックします。

file

そうすると、以下のようなページに移動します。

file

ワークスペースを作成をクリックします。

file

メールで届いた認証コードを入力すると、以下のようにチーム名を入力することになるので、適当な値を入れます。

file

さらに進むと、プロジェクト名を作るようになるので、sampleと入力します。

file

最後に、メンバーを招待するか出てきます。今回はチームメンバーは特に追加する必要はないので、後でをクリックします。

file

そうすると、ワークスペースと、チャンネルが作成されます。

file

Slackでチャンネルを表示するをクリックすると、使えるようになります。

Slackのワークスペースの作成をクリックします。

file

これでワークスペース作成の完了です。さっそく実装に取り掛かりましょう。

Step2. Webhook URLを取得する

まず最初に、Webhook URLの取得を行います。Webhook URLとは、外部からSlackにデータを送った時に、そのデータを受け取るURLのことです。画面右上の歯車のマークから、アプリを追加するを選びます。

file

検索欄に、incomingと入力すると、Incoming Wehhookというアプリが出てくるので、これをクリックします。

file

設定を追加をクリックします。

file

チャンネルは、sampleを設定します。そして、Incoming Webhook インテグレーションの追加をクリックします。

file

そうすると、はれてWebhook URLを取得することができます。ここのURLを使うので、コピーしておきましょう。

file

スプレッドシートからGASを起動

Webhook URLを取得できたら、前回作成したスプレッドシートからGoogle Apps Scriptのエディタを開きます。
エディタが開けたら、さきほどSlackから取得したWebhook URLを、エディタの一番上に入れてみてください。
前回作成したプログラムgetFollowers()よりも上に入力しておきましょう。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"

これでStep2が完了です。

Step3. botの設定をする

次に、Slackに通知をしてくれるbotのユーザー名とユーザーアイコンを指定しまう。ユーザー名はなんでもいいので、tiwtter_botという名前にしておきましょう。iconは、:hatching_chick: にすると、以下のようなかわいい可愛いひよこの画像になりあます。

file

さっそく、GAS上で実装してみます。
記入する場所は、先ほどのWEBHOOK_URLの下の行にしましょう。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

 これでStep3が完了です。

Step4. スプレッドシートからデータを取得する

それではいよいよスプレッドシートからデータを取得します。
前回はgetFollowers関数を作りましたが、今回は新しくSlackに通知を行う際に実行するnotify関数を作ります。
関数の順番はどちらが上でも問題ありません。getFollowers関数の上か下にnotify関数を入力しましょう。
以下の例では、getFollowers関数は省略して記載します。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
//ここに通知処理を追加
}

 変数messageを追加する

次に、Slackに送るメッセージを空文字で定義します。空文字にするのは、後からメッセージをどんどん追加していくからです。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
   var message = ""
}

 

スプレッドシートを取得する

次にデータが入っているスプレッドシートを取得します。前回と同様に、getSheets関数で全てのシートを取得しています。こちらは前回のチュートリアルと同様です。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン
 
function notify(){
   var message = ""
   var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
   var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
}

 

シートを一つずつ取得する

こちらも前回のレッスンと同様に、シート一つ一つをfor文で取り出します。
indexなどの解説は前のレッスンでしていますので、よくわからない人は復習しておきましょう。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

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

シートからデータを取得する

今回Slackに通知したいのは、次の3つです。

  1. アカウント名
  2. フォロワー数
  3. フォロワー獲得数

この3つのデータを用意しておきましょう。少し複雑なので先にプログラムの説明をします。

var screenName = sheet.getName(); //シート名を取得します
var followers = sheet.getRange("B:B").getValues().filter(String)
var follower = followers[followers.length-1]
var followerAcquisition = follower - (followers[followers.length-2])

まずアカウント名はスプレッドシートのシート名を使います。screenNameにシートの名前をgetName()関数で取得して代入しています。

フォロワー数を取得するには、まずスプレッドシートに記入されたフォロワーの列の情報をgetRange()関数で範囲を指定して取得します。
getRange()で範囲を指定し、その範囲の値をgetValue()で取得しています。最後にfilter(String)を加えることで、値が入力されているところ箇所だけを対象に値を取得できます。

次にリストとしてフォロワー数が格納されているfollowersの、最後に追加されたデータを最新のフォロワー数として、変数followerに代入します。followersのリストの長さ-1をインデックスとして利用することで、リストの最後の値を取得できます。

最後にフォロワー数の変化を取得するため、最新のフォロワー数からその全日のフォロワー数を引いた値を、followerAcquisitionとして取得します。

これでアカウント名、フォロワー数、フォロワー獲得数の3つを取得できました。

実際のプログラムでは、このように実装します。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
   var message = ""
   var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
   var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
   for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
      var sheet = sheets[index] //シートを取得します
      var screenName = sheet.getName(); //シート名を取得します
      var followers = sheet.getRange("B:B").getValues().filter(String)
      var follower = followers[followers.length-1]
      var followerAcquisition = follower - (followers[followers.length-2])
   }
}

ここまで実装できたら、うまくいっているか確認してみましょう。
プログラムの最後の行に次のコードを追記して実行してみましょう。このとき、実行する関数をnotifyに変更するのを忘れないようにしましょう。

console.log(screenName, follower, followerAcquisition);

実行すると次のようになります。これでStep4が完了です。

Step5. 通知するメッセージを作成する

次に、Step4で用意した値を、事前に用意しておいた変数messageの中に代入していきます。

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
   var message = ""
   var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
   var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
   for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
      var sheet = sheets[index] //シートを取得します
      var screenName = sheet.getName(); //シート名を取得します
      var followers = sheet.getRange("B:B").getValues().filter(String)
      var follower = followers[followers.length-1]
      var followerAcquisition = follower - (followers[followers.length-2])
      message = message + "Username: " + screenName + "\n" +
      "Follower: " + follower + "\n" +
      "Acquisition: " + followerAcquisition + "\n\n"
      }
   }
}

 

Step6. Slackに送信する

それでは最後に、Slackに送信してみましょう。
Slackに送信するときには、次のプログラムを追記します。

var jsonData =
{
  "username" : USERNAME,
  "icon_emoji": ICON,
  "text" : message
};

var payload = JSON.stringify(jsonData);

var options =
{
  "method" : "post",
  "contentType" : "application/json",
  "payload" : payload
};

UrlFetchApp.fetch(WEBHOOK_URL, options);

まずjsonDataにユーザネーム、ユーザアイコン、送付するメッセージを指定します。
それぞれ最初に指定しておいたユーザネーム(今回はtwitter_bot)、ユーザアイコン(:hatching_chick:)が代入されます。メッセージは先ほど作成したものが指定されています。

次にJSON.stringlify()関数で、jsonDataで入力した値をJSON形式に整形します。このデータを使ってSlackにメッセージを送信します。

次にSlackに送付するのに必要な値をoptionsにまとめます。そして最後にUrlFetchApp.fetch()関数を利用して、最初に取得したWebhook URLとoptionsの値を引数にSlackに通知を送ります。

最後に全体のプログラムを確認してみましょう。 

var WEBHOOK_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXX"
var USERNAME = "twitter_bot"
var ICON = ':hatching_chick:'; // 通知時に表示されるアイコン

function notify(){
   var message = ""
   var spreadSheet = SpreadsheetApp.getActive(); //紐づいているスプレッドシートを取得します
   var sheets = spreadSheet.getSheets(); //スプレッドシートから、すべてのシートを取得します
   for (var index in sheets){ //取得したシートのリストから、indexを0からシート数分取得します
      var sheet = sheets[index] //シートを取得します
      var screenName = sheet.getName(); //シート名を取得します
      var followers = sheet.getRange("B:B").getValues().filter(String)
      var follower = followers[followers.length-1]
      var followerAcquisition = follower - (followers[followers.length-2])
      message = message + "Username: " + screenName + "\n" +
      "Follower: " + follower + "\n" +
      "Acquisition: " + followerAcquisition + "\n\n"
      }
   }
   var jsonData =
   {
      "username" : USERNAME,
     "icon_emoji": ICON,
     "text" : message
   };
   var payload = JSON.stringify(jsonData);
   var options =
   {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : payload
   };
   UrlFetchApp.fetch(WEBHOOK_URL, options);
   }
}

 

ここまでできたら関数を実行しましょう。Slackの指定したチャンネルにメッセージが飛んでいれば成功です。
今回作成したプログラムも、前回と同様にトリガーを設定しておくと、毎日同じ時間に自動でSlackにメッセージを送付することができます。うまく設定してみましょう。

お疲れ様でした!これでこのチュートリアルは完了です。

 

最後にこのチュートリアルでやったことを確認しましょう。

このチュートリアルの流れ

このチュートリアルは次のような流れで進めてきました。
今回はTwitterからデータを取得して、最後はSlackに送付をしました。この前後のアプリを変えれば、TwitterだったところをYouTubeに変えたり、SlackではなくGmailに送付したりと応用することができます。Manajobでは、他のアプリとの連携方法も学べますので、ぜひほかのチュートリアルにも挑戦してみましょう。

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

このチュートリアルでは、GoogleAppsScriptを活用して、次の3つのことを学びました。

  • GoogleAppsScriptと、GoogleSpreadsheetを連携してデータを書き込むことができる
  • GoogleAppsScriptで、Twitterのフォロワー数を毎日24時に自動取得することができる
  • GoogleAppsScriptで、GoogleSpreadsheetからデータを取得してSlackに毎日24時にメッセージを送れる

この3つの技術をうまく組み合わせれば他にもいろいろなことができるようになります。自分の業務を効率化するために、いろいろな事例を調べながら自分の業務に使えそうなものを探してみましょう。

 

ノートをとる

メモが保存されました
メモ一覧を見る