Timers Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

当番Botを支える技術 #gas #spreadsheet #bot

f:id:bboykk:20190521191939p:plain

テックブログを乗っ取り中のかっくん(@fromkk)です!

先日社内エンジニアが集う Tech Lunch(テックランチ) の紹介で紹介された当番Botの紹介です。

当番Botとは

弊社では定期的に順番が回る仕組みがいくつかあります。CSの人から依頼があった調査依頼を最初に拾う人を指名したり、Tech Lunchで見る動画の種類を指定したりしています。
これらは当番Botを導入するまでは人力だったのですが、忘れやすくとても大変でした。(特にCS当番は毎日の事だったので工数が大きかったです)
こう言った定期的にしないといけない事は僕たちエンジニアの得意分野ですね!そこでタスクデー(2週間に一度、普段のスプリント内では出来ないタスクやUXの改善、バグ修正などの行う日)を利用して開発したので紹介します。

実装方法

Google Spreadsheetに下記の様なデータを用意します。A列に必要なリソース、C:1セルに実行された回数を記録しておきます。

f:id:bboykk:20190521183931p:plain:w320

ツールからスクリプトエディタを選択します。

f:id:bboykk:20190521184550p:plain:w320

下記のコードをコピペします。
※ SlackのWebhook URLとチャンネルを設定するを忘れずに

function main() {
  // 日付取得、フォーマット整形
  var currentDate = new Date();
  var weekday = currentDate.getDay();
  
  // 休日は実行させない
  if (weekday == 0 || weekday == 6) {
    return;
  }
  
  //祝日か判定
  var calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  var calendar = CalendarApp.getCalendarById(calendarId);
  var todayEvents = calendar.getEventsForDay(currentDate);
  if(todayEvents.length > 0){
    //祝日は実行させない
    return;
  }
  
  //現在のシートを取得する
  const sheet = activeSheet();
  //リソースの一覧を取得する
  const res = resources(sheet);
  //実行回数を取得
  const num = numberOfActions(sheet);
  //実行回数を増やす
  incrementActions(sheet);
  //今回の当番の順番を決定
  const index = num % res.length;
  //今回の順番の値
  const value = res[index];
  //Slackに通知する
  postToSlack(value);
}

/**
 * 現在のシートを取得する
 */
function activeSheet() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getActiveSheet();
  return sheet;
}

/**
 * リソースの一覧を取得する
 * @param sheet リソースを取得するシート
 */
function resources(sheet) {
  const lastRow = sheet.getLastRow();
  const values = sheet.getRange("A1:A" + lastRow).getValues();
  return values;
}
/**
 * 実行回数を取得する
 * @param sheet 実行回数を取得するシート
 */
function numberOfActions(sheet) {
  return sheet.getRange("C1").getValue();
}
/**
 * 実行回数を増やす
 * @param sheet 実行回数を増やすシート
 */
function incrementActions(sheet) {
  const val = sheet.getRange("C1").getValue();
  sheet.getRange("C1").setValue(val + 1);
}

/**
 * Slackに投稿するメッセージ
 * @param value メッセージ
 */
function postToSlack(value) {
  // SlackのWebhook URL
  const url = "https://hooks.slack.com/services/XXXXXXXX/YYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZz";
  // 投稿するSlackのチャンネル
  const slackPostChannel = "#xxxxxxxxxxxx";
  var payload = {
      "text": "今週は" + value + "だね",
      "channelId": slackPostChannel,
      "userName": '当番Bot',
      "icon_emoji": ':robot_face:'
    }
    var options = {
      "method": "POST",
      "payload": JSON.stringify(payload),
      "headers": {
        "Content-type": "application/json",
      }
    }
    var response = UrlFetchApp.fetch(url, options);
    
    if (response.getResponseCode() == 200) {
      return response;
    }
    return false;
}

それでは main 関数を実行してみましょう。
Slackに投稿されれば成功です。
※何かエラーが出たら修正頑張ってください🙇🏻‍♂️

定期実行

ツールバーから時計のアイコンを選択します。

f:id:bboykk:20190521190908p:plain:w320

週次で実行する場合は下記の様にトリガーを追加します。

f:id:bboykk:20190521191250p:plain:w480

まとめ

これで定期的に当番を指名するBotを作る事が出来ました🎉
他にも色々なBotが動いてTimersの業務を支えているので興味のある方はお声がけ・お問い合わせ頂ければと思います!

積極採用中!!

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる