Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
88
Help us understand the problem. What is going on with this article?
@abe-perorist

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

More than 5 years have 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

88
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
abe-perorist
My PS4 was lost while moving to new house. Where is my bro??
tech-is
テクノロジーと生きる時代を、プログラミングで。最先端のプログラミングが学べるテックアイエス。「簡単に身に付く力は、簡単に追い抜かれる力」テックアイエスで、一生モノのプログラミングを。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
88
Help us understand the problem. What is going on with this article?