スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた

  • 65
    Like
  • 9
    Comment
More than 1 year has passed since last update.

運営中のPlayer!のKPI管理として、SlackへのKPI自動投稿を行うようにしました!

Slackへの自動投稿

DAUの前日比がプラスなら:thumbsup:、前日比がマイナスなら:thumbsdown:というふうにメッセージを出しわけてます。

スクリーンショット 2015-06-26 21.07.52.png

この記事の構成

僕が書いたコードを全て記載した上で、2部構成に分けて説明します。

1.Google Apps ScriptでSlackのチャネルに投稿するのに必要な作業

2.スプレッドシートから値を取得し、投稿メッセージを作成するのに必要な作業

まずは、コードを全てお見せする

コード.gs
// 共通部分
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '①', // Slackのtoken
  channelId: "②", // SlakckのチャネルのID
  userName: "お好きな名前で!!", // botの名前
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      text: text
    }
  });
}

// 数値元によって変更する箇所
function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[];

 var dauvalues = sheet.getSheetValues()*100;
 var daybeforevalues = sheet.getSheetValues()*100;

 var dau = dauvalues.toFixed()
 var daybefore = daybeforevalues.toFixed()

 if (  daybefore > 0 ){
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsup: ՞ਊ ՞):thumbsup:");  
 }else{
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsdown: ՞ਊ ՞):thumbsdown:");  
 }
}

細かく確認していきます!

1.Google Apps ScriptでSlackのチャネルに投稿するのに必要な作業

Slackへの投稿に必要な用意:

まず、Google Apps Scriptのエディターを開いたら、このライブラリをダウンロードしてください!
非常に便利ですので、このSlackkAppを作ってくださった方は、僕にとって神様です。

  • Google Apps ScriptのライブラリSlackApp(Library Key:M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO)

参考:Slack BotをGASでいい感じで書くためのライブラリを作った

さて、ダウンロードがすんだところで、共通部分のポイントをお伝えします!

コード.gs
// 共通部分
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '①', // Slackのtoken
  channelId: "②", // SlakckのチャネルのID
  userName: "お好きな名前で!!", // botの名前
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      text: text
    }
  });
}

ポイントは2つです!!

まず、1つ目は、こちら

token: '①', // Slackのtoken

Slackのtokenは、Slack Web APIのAuthenticationでTeam,Userを確認して、ボタンを押すと発行されます。
僕のtokenはxoxp-○○○○○○○○○-○○○○○-○○○こんな感じでした!
このxoxp-○○○○○○○○○-○○○○○-○○○をコピペすればオッケーです。

次に、2つ目は、こちら

channelId: "②", // SlakckのチャネルのID

SlackのチャネルIDの取得方法は、
まずchannels.listの上部にあるTesterをクリックし、tokenを確認して、Test Methodを押します。
次に、Test Methodの下部にばぁ〜とでてきた文章の中から、自分が投稿したいチャネルの名前(name)を見つけ、その1つ上にあるidをコピーすればオッケーです!
僕が投稿したチャネルIDは英数字を含む文字列でした。
※注意点としては、チャネル名(#generalなど)ではないということです!

これで、共通部分の説明は完了しました!

2.スプレッドシートから値(DAUと前日比)を取得し、投稿メッセージを作成するのに必要な作業

次に、数値元によって適宜変更していただく必要がある箇所です。
※今回の注意点としては、スクリプトエディターは、KPI管理を行っているスプレッドシートから開いています。

数字管理の状況説明

Player!のDAUと前日比は、Googleスプレッドシートの1つのシートの、ある特定のセルに%表示されています。

dailyスプレッドシートのDAUシートの、3行目の2列目がDAU、3行目の3列目が前日比という感じです。
イメージ図

day DAU 前日比
2015/6/26 ○○.○○% +○○.○○%

そこで、(2.1)特定のスプレッドシートの特定のセルから値を取得して、(2.2)その値を使って投稿メッセージを作成をします。

2.1 特定のスプレッドシートの特定のセルから値を取得

function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[③];

この部分で、スクリプトエディターを開いたスプレッドシートを指定して、DAUを管理しているシートを指定しています。

そして、DAUを管理しているスプレッドシートが一番左から何番目にあるかを数えます。
1番左なら、ss.getSheets()[0];
左から4番目なら、ss.getSheets()[3];
と対象の数字をに記入すれば、引っ張りたいシートを指定できます。

 var dauvalues = sheet.getSheetValues(④)*100;
 var daybeforevalues = sheet.getSheetValues(④)*100;

特定のセルを指定して、その値(DAUと前日比)を取得をした後、ちょっとこざいくしてます。
Player!の場合、DAUは特定のセルに表示されますので、
getSheetValues(3,2,1,1)といったように指定してます。
④の箇所の書き方は、このドキュメントを参考にしてください:https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetValues(Integer,Integer,Integer,Integer)

また、なぜ*100があるかというと、sheet.getSheetValues(④)の取得したDAU及び前日比の値が0.○○○○○○○○○○○○○○となっており、Slackへの投稿メッセージを○○.○○%とするのに必要という理由です。

 var dau = dauvalues.toFixed(⑤)
 var daybefore = daybeforevalues.toFixed(⑤)

先ほど取得し、こざいくをした値は○○.○○○○○○○○○○○○○○となっているので、小数桁を制限するためにtoFixed(⑤)をしています。
小数2桁:toFixed(2)
小数5桁:toFixed(5)
となりますので、目的の小数桁をに記載してください。

これらの作業により、DAUと前日比の取得、加工が完了しました。

2.2 取得した値を使って投稿メッセージを作成

 if (  daybefore > 0 ){
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsup: ՞ਊ ՞):thumbsup:");  
 }else{
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsdown: ՞ਊ ՞):thumbsdown:");  
 }
}

ここでは、前日比がプラスの場合、マイナスの場合とでメッセージの出し訳を行なっております。

自動投稿のための時間設定

Player!の場合、これを毎日10時に自動投稿しています。
この時間の設定は、スクリプトエディターのリリーストリガーで管理しています!

こうして無事、自動投稿が完成です!
スクリーンショット 2015-06-26 21.07.52.png