14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

まえがき

株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2022 の5日目になります。

背景

開発チーム30人程度になるプロジェクトでかれこれ5年近くSlackを無料プランで使わさせていただいています(本当にお世話になっております:pray:)
Googleカレンダーに登録してある当日予定をSlackに通知する機能がとても便利だったのですが、Slackのアップデートにより無料プランでは使えなくなるとのこと
有料プランにする?代替アプリを探す?と検討したが、エンジニアなのだから作ってしまおうということで本記事になります

実現方法

毎朝9:00に定期実行(GAS) → Googleカレンダーから当日の予定を入手 → Slackに通知
定期実行かつ(無料で)サーバ立てずに手っ取り早くということでGAS(GoogleAppsScript)を利用する

準備

  • GoogleカレンダーのCalendarIDを取得しておく
  • Slack APIにSlack投稿の権限付与
  • Slack APIでWebhook URL取得しておく

GoogleカレンダーのCalendarIDを取得しておく

カレンダーを開いて、設定からCalendarIDを取得

Slack APIにSlack投稿の権限付与

  • Slack APIを作成
  • OAuth & Permissions -> Scopes -> Bot Token ScopesにSlackのチャンネルに投稿する権限「incoming-webhook」を追加
    詳しくはこちら
    https://api.slack.com/scopes
  • OAuth & Permissions -> OAuth Tokens for Your WorkspaceでInstall to Workspace
    エラーが出た方はこちらが参考になりました
    https://the-simple.jp/slack-nobotuser

Slack APIでWebhook URL取得しておく

  • Incoming Webhooks -> Webhook URLs for Your Workspace

GASで実装する

https://script.google.com/home
カレンダーに登録してあるタイトルのみをSlackに通知しています
他の情報まで通知したい場合、カスタマイズしてご利用ください

hoge.gs
// カレンダー
const calendarID = "準備で取得したCalendarID";
// slack
const slackWebHook = "準備で取得したWebhook URL";

// 予定を取得
function getEvents(calendarID) {
  var date = new Date();

  // カレンダーから当日予定を取得
 var events = CalendarApp.getCalendarById(calendarID).getEventsForDay(date);

  return events;
}

// Slackに送信
function sendSlack(message) {
  // Webhook URL
  const postUrl = 'https://hooks.slack.com/services/'+slackWebHook;
  const json = {
    'text': message
  };
  const payload = JSON.stringify(json);
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

// 定期実行
function myTasks() {
  // slack投稿メッセージ
  let message = "";

  // カレンダー情報取得
  var events = getEvents(calendarID);

  // 予定が存在する場合
  if (events.length !== 0) {
    message += "■本日の予定\n";
    for(let event of events){
      message += '[' + event.getTitle() + ']\n';
    }
  }
  // 何らかの予定がある場合、(休日でも)slack投稿
  message !== "" && sendSlack(message);
}

// トリガー用(必要であればここで日時指定するとか)
function setTrigger(){
  const date = new Date();
  ScriptApp.newTrigger('myTasks').timeBased().at(date).create();
}

実装したGASを定期実行に設定する

毎朝9:00(ぐらい)に定期実行
カレンダーに予定があれば、休日でも投稿する
image.png

これで何とか元通り

Slack通知がされなくなるのはチーム的に困りそうなので、突貫で作ってみました
9:00ぐらいというアバウトな状態ですが、厳密じゃなくても困らなそうなので、このままにします

しばらく運用しながらカスタマイズしていく予定です

全体的に参考(感謝)

14
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?