見出し画像

ChatWorkとスプレッドシートの連携

どうも。新卒2年目、非エンジニアのカイリューです。
今回はマーケ担当が勉強する自動化シリーズの第1段になります。
本記事では、スプレッドシートと弊社で利用しているChatWorkの連携による自動リマインドについてご紹介致していきます!
それでは、いってみましょー!

目次
・成果物の確認
・製作に至る背景(何があったのか)
・作り方
・まとめ

成果物の確認

まずは、完成したものを確認しておきましょう。
たしか、去年のどこかで作ったものです。

やっていることはスプレッドシート上にある当番表に応じて、担当者へリマインドを送ってくれるというもの。
画像はその当番表です。

製作に至る背景(何があったのか)

僕は社内のマーケティング部に所属していて、日々自社のWebサービス改善を主としています。
マーケター、デザイナー、エンジニアなど複数の職種が混在する状況では、それぞれ追っている目標が共有されていないのでは?という話がありました。
このような課題に対して、弊社では以下のように対処することに。

重要KPIなどを目につく所に書いて、日々共有しましょう

部長の意図としては、重要なKPIを部署横断で追っていきたいというものです。

そこでまずは、皆の目のつくホワイトボードに書いてみようという話に。
KPIの算出はマクロを用いて自動で行われるので、数値をホワイトボードに書くだけ。
当時の担当は僕を含めて4人でしたが、たまにあるのが担当者のやり忘れ。
かといって、いちいちリマインドするのもだるい。
誰か勝手にリマインドしてくれたらいいのにな…というのが始まりです。

作り方

全体のステップは下記の通り。
やってみると結構少ないので、ぜひ。

・スプレッドシートに当番表を作成
・チャットワークでのAPIキーを取得
・チャットワークでリマインド部屋を用意
・GASを記述

では、ここから作成の流れをご説明しましょう。
まずは、スプレッドシートに当番表を作成します。

今回はできる限りをスプレッドシート側の関数などで対処していました。
今ならもっと簡素化できますね。

次にチャットワークへリマインドを送るために下準備をします。
①APIキーを取得
②リマインド部屋もしくは、対象のルームIDを取得
参考:Google Apps Scriptの第一歩、初心者でもチャットワークにメッセージを送れる

APIキーについては、それぞれのアカウントに紐づく形で存在します。
そのため、Botとして利用可能なアカウントなどがあれば、そちらのAPIキーを取得してください。
会社の場合、Botなどがあると思いますので、エンジニアあたりに相談してみましょう。

※APIキーとは、今回の場合GASからチャットワークを呼び出すために必要な鍵というイメージで大丈夫です。

その後、Botも含めた当番の人たちがいるグループのルームIDをメモしておいてください。
黄色い線の引いたところがルームIDとなります。

ここまで来たら、前準備は完了です。
いざ、チャットを送るためのプログラムを書いていきましょう。

まずは、完成品をこちらに書いておきます。
少しずつ説明していきますので、ご安心を。

ソースコード

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("list");
var num = sheet.getRange('G2').getValue();
var name = sheet.getRange(num,3).getValue();
var toMes = sheet.getRange(num,4).getValue();
var toDay = new Date();

/*
  対象の日付が休日かをチェックする。
  targetDate:対象日
  返り値
    true:休日である
    false:休日ではない
*/
function isHoliday(targetDate){
  //土日か判定
  var weekInt = toDay.getDay();
  if(weekInt <= 0 || 6 <= weekInt){
    return true;
  }

  //祝日か判定
  var calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  var calendar = CalendarApp.subscribeToCalendar(calendarId);
  var events = calendar.getEventsForDay(toDay);
  if(events.length > 0){
    return true;
  }
  return false;
}

function chatMes(targetDate){
  //休日ならば強制的にNG
  if(isHoliday(targetDate)){
    return true;
  }  

 var client = ChatWorkClient.factory({token: 'xxxxxxxx'}); //チャットワークAPI
  client.sendMessage({
    room_id:12345678, //ルームID
    body:toMes + name + "さん" + ' 数値更新よろしく!\(^o^)/'});
  
  return false;
}

かなり、英語みたいで読みやすいのではないでしょうか。

1. 当番表から今日の担当を取得

それでは、順番にやっていることを説明していきます。
まず説明するのは、先程準備したチャットグループへチャットを送るための準備です。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("list");
var num = sheet.getRange('G2').getValue();
var name = sheet.getRange(num,3).getValue();
var toMes = sheet.getRange(num,4).getValue();
var toDay = new Date();

実質これだけなんですよね。
やっていることを分解すると以下のようになります。

1. 対象のスプレッドシートと指定したシートを起動
2. 'G2'セルのデータを取得(今日の日付と一致する行数)
3. ②で取得した行数に応じた担当の名前とチャットワーク用のTo部分を取得

GASでスプレッドシートを操作するには、どのスプレッドシートでどのシートなのかを明示する必要があるため、だいたい最初のうちにどこかの変数に格納します。

これは、後々何度も同じ処理を書かないためにも重要です。

※今回はスプレッドシートの関数と組み合わせてできるだけスクリプトに書くものは減らしています。
そのため、今日の担当者を割り出すには関数側で日付とのvlookで処理しました。

関数で求めた担当者が書かれた行数をGASに渡してあげることで、よりエクセルに馴染みがある人にはわかりやすくなるのではないでしょうか。

ちなみに、ここで使っているメソッドはだいたいこんな感じです。

getRange:シートのこの辺(位置情報を指定)
getValue:データを取得

なわけで、まとめるとここでの処理は、「当番表の○行目から、名前とToをとってきてね」というものになります。

2. 今日の当番をチャットワークに送る

続いて、さっき取得した当番の人をチャットワークでお知らせする処理に移ります。
ソースは以下のとおりですね。

function chatMes(targetDate){
  //休日ならば強制的にNG
  if(isHoliday(targetDate)){
    return true;
  }  

 var client = ChatWorkClient.factory({token: 'xxxxxxxx'}); //チャットワークAPI
  client.sendMessage({
    room_id:12345678, //ルームID
    body:toMes + name + "さん" + ' 数値更新よろしく!\(^o^)/'});
  
  return false;
}

ちょっとおまけでisHolidayとかいますが、本来必要なのはvar clientからです。
最初に準備したチャットワークAPIトークンを'xxxxx'のxxxxx部分と置き換えます。
その次に、お知らせしたいチャットワークのルームIDを記載しましょう。

これで準備はできました。
body部分で送信したいメッセージを決めていますので、文言等は自由に変更していただいてかまいません。
これで、あとはテストしてみて、チャットワークにメッセージがきたら完成です!

3. 送信までの準備

ここまででほとんど完成です。
ただ、気づいた人もいるかもしれませんが、自動でこの処理を繰り返し設定するということが残っています。
最後にこの設定の説明をして終わりにしようと思うので、あと少し頑張ってみてください。

下記の画像にある時計マークがすべての鍵を握っています。

時計マークをクリックすると「G suite Developper Hub」とかいうわからんところに飛ばされるでしょう。
遷移先の画面右下にある「トリガーを追加」を押すと下記のような画面がでてくると正解です。

でてきた画面から、どの関数をいつ実行するかを選びましょう。
先程実施した関数を選択し、イベントのソースを時間主導型にします。
そこで、毎週何時に連絡がほしいかを決めてください。
問題なければ「保存」で完成です!

あとは、時間になれば先程の内容が実行されてチャットワークにメッセージがくるでしょう。

まとめ

はい!
これで、ほとんどですね。
ここまでのコード自体も先程紹介したサイトやその他qiitaにもあるかと思います。
かくいう僕もコピペからの調整で、なんとかなりました。
とにかく考えた上で、手を動かしてみることが最も重要です。

このおかげで、僕が毎回他の当番をリマインドすることもなくなりました。
これ以外もどんどん無駄な仕事は自動化したいところですよね。
これを実装したのは、僕も入社して半年とかです。
ぜひ、みなさんもやりたいと思っていること、こうなったらいいなと思うことを調べてみましょう。
案外誰かが先にやっていますよ。

それでは、今回はここで終わりにします。
本記事では、チャットワークとスプレッドシートの連携と自動リマインドでした。
次回は、GooglePageSpeedInsightsを使って、Webサイトに重要な表示速度を自動でモニタリングできるようにした話を書こうと思います。

以上!

この記事が気に入ったらサポートをしてみませんか?