Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

Slackの運用が長くなってきて、Appsの数がそろそろ限界になってきたぞ;;という方向けのお話です。

僕も運営中のPlayer!のKPI管理として、スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみたにて、快適なSlackでのKPI生活を楽しんでいたのですが、ある日突如KPIが自動投稿されなくなりました。

理由は、(おそらく)導入していたライブラリと連携していたAppsを解除していたためです。
予算の都合上、対象のAppsを受け入れることはできないとのお達しを頂いたので、他の方法がないかなと色々やってたら、できてしまったのでまとめます。

やろうとしていることの全体の流れ

ざっくり言うと、
1. SlackのIncoming Webhooksで新しいConfigurationを作り、Webhook URLを発行する
2. そのWebhook URLにJSONをPOSTする
3. Slackに自動投稿されて、嬉しい

という流れなのです。
これらすべてを記述するほど、僕は粘り強くないので、「2. そのWebhook URLにJSONをPOSTする」のみ書きます。
その他の箇所に関して、一言だけ述べるなら、
「1. SlackのIncoming Webhooksで新しいConfigurationを発行し、Webhook URLを確認する」は、チャネルを指定して、作ればオッケー
「3. Slackに自動投稿されて、嬉しい」は、該当チャネルに投稿されるのを確認して、トリガー設定して、自動投稿されることを喜べばオッケー

さて、本題に入ります。

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

「2. そのWebhook URLにJSONをPOSTする」を実現するためのGoogle Apps Scriptを書いたので、そちらをお見せします。
スプレッドシートにてKPI管理をしていますので、下記のGoogle Apps Scriptは「スプレッドシートの値を取得する」「値を含めたJSONメッセージをWebhook URLにPOSTする」という構成になっております。
また、「スプレッドシートの値を取得する」に関しては、スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみたにて、記載しておりますので、本記事では省略します。

コード.gs
// スプレッドシートの値を取得する
function post_all_kpi_data() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var kpisheet = ss.getSheetByName('Slack');

 var totalusers = kpisheet.getSheetValues(2,2,1,1);
 var newusers = kpisheet.getSheetValues(2,16,1,1);

 var rounding_mau = Math.round(kpisheet.getSheetValues(6,6,1,1)*10000);
 var percent_mau = rounding_mau/100;
 var real_mau = kpisheet.getSheetValues(2,6,1,1);

 var rounding_wau = Math.round(kpisheet.getSheetValues(6,8,1,1)*10000);
 var percent_wau = rounding_wau/100;
 var real_wau = kpisheet.getSheetValues(2,8,1,1);

 var rounding_dau = Math.round(kpisheet.getSheetValues(6,10,1,1)*10000);
 var percent_dau = rounding_dau/100;
 var real_dau = kpisheet.getSheetValues(2,10,1,1);  

 var weblp_mau = kpisheet.getSheetValues(2,5,1,1);  
 var all_mau = kpisheet.getSheetValues(2,4,1,1); 

// 値を含めたJSONメッセージをWebhook URLにPOSTする
 var app_data = ("総ユーザーは" + totalusers + "人で、前日比 +" + newusers + "人ですわ。\nTotal_MAUは" + all_mau + "人です。\nApp_MAUは" + percent_mau + "%(" + real_mau + "人)。\nWeblpのMAUは"+ weblp_mau + "人。\nWAUは" + percent_wau + "%(" + real_wau + "人)。\nDAUは" + percent_dau + "%(" + real_dau + "人)"); // 送信したいメッセージ
 var post_data = {"text":app_data};

  var url = "https://hooks.slack.com/services/から始まるURL"; // 作成したWebhook URLを埋め込む
  var payload = JSON.stringify(post_data);

  var headers = { "Accept":"application/json", 
              "Authorization":"Basic _authcode_"
             };

  var options = { "method":"POST",
                "headers": headers,
                "payload" : payload
               };
  var response = UrlFetchApp.fetch(url, options);
 Logger.log(response);  

 }

こんな感じで、メッセージを作って、対象のWebhook URL埋め込んで、トリガーを設定すればばっちしです!

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした