【コミュニティ×GAS】つぶやきBotで日常会話を盛り上げる仕組みを作った話
IT企業で人事の仕事をしながら副業でコーチングのプロコーチをしています。また、ノンプロ研(ノンプログラマーのためのスキルアップ研究会)でプログラミングの勉強もしています。
社内でコミュニティを運営していて、その中でGASを活用して日常会話を盛り上げる仕組みを作った話。
コミュニティの立ち上げ経緯は過去のエントリーに掲載しています↓
コミュニティの会話を活性化させるには
事業・組織を超えてナレッジを共有し知見を得られる場を創出することを目的とした社内コミュニティを運営している。
ただ、立ち上げたばかりということと、メンバーもみんなそれぞれ本業が忙しくて、なかなかコミュニティ内でちょっとした質問や会話が生まれないということが運営上解決していきたい課題だった。
コミュニティのコミュニケーションはSlackがメイン。Colla(チャネル内の会話を促すBotアプリ)を入れることを検討したけれど、すでに同じワークスペース内で使用されており、断念。
会話を活性化させるBotを自作してみた
せっかくGASを勉強しているのだから、Colla的なBotを自分で作ってみることにした。
メンバーリストの整備
まずスプレッドシートにコミュニティメンバーのリストを作成。
Slackの管理者権限がないので、SlackIDは1人ずつ手で取得。。今はいいけど人数が増えてきたらつらい。
設計
【祝日を除く毎週火曜日・木曜日の朝】にランダムで1人のメンバーを指名して、会話を促す仕組みにした。
GASのスクリプト
/**
* 祝日・特定休日以外の火曜日・木曜日にランダムでメンションし、Slackにメッセージを送る
*/
function weeklyBotMain() {
//メンバーリストの取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const listSheet = ss.getSheetByName(`メンバーリスト`);
const list = listSheet.getDataRange().getValues();
list.shift();
//乱数でランダムに指名
min = 1;
max = list.length;
const targetNum = Math.floor(Math.random() * (max - min + 1) + min);
//Slackへのメッセージ
const mention = list[targetNum - 1][3];
let msg = ``;
msg += `<@${mention}>`+`さん、おはようございます!:ohayo2:\n`;
msg += `:naretsuku_w:本日のつぶやきを一言お願いします:naretsuku_w:\n`;
msg += "```■最近困っていることや気になっていること```\n";
msg += "```■オススメ書籍の紹介```\n";
msg += "```■共有したい豆知識やナレッジ```";
//今日が火曜日か木曜日(2か4)、かつ営業日なら実行
const today = new Date();
if ((today.getDay() === 2 || today.getDay() === 4) && isWorkday_(today) === true) {
notifySlack(msg);
}
}
/**
* slackに通知を送る
*
* @param {string} slackメッセージ
*/
function notifySlack(msg) {
const postUrl = `**SlackのWebhookURL**`;
const userName = `**通知するBotの名前**`;
const icon = `:**通知するBotの絵文字アイコン**:`
const jsonData = {
"username": userName,
"icon_emoji": icon,
"text": msg
};
const payload = JSON.stringify(jsonData);
const options = {
"method": "post",
"contentType": "application/json",
"payload": payload
};
UrlFetchApp.fetch(postUrl, options);
}
/**
* summary:営業日かどうかを判定するisWorkday_関数
*
* @param {object} 判定する日付
* @return {boolean} 営業日ならtrue、そうでなければfalseを返す
*/
function isWorkday_(today) {
//特定休日判定
const specialHoliday = [`0101`, `0102`, `0103`, `1229`, `1230`, `1231`];
const mmdd = Utilities.formatDate(today, `JST`, `MMdd`);
//祝日の判定
const id = `ja.japanese#holiday@group.v.calendar.google.com`;
const cal = CalendarApp.getCalendarById(id);
const events = cal.getEventsForDay(today);
//土日の判定
const day = today.getDay();
//特定休日・祝日・土日に当てはまればfalseそうでなければtrueを返す
if (specialHoliday.some(value => value === mmdd) || events.length || day === 0 || day === 6) {
return false;
}
return true;
}
やっぱり祝日にメンションされてしまうのは申し訳ないので、営業日を判定する仕組みは絶対に入れたいと思っていた。営業日かどうか判定するスクリプトは隣ITのページを参考にした。
ランダムで指名する仕組みはノンプロ研のGAS中級講座で教わったMathオブジェクトで乱数を発生させるスクリプトを活用した。
トリガーの設定
トリガーは時間主導型で、時間のみ設定。曜日や祝日の判定はスクリプトの方に書いている。
いよいよ稼働開始!
ちゃんとテストもしたし大丈夫と思いつつ、ドキドキしながら初めて通知されるはずの火曜日の朝を迎える。
↓
↓
↓
↓
↓
↓
キ、キターーーーー!(当たり前)
ナレツクちゃん、かわいい!(自画自賛)
最近GASをあまり触れていなかったけれど、やっぱり自分で作ったプログラムが動くのは嬉しい。GASを学ぶモチベーションがまた上がってきている。
会話が盛り上がる起爆剤になりつつあるよ
これをきっかけにちょっとしたことの相談や、おすすめの書籍の情報流通などがいい感じに生まれるようになってきた。反応してくださったメンバーの皆さんにも感謝!^^
週に2回という頻度も良かった。毎日だとウザくなりそう(小心者)。週に2回くらいだとメンバーの皆さんの投稿をウキウキと楽しみに待てる感覚がある。
今はメンバーが15名なので、ランダムで当たる確率が1/15にバラけるのであれば自分が指名される頻度は2ヶ月に1回程度。それなら負担にもならないし、つぶやきたいことのネタ切れもなさそうで、程よくフレッシュな話題が続きそうな気がする。
コミュニティとGASの相性が良い
実際にコミュニティを運営し始めてGASを使った仕組みを入れてみて、コミュニティとGASは相性が良いなーと感じている。
会話を盛り上げるのは自らが投稿すればいい話だけれど(もちろんそれもやっているけれど)、忙しいときはどうしても優先度が下がってしまうし、いつかはコミュニティコーディネーターの役割を誰かに譲っていくことになるかもしれないので、GASを使って仕組み化しておくことはサステナブルだと思う。
それにコミュニティ運営は、仕事のような仕事ではないような性質のものなので、納期が厳密に決まっているわけでもなく、自分のスキルが足りなくて結局自動化するに至らない・・ということが起きづらい。
初学者に毛が生えた程度の私のスキルでも、作りたい仕組みを考えて、じっくり取り組むことができる。
機会を自ら作り出していく
最近異動したことにより業務の性質が少し変わり、GASを使う機会がかなり減ってしまっていた。
私のキャリアや能力開発におけるモットーとして、「機会があれば取りに行く」を大事にしているけれど、コミュニティはGASを再度学び活用する機会になりつつあると感じる。機会がなければ、自ら作ればいい!そんな気づきを得ることもできた。
これからもコミュニティ運営とGASの学習を頑張っていきたいと思います。
最後までお読みいただきありがとうございます^^
この記事が気に入ったらサポートをしてみませんか?