BLOG

ブログ

【チャットワーク×GAS】手軽に通知を投げる方法紹介と文化紹介

こんにちは、タロウです。

エンジニアなら誰でもどこかで何かしらの通知を受け取ることがあると思います。

  • デプロイ完了通知を受け取る
  • 当日スケジュールを受け取る
  • 天気予報を受け取る

プロジェクトや組織ごとに様々な文化があり、その数分だけ通知を受け取る機会が多くあります。弊社も様々な通知を出し、日々の業務を少しでも便利にしたり、少しでもミスを防いだりと活躍している通知があるのでご紹介します。

弊社は標準でチャットワークを使用しており、GAS(Google Apps Script)でトリガーを設定し毎日いろんな通知を飛ばしています!

紹介する通知

  • 天気予報
  • カレンダー
  • ミーティングURL

基本的な通知ですが、とても便利に使えます。
特にミーティングURLはリモートのメンバーがいる際、わざわざ発行しなくても良いので煩わしさなく快適でした。

通知を飛ばすため

通知を定刻で飛ばすためにトリガーの設定、チャットワークへPOSTする仕組みが必要になります。

トリガー設定

GASには分まで指定できる機能がないため、スクリプトから時刻設定を行う必要があります。
またトリガー設定後、指定した時刻に指定した関数が実行されますが、削除しないとトリガーが残り続けます。

トリガー設定をキーに定刻で実行するようにします。
関数の実行完了後にトリガーを削除します。トリガー設定自体を平日のみ動くようにすることで、他の全ての関数を平日のみ動かすことができます。

// トリガーを設定
function setTrigger(){
  // 天気予報
  setTime("todayWether", "9", "15");
}

// トリガーを削除
function delTrigger(target) {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == target) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

// Googleのトリガーを作成する
function setTime(app, hour, minutes){
  var setTime = new Date();
  setTime.setHours(hour);
  setTime.setMinutes(minutes); 
  ScriptApp.newTrigger(app).timeBased().at(setTime).create();
}

トリガー設定のみ手動で設定を行います。
下図の通り、定刻での実行は不要なので0時〜1時に実行としています。

チャットワークへのPOST

GAS(Google Apps Script)にはライブラリがあり、自分で実装をする必要なく進めることができます。
チャットワークへの操作もライブラリが存在するので使用します。

GASの左メニューよりライブラリのプラスボタンを押し、検索IDに下記を入力します。

スクリプトID:1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav

入力し、ChatWorkClientのライブラリが出てくればOKです。

エディタへ戻り、チャットワークへPOSTする処理を作成します。
基本的にはトークン部屋IDメッセージのみの設定となります。

// POST処理
function post(text){
  console.log(text)
  // ChatworkAPIクライント作成
  const client = ChatWorkClient.factory({token: "ここにチャットワークのトークン"});
  const response = client.sendMessage({
    room_id: "部屋のID",
    body: text
  });
  console.log(response)
}

トークン(token)

何をするにもトークンの発行が必要となります。
チャットワークのチャット画面右上からサービス連携を選択し、APIトークンの発行を行います。下のようにトークンが発行されていればOKです。

これをGASのここにチャットワークのトークンへ設定します。

部屋ID(room_id)

自分が通知を出したい部屋のIDを指定します。
チャットワークは自分が入っている部屋ごとにIDが振られており、URLから確認することができます。

https://www.chatwork.com/#!ridxxxxxxxxx

のようにridより後ろに付いている数字が部屋IDとなります。これを部屋のIDへ設定します。

メッセージ(text)

表示させたいメッセージを設定します。改行が設定されないので注意が必要です。

  let text = "ボットです";
  text += "\r\n";
  text += "改行";
  text += "\r\n";
  text += "改行2";

のように改行コードを入れないと意図した場所で改行されないので必要に応じで入れましょう!

ここまででチャットワークへメッセージをPOSTする処理が完成しました。

天気予報

今日そんなに寒くないなと思ったら2度でした。
その日の天気予報を平日9時15分に流しています。

/*
 * todayWether 今日の天気をお知らせ
 */
function todayWether(){
  // トリガー削除(無駄なトリガーが増えていくので、実行されたら登録したトリガーを消します)
  delTrigger("todayWether");
  // 気象庁の天気予報
  const response_str =  UrlFetchApp.fetch("https://www.jma.go.jp/bosai/forecast/data/forecast/016000.json"); 
  const response = JSON.parse(response_str)
  const area = response[0].timeSeries[0].areas[0]
    
  let text = "🌞今日の天気 [🤖]";
  text += "\r\n";
  text += area.weathers[0];
  text += "\r\n";

  const temps = response[0].timeSeries[2].areas[0].temps
  text += "🥵最高気温  " + temps[0] + "度"

  // POST処理実行
  post(text);
}

気象庁が提供しているその日の天気予報jsonを読み込み、必要なデータを取り出して表示しています。

メッセージ表示用に改行コードを織り交ぜながら該当エリアの情報と最高気温の文章を作成しチャットワークへPOSTします。

事前準備でPOSTを行う関数を作成おいたので、それぞれトリガーで実行される関数では、情報を取得するメッセージを作成するのみの役割へ絞り込むことができます。

カレンダー

祝日・会社の休みなどは考慮していなく、平日に実行する!を守り続けてくれます。
Googleカレンダーを社員共用で使用しており、Googleカレンダーに登録されている予定を出力しています。

GASでは簡単にカレンダーから情報を取得できるようサービスが存在しています。
左メニューのサービスよりCalendarを選択して設定します。

これだけでカレンダー機能を使用することができるようになります。
その機能を使って予定を取得するコードを紹介します。

/*
 * todayEvent 今日の予定をお知らせ
 */
function todayEvent(){
  // トリガー削除(無駄なトリガーが増えていくので、実行されたら登録したトリガーを消します)
  delTrigger("todayEvent");
  // カレンダーを取得する
  const myCalendar = CalendarApp.getCalendarById('XXXXXXXXXXXXXXXXX@group.calendar.google.com');
  
  //Googleカレンダーから取得するイベントの開始日(今日)を設定する
  let startDate = new Date();
  startDate.setHours(0)
  startDate.setMinutes(0)
  startDate.setSeconds(0)
  //Googleカレンダーから取得するイベントの終了日(今日)を設定する
  let endDate = new Date();
  endDate.setDate(startDate.getDate());
  endDate.setHours(23)
  endDate.setMinutes(59)
  endDate.setSeconds(59)
  //開始日~終了日に存在するGoogleカレンダーのイベントを取得する
  let myEvent = myCalendar.getEvents(startDate, endDate);

  let text = "📅今日の予定  [🤖]";
  text += "\r\n";
  text += "➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖"
  text += "\r\n";

  //forループの処理で取得したイベントの件名をログ出力する
  for(let i = 0 ; i < myEvent.length ; i++ ){
    const time = new Date(myEvent[i].getStartTime())

    text += time.getHours() + ":" + time.getMinutes() + " " + myEvent[i].getTitle()
    text += "\r\n";
  }
  text += "➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖"

  // POST処理実行
  post(text);
}

指定した日(当日)の0時00分00秒〜23時59分59秒までを行うことができます。

Googleカレンダーの取得部分は、カレンダーの設定からカレンダーIDを取得することができるのでそのIDを使用します。

コードのXXXXXXXXXXXXXXXXX部分に設定します。

カレンダーから当日を指定し取得した予定は配列で返却されるため、ループで回してメッセージを作成します。

このボットのおかげ(?)で予定をすっぽかすことは無くなった気がします!!

ミーティングURL

在宅勤務のメンバーとはオンラインで朝会を行なっています。

毎日決まった時間にミーティングを行うため、誰かがURLを発行してくれることをなくし、時間になったら部屋に入る運用としました。

そのミーティングURLもGASを使用して発行しています。

/*
 * morningMeeting 朝会
 */
function morningMeeting(){
  // トリガー削除(無駄なトリガーが増えていくので、実行されたら登録したトリガーを消します)
  delTrigger("morningMeeting");

  let text = "🌅朝会 [🤖]";
  text += "\r\n";
  text += getMeetUrl();

  // POST処理実行
  post(text);
}

function getMeetUrl(){
  // カレンダーを指定する
  const userId = "XXXXXXXXXXXXXXXXX@group.calendar.google.com";
  // カレンダーへミーティングURL付きの予定を入れる
  const eventParam = {
    conferenceData: {
      createRequest: {
        requestId: Math.random().toString(32).substring(2),
        conferenceSolutionKey: {
          type: "hangoutsMeet"
        },
      }
    },
    start: {
      dateTime: "2022-12-01T09:00:00.000+09:00"
    },
    end: {
      dateTime: "2022-12-01T09:30:00.000+09:00"
    },
  };
  const event = Calendar.Events.insert(eventParam, userId, {conferenceDataVersion: 1});
  // 作成した予定を削除する
  Calendar.Events.remove(userId, event.id);
  // 作成時に発行されたミーティングURLを返却する
  return event.hangoutLink;
}

ミーティングURLのみの発行ができないため、一時的にカレンダーへ予定を入れ、ミーティングURLのみ取得します。
発行したURLをチャットワークへPOSTする流れとなります。

発行した本人(GASを実行したユーザー)がミーティングのオーナーとなる

許可制のミーティングとなるためオーナーが存在します。
実行したユーザーがその日休みや参加できないとなると誰も入ることができない点が要注意でした。

よく出社するメンバーやリーダーが発行するなど運用でカバーが必要になるかもしれません。

マブスの通知文化

紹介した3つ以外にも様々な通知を自動で発行しています。

朝は9時半ごろに出社するメンバーが多いので、あまり早い時間(9時前など)に出さないようにしています。

他にも部活内での通知や、Slackで検証環境のデプロイ通知など状況を知れる仕組みを作成しています。
※筋肉リマインダーが知りたい方、ぜひお問い合わせください。もれなくコードを提供します!!

さいごに

あまり多すぎず、自分から情報を取りに行くことが億劫になるものに関しては通知・ボット化するのがとても良いです。

また技術トレンドなどは毎日目に触れる機会を増やすことで、タイトルで気になった記事をすぐに開くことができるなど技術への興味関心意欲を促進し、その記事内容についてのディスカッションや共有に発展することができています。

自分一人で使うもよし、今の組織・プロジェクトにおいて役に立つものはみんなに共有できるようすることで少しは快適な環境になれると思います。

ぜひお試しください!

RELATED ARTICLE

  • この記事を書いた人
  • 最新の記事

Ohno Shintaro

ディレクターも、サーバ構築も、ゴリゴリ開発もやります。 オールマイティ担当。 スパイスも甘いものも大好き。