ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

Spread Sheetの質問件数をGASを使ってslack通知してみた

この記事はユニファAdvent Calendar 2021の19日目の記事です。 adventar.org

こんにちは。プロダクトマネジメント部のきそです。
今回はGoogle Apps Scriptでちょっとだけ業務効率化できたかなと思うことについて書いてみようと思います。

はじめに

ユニファには複数のプロダクトがあり、チームごとに担当プロダクトが割り振られています。
PdMへの仕様に関する質問は1つのSpread Sheetにプロダクトごとにシートを分けて管理しています。

f:id:unifa_tech:20211215141734p:plain
質問表Spread Sheetのサンプル

自分が担当しているプロダクトに質問が来ているか、毎日確認するのは大変なので、GASで自動化することにしました。

やったこと

  • 質問表のSpread Sheetの未回答質問数の合計数を取ってくる
  • 合計数が0ではなかったら、プロダクト名とそれぞれの未回答質問数を取ってくる
  • 質問がきているプロダクト名と質問件数をslackで通知する
    これをGASのトリガーで毎日9時〜10時の間に発火するようにセット

f:id:unifa_tech:20211215141958p:plain
slack通知のサンプル

意外と大事!土日・祝日対応

毎日発火するようにGASのトリガーをセットしているのですが、休みの日にslackが飛んできたらげんなりしますよね。私は間違いなくげんなりします。
ということで、土日・祝日の対応を入れました。
曜日:今日の日付から取得
祝日:Googleカレンダーの「日本の祝日」から取得

実際のコード

function myFunction() {
  const holidayCalendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); // Googleカレンダーの「日本の祝日」
  let today = new Date(); // 今日の日付取得
  let dow = today.getDay(); // 今日の曜日取得
  let holidaySchedules = holidayCalendar.getEventsForDay(today); // 今日の祝日取得
  if (holidaySchedules.length != 0 || dow == 0 || dow == 6) {
    return false;
  }
  const Sheet = SpreadsheetApp.openById('hogehoge'); //スプレッドシート指定
  const targetSheet = Sheet.getSheetByName('質問未回答サマリー'); // シート名指定
  let totalnum = targetSheet.getRange('C9').getDisplayValue(); // 合計の質問件数が記載されているセルを指定
  if (totalnum == 0) {
    return false;
  }
  let slacktext = '<!subteam^グループのid> \nおはようございます!\n本日の質問/バグ報告件数を共有いたします。\n\n'
  let unanswered = targetSheet.getRange('B3:C8').getDisplayValues(); // プロダクト名と質問件数が記載されているセルを指定
  for (var i=0; i<unanswered.length; i++) {
    if (unanswered[i][1] != 0) {
      slacktext += unanswered[i][0] + ':' + unanswered[i][1] + '件\n';
    }
  }
  slacktext += '\n【現状の質問状況】\nhttps://docs.google.com/spreadsheets/d/hogehoge/edit?usp=sharing';
  // slack送信
  const webHookUrl = 'https://hooks.slack.com/services/fugafuga'; // slack通知したいチャネルのwebhookURLを指定
  let jsonData = {'text':slacktext,'username':'質問・バグ件数報告','icon_emoji':':hatched_chick:'};
  let payload = JSON.stringify(jsonData);
  let options = {'method':'post','contentType':'application/json','payload':payload};
  UrlFetchApp.fetch(webHookUrl, options);
}

小ネタ

Slackを飛ばす際に、グループメンションと個人メンションでは少し書き方が違います。
グループメンションの場合
<!subteam^グループのid>

個人メンションの場合
<@個人のid>

idはブラウザのデベロッパーツールを使ってslackのソースコードから確認しています。(もっといいやり方あったら教えてください)

おわりに

ユニファのPdMは基本的に業務でコードを書くことはありませんが、たまに責任の軽いコードを書くのは楽しいなあと思いながら、他にも業務効率化できることはないか日々探しています。

そんなこんなで今年もあと2週間足らずで終わってしまいますが、2021年にし忘(師走)れたことはないか、年内のうちに確認しておきたいですね。

ユニファではダジャレを一緒に言ってくれる新たな仲間を募集中です! unifa-e.com