spreadsheetで管理する日次KPIをSlackに自動投稿する

  • 55
    いいね
  • 2
    コメント

背景

  • チーム全員が毎日KPIを確認し、各人が自律的にアクションをしていける組織環境を構築したい
  • Slackの特定のグループに毎日自動通知する機能をGoogleAppsScriptにて実装し、上記環境を構築する。

前提

  • SlackAppライブラリを使用する(参考1)。
  • 基本仕様(参考2)をよりSlackAppライブラリを活用する形へ変更、かつ日次で値を取得するセルを動的に変更する仕様とした。
  • 上記2つを作成された方々へ最大限のリスペクトを送ります。

今回のOutput

  • 毎日更新するKPI(業績重要指標)管理シートがある。毎日1列ずつ各KPI項目を更新している。

image

  • ここから特定のKPI(例えば7行目「オーダー件数」と15行目「オーダー単価」、など)の値を日々動的に取得し、

  • Slackに毎日自動通知するという機能を実装する

image

GASコード

  • 全コード
  • 各パート説明

に分けて説明する。なお参考2記載の内容は割愛する。

全コード

GoogleAppsScript

// 定義文
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '(A)', // Slackのtoken
  groupId: "(B)", // Slack MarketingグループのID
  userName: "(C)", // botの名前
}



// 前日のKPIを取得し、SlackのMarketingグループへ送る
function getTodayColumnPostSlack() {
  // 前日の日付をyyyy/MM/ddで取得する
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(D)");
  var yesterday = new Date(new Date().getTime()-1000*60*60*24);
  var formattedDate = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");  

  // 前日日付のカラムの座標を指定する
  var startDate = new Date("2015/01/01");
  var msDiff = yesterday.getTime() - startDate.getTime();
  var column = Math.floor(msDiff / (1000*60*60*24)) + 3; 

  var cell;

  // KPIの値を取得する
  while(true) { 
    cell = sheet.getRange(2, column);
    if (Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd") == formattedDate) {
      Logger.log("Findout");
      var orderNum = sheet.getRange(7, column).getValue().toFixed(0);
      var orderUnitPrice = sheet.getRange(15, column).getValue().toFixed(0);
      var signupNum = sheet.getRange(20, column).getValue().toFixed(0);
      var CPA = sheet.getRange(46, column).getValue().toFixed(0);
      var CPO = sheet.getRange(47, column).getValue().toFixed(0);
      var CVR = sheet.getRange(48, column).getValue().toFixed(4)*100;

      // Slackへ送る
      var slackApp = SlackApp.create(slack["token"]);
      var Slackpost = slackApp.postMessage(slack["groupId"],"```" + "\n" + "昨日のMarketing Quick Report" + "\n" + "オーダー件数:" + orderNum + "\n" + "オーダー単価:" + orderUnitPrice + "\n" + "会員登録数:" + signupNum + "\n" + "CPA:" + CPA + "\n" + "CPO:" + CPO + "\n" + "CVR:" + CVR + "%" + "\n" + "```", {username : slack["userName"]});
      return column;
    } else {
    }
    column += 1;
  }
}

パート説明

定義文

GoogleAppsScript
// 定義文
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '(A)', // Slackのtoken
  groupId: "(B)", // Slack MarketingグループのID
  userName: "(C)", // botの名前
}
  • SlackAPIを利用して、メッセージを送るgroupIDとuserNameを指定する。groupはchannelでも可能。
  • (A)~(C)の設定方法については参考ドキュメントを参照。

前日の日付をyyyy/MM/ddで取得する

GoogleAppsScript
// 前日の日付をyyyy/MM/ddで取得する
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(D)");
  var yesterday = new Date(new Date().getTime()-1000*60*60*24);
  var formattedDate = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd"); 
  • 本項目では前日の日付をyyyy/MM/dd形式で取得(KPIシート記入の日付と合わせる)し、次項目でカラム座標指定に使用する。
  • (D) : KPIを参照するシート名を記入

前日日付のカラムの座標を指定する

GoogleAppsScript
// 前日日付のカラムの座標を指定する
  var startDate = new Date("2015/01/01");
  var msDiff = yesterday.getTime() - startDate.getTime();
  var column = Math.floor(msDiff / (1000*60*60*24)) + 3; 
  • 今回KPIを取得したいシートは2015/01/01が3行目に有り1日1行ずつ進んでいく形式である(例えば、2015/01/03は5行目にある)。
  • 以下のロジックで前日の行数を本項目にて算出している。
    • getTimeメソッドにより、前日及び2015/01/01に対し、1970年1月1日00:00:00 UTC からの経過ミリ秒を算出し、差を算出(...a)
    • aを日数に変換し、カラムを算出するために+3を行う

KPIの値を取得する

GoogleAppsScript
// KPIの値を取得する
  while(true) { 
    cell = sheet.getRange(2, column);
    if (Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd") == formattedDate) {
      var orderNum = sheet.getRange(7, column).getValue().toFixed(0);
      var orderUnitPrice = sheet.getRange(15, column).getValue().toFixed(0);
      var signupNum = sheet.getRange(20, column).getValue().toFixed(0);
      var CPA = sheet.getRange(46, column).getValue().toFixed(0);
      var CPO = sheet.getRange(47, column).getValue().toFixed(0);
      var CVR = sheet.getRange(48, column).getValue().toFixed(4)*100;
  • 前項で指定したカラムを使用し、以下rowにあたるKPIを取得している。
  • 値の性質に応じて、整数化や%表記化を行っている(toFixedなど)。

Slackへ送る

GoogleAppsScript
  // Slackへ送る
      var slackApp = SlackApp.create(slack["token"]);
      var Slackpost = slackApp.postMessage(slack["groupId"],"```" + "\n" + "昨日のMarketing Quick Report" + "\n" + "オーダー件数:" + orderNum + "\n" + "オーダー単価:" + orderUnitPrice + "\n" + "会員登録数:" + signupNum + "\n" + "CPA:" + CPA + "\n" + "CPO:" + CPO + "\n" + "CVR:" + CVR + "%" + "\n" + "```", {username : slack["userName"]});
      return column;
    } else {
    }
    column += 1;
  }
}
  • 先ほど取得した値を、SlackAppがもつpostMessageメソッドを利用して送る。
    • optionとしてuserNameを指定している

コメント

  • そもそもGoogleAnalyticsのデータを毎日spreadsheetsで自動取得し、超使えるKPIシートを自動生成するTipsも合わせてどうぞ

GoogleAnalytics API Add-onを使ってspreadsheetsを最強のKPI管理シートに - 基礎編

  • SlackAppライブラリとても使いやすい。
  • マーケターが「spreadsheet上で実装したい機能を作りたいものをGASで実現する」程度のリテラシーを持つと、グンと業務の幅や出せるインパクトが増えることを実感しました。

参考

  1. Slack BotをGASでいい感じで書くためのライブラリを作った
  2. スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた

@abe-perorist さん、参考にさせていただきました。ありがとうございます。