GASでSlack通知を自動化してみた③

Excelコース担当の松尾です。
今回はGASでSlack通知を自動化してみたの続きからご紹介します。

過去のブログ記事は以下の通りです。
GASでSlack通知を自動化してみた①
GASでSlack通知を自動化してみた②

そもそもGASとは何か?を知りたい方はGASを使って自動化しようをご一読いただければと思います。

実現したいこと

前回までで特定のセルに入力されている値を取得し、Slackのメッセージとして投稿できるようになりました。
今回は値を取得するセルの位置を日付に応じて動的に取得するようにします。

上記の実現したいことを以下の手順で取り組んでいきます。

  1. 当日の日付を取得し、その日付から月の数字だけを取り出す
  2. 月の数字と一致するセルの列数を取得
  3. 3で取得した列数を元に担当者①~③のセルの値を取得

プログラミング

当日の日付を取得し、その日付から月の数字だけを取り出す

当日の日付を取得するために以下のコードを記述します。

const day = new Date(); // 当日の日付を取得

次に月の数字だけを取り出します。以下のコードを記述します。
なお、getMonth()で取得できるのは当月の数字より1つ小さい数字なので、day.getMonth() + 1とすることで当月の数字になるようにしています。

また、今回スプレッドシートに記載されている”〇月”という表記にしたいので、取り出した数字の後ろに”月”がくっつくようにしています。
こうすることでthisMonthには1月なら「1月」2月なら「2月」…というような文字列が代入されるようになります。

const thisMonth = String(day.getMonth() + 1) + "月";

月の数字と一致するセルの列数を取得

次に、 thisMonthの値と一致するセルの列数を取得します。
セルの列数を代入する変数getRowを宣言します。

let getRow = 0; // セルの列数を代入する変数を宣言

次に月の数字と一致するセルの列数を取得します。

for(let i=2; i<=13; i++) {
  let rawMonth = sheet.getRange(1,i,1,1).getValues();
  let month = rawMonth[0,0][0]
  if(thisMonth == month) {
    getRow = sheet.getRange(1,i,1,1).getColumn();
  }
}

上記のコードを解説します。

for(let i=2; i<=13; i++) でiが2から13まで1回ずつ繰り返します。
(これは一致しているかどうか確認するセルの列数が2列から13列なのでiを2から13までひとつずつ繰り返すようにしています。)

let rawMonth = sheet.getRange(1,i,1,1).getValues();で緑の枠で囲まれた値を取得します。
for文で繰り返し処理を行っているので、1が4のときは sheet.getRange(1,4,1,1).getValues(); となり1行目の4列目の1つのセル、つまりD1セルに入力されている”3月”という値を取得することになります。

なお、 rawMonthでは2次元配列として取得されてしまうので、値のみを取り出すためにlet month = rawMonth[0,0][0]とします。

最後に、thisMonthの値をmonth を比較し、一致した場合のセルの列数をgetRowに代入しています。

取得した列数を元に担当者①~③のセルの値を取得

担当者の値を取り出すコードは現在以下の通り記載しています。

const managers = sheet.getRange("B2:B4").getValues();  // B2セルからB4セルの情報を取得

このコードを以下のように書き換えます。

const managers = sheet.getRange(2, getRow, 3, 1).getValues(); // 取得した列を元に担当者の情報を取得

これで月ごとに取得するセルの列数が変わるようになりました。

メンション通知

最後にSlackに通知されるメッセージの担当者名の部分をメンションの形式に変更します。
Slackにメンション通知を行う際には個人IDが必要になるので、個人IDを格納するオブジェクトを宣言します。

// 担当者の個人ID
 const members = {
  "佐藤" : "<個人ID>",
  "鈴木" : "<個人ID>",
  "高橋" : "<個人ID>",
  "田中": "<個人ID>",
  "山本": "<個人ID>"
}

Slackの個人IDは画像のようにSlackのプロフィールから取得できます。

担当者の値はmanegers変数に2次元配列として格納されています。
(現在managers[0][0]、managers[1][0]、managers[2][0]で担当者の名前を出力しています。)

したがって managers[0][0]、managers[1][0]、managers[2][0] の値を元に個人IDを取得します。

let mentions = []; // 担当者の個人IDを格納する配列を宣言
  for(let i=0; i<3; i++){ // iが0から2までの間繰り返す
    mentions.push(members[String(managers[0,i])]);
  }

mentions.push(members[String(managers[0,i])]);の部分を解説します。

managers[0,i]の部分でmanagers[0][0]、managers[1][0]、managers[2][0] を順番に指定しています。

members[String(managers[0,i])]でmanagers[0][0]、managers[1][0]、managers[2][0] それぞれの個人IDを取得しています。
mentions.pushで取得した個人IDを配列に追加しています。

最後に現在記述しているメッセージの以下の部分を書き換えます。

const message  = "今月の担当者は" + managers[0][0] + "さん、" + managers[1][0] +  "さん、" + managers[2][0] +  "さんです。よろしくお願いいたします!"

書き換え後

const message  = "今月の担当者は" + mentions[0] + "さん、" + mentions[1] +  "さん、" + mentions[2] +  "さんです。よろしくお願いいたします!"

以上でメンション通知ができるようになりました。

投稿するタイミング

メッセージを定期的に投稿したい場合は、トリガーをクリックします。

右下の「トリガーを追加」をクリックします。

イベントのトリガーを「時間主導型」にすると、毎月1日に投稿されるというような自動化が可能になります。

これで毎月決まったタイミング担当者に通知が飛ぶように仕組化することができました!
今後もGASを活用して面倒な作業を自動化していきます!

こちらの内容で気になる点などがあればわいわい会にてお気軽のご質問ください!