仮想サーファーの波乗り

仮想サーファーの日常

プログラミング・エンジニアのスキルアップ・ブログ運営などに関してよく書く雑記ブログ

➡ Udemyで8/27(木)まで割引セール開催中! 1,200円〜で普段の90%以上OFF!

Google Apps Scriptを使ってSlackに自動で定期通知をする方法(コピペでOK)


今回は、Google Apps Scriptを活用して、Slackに特定の条件で自動的に通知を送るプログラムを書いていきます! 仕事で「何度も同じような連絡をSlackでしてるなぁ。」と思ったら、自動化のサインです!自動化したってついでに周りの同僚の仕事も奪ったりましょう!

ここでは、「今日予定が書き込まれていたら、『タスクあるよ!』」と通知してくれるプログラムを作っていきます。


Slackの設定

まずは、通知を行いたいSlackの設定を行っていきます。


f:id:virtual-surfer:20180309231046p:plain

Slackを立ち上げて、チャンネルの右側の「▼」マークをクリックして、「Customize Slack」を選択します。


f:id:virtual-surfer:20180309231817p:plain

次に、遷移先のページで「Menu」という箇所をクリックし、そのあとに「Configure Apps」をクリックします。


f:id:virtual-surfer:20180309233032p:plain

検索欄に「Incoming WebHooks」と入力して、Incoming WebHooksを選択します。


f:id:virtual-surfer:20180310002953p:plain

次の画面で、「Add Configuration」をクリックします。


f:id:virtual-surfer:20180309233455p:plain

チャンネルを選択して、「Add Incoming WebHooks integration」ボタンをクリックします。*チャンネルはここで指定したもの以外にも通知できるし、のちのち変更することもできるので、ここでは適当に選択してOKです。


f:id:virtual-surfer:20180309233751p:plain

以上で、WebHook URLが表示されているはずです!これをメモしておきましょう。Google Apps Scriptで使います!
そして、こちらのページを下までスクロールしていくと、画像の設定ができる箇所があります。


f:id:virtual-surfer:20180309234114p:plain

通知を行う際のアイコン画像を設定したい時は、ここで画像をアップロードして「Save Settings」しておきましょう。

これで、Slackの設定は完了です。次に、Google Apps Scriptにプログラムを記入していきます。


GoogleSpreadSheetの設定

ここからは、GoogleSpreadSheetの設定を見ていきます。


f:id:virtual-surfer:20180309234546p:plain

まずは、任意のGoogleSpreadSheetを選択します。ここでは、上の画像のような形式・内容になっているスプレッドシートを想定します。


f:id:virtual-surfer:20180309234645p:plain

「ツール」 → 「スクリプトエディタ」を選択します。


f:id:virtual-surfer:20180309234841p:plain

すると、上の画像のようなコードを記載できる画面が表示されます。

ここにプログラムを書いていきます。今回は、今日タスクを持っている人がいた場合に、その人とタスクの内容をSlackに通知してくれるプログラムを書いていきます。

var isTask;
var postText;
var tasks = [];

/*
** 今日の日付でタスクがあればSlack通知する
*/
function postCReviewEventRemind(){
  /* 平日でなければ処理中断する */
  var currentDate = new Date();
  var weekday = currentDate.getDay();
  if (weekday == 0 || weekday == 6) {
    return;
  }
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  }
  
  searchSheetAndSetTasks();
  taskText(this.isTask);
  var postText = this.postText
  postSlack(postText)
}

/*
** textをslackに通知する
*/
function postSlack(text){
  var url = "WebHooksのURL";
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : JSON.stringify({
       "channel" : "general", // 通知先チャンネル名
       "text" : text,
    })
  };
  UrlFetchApp.fetch(url, options);
}

/*
** タスクのあるなしによって文章変更
*/
function taskText(isTask){
  var time = new Date();
  var month = time.getMonth() + 1;
  var day = time.getDate();
  var today = month + "月" + day + "日"
  var postText;
  
  if (isTask) {
    this.postText = "今日(" + today + ")はタスクあり!\n"
    for (var i = 0; i < this.tasks.length; i++) {
      this.postText = this.postText + "\n" + (i + 1).toString() + "人目 タスク:" + tasks[i][2] + "\n担当:" + tasks[i][1] + "さん\n"
    }
  } else {
    this.postText = "今日(" + today + ")はタスクなし!\n"
  }
}

/*
** 今日タスクがあるのか判定し、あればタスクの配列をセットする
*/
function searchSheetAndSetTasks(){
  this.isTask = false;
  var today = new Date();
  var splitedToday = today.toString().split(" ");
  
  var sheet=SpreadsheetApp.getActiveSheet();
  var range=sheet.getRange("A1:A10");
  
  for (var i = 1; i < range.getNumRows(); i++) {
   /* 今日タスクがあるか、月・日・年で順を追って判定していく */
   var time = range.getCell(i,1).getValue().toString();
   var splitedTime = time.split(" ");
    if (splitedToday[1] == splitedTime[1]) {
      if (splitedToday[2] == splitedTime[2]) {
        if (splitedToday[3] == splitedTime[3]) {
          this.isTask = true;
          this.tasks.push(sheet.getRange("A" + i + ":C" + i).getValues().toString().split(","));
        }
      }
    }
  }
}

WebHooksのURLは自分のものをコピペし、channelは自分の通知を行いたいチャネル名に変更しましょう。
以上のプログラムを記述したら、「Commnd」+「S」で編集内容を保存しましょう。


f:id:virtual-surfer:20180310000846p:plain

次に、ファイルの実行のために「実行」→「関数を実行」→「postTaskNotification」を選択します。


f:id:virtual-surfer:20180310001302p:plain

初めてのファイル実行の時は、「承認が必要です」という表示がでます。承認してあげましょう。


f:id:virtual-surfer:20180310001427p:plain

「許可を確認」→「詳細」→「xxx(←スプレッドシートの実行ファイル名)に移動」をクリックします。


f:id:virtual-surfer:20180310001619p:plain

アクセス権限を付与するため、「許可」をクリックします。

以上でアクセス権限を付与することができたら、再度スクリプトを実行してみましょう。


f:id:virtual-surfer:20180310001738p:plain

通知先に設定したチャンネルを確認すると、通知が来ているはずです!素晴らしい!
*ちなみに、以下のコードで、動作を平日限定にしているので、平日の場合は通知が送信されません。

/* 平日でなければ処理中断する */
  var currentDate = new Date();
  var weekday = currentDate.getDay();
  if (weekday == 0 || weekday == 6) {
    return;
  }
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  }

祝日でも実行したい時は、「if (weekday == 0 || weekday == 6)」の箇所の「0」か「6」を任意の数字に変更しましょう。(日曜日→0、月曜日→1、...土曜日→6という対応になっているので、土曜日の場合は6を、日曜日の場合は0を他の数字に変更して再度実行してみれば、うまく送信されるはずです。)

さらに、このプログラムを毎回「実行」としなくても済むように、トリガーを設定して自動で処理が走るようにしておきましょう。


f:id:virtual-surfer:20180310002347p:plain

タイマーのようなマークの「現在のプロジェクトのトリガー」をクリックし、画像のように設定していき、「保存」します。これによって、平日の12時~13時の間に、タスクがある場合にはチャンネルに自動的に通知が行われます!!いつもの連絡作業をちょこっと自動化できました!!


プログラムの変数を少し変更したりすれば、特定の条件でのSlack連絡は自動的に行うことができるようになり、作業を自動化することができます!

Google Apps Scriptの偉大さを知った日でした。
作業自動化については、今後も紹介していきますね!


詳解! Google Apps Script完全入門 ~Google Apps & G Suiteの最新プログラミングガイド~
高橋宣成 (著)
秀和システム (2018/1/1)


では!