GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

2021年3月13日
ツール
Pocket

1日ひとりが担当する掃除当番、これを毎日順番にSlackに通知したいとか思うことないでしょうか。

毎日担当が変わるけど自分の順番を確認するのは忘れがちだしやらなくなってしまう原因になります。

そこで、担当順を書いたスプレッドシートを作成して、GASを使ってSlackに通知する仕組みを実装したいと思います。

前提条件

  • Google スプレッドシートを利用する。
  • 通知処理は、GAS(Google Apps Script)で実装する。
  • Slackへの通知は、プロジェクトキー:1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bqのライブラリを利用して行う。
  • GASのトリガー設定が1時間の範囲内での設定の為、毎朝8時ジャストに通知ということはできません。8時〜9時の間のどこかで通知になります。

スプレッドシート、GASの作成

以下のように、担当者名を記述したシートをGoogle スプレッドシートで作成します。

シート名は、担当者にしておきます。ファイル名(担当者お知らせシート)もつけておきます。

A列の利用していない部分にはデータを入力しないようにしてください。(最終行の判断に利用しているため)

最初の通知を担当Aにしたい場合は、担当Dの前回フラグの列に○をつけておきます。スキップしたい人がいる場合は、スキップの列に○をつけておきます。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

この状態で、順番にA=>B=>C=>D=>A=>B・・・・になるようにプログラムを実装します。

スプレッドシートのツール => スクリプトエディタを起動します。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法
GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

既にあるmyFunctionを消して以下のコードを貼り付けます。

function myFunction() {
  // 対象のシートを取得します
  const sheet = getTargetSheet();
  if(!sheet) {
    Logger.log('sheet not found');
    return false;
  }

  // A列の最終行を取得します
  const columnVals = sheet.getRange('A:A').getValues();
  const lastRow = columnVals.filter(String).length - 1;

  // シートのヘッダ部分を除くデータを取得します(2行目の1列目から最終行の4列目までを取得)
  // スプレッドシートの処理でループ内で、getValue等すると重くなるため
  const data = sheet.getRange(2, 1, lastRow, 4).getValues();
  let row = 0;
  let prev = false;

  for(let i = 0; i < data.length; i++) {
    // 前回フラグがあり、スキップがない場合は、本日の担当者とする
    if(prev && data[i][3] !== "○") {
      row = i;
      break;
    }
    // 前回フラグが入っている場合
    if(data[i][2] == "○") {
      prev = true;
    }
    // 最終行までいったら先頭に戻す
    if(i == lastRow - 1 && prev) {
      i = -1;
    }
  }

  // 前回フラグをクリアします
  sheet.getRange(2, 3, lastRow, 1).setValue('');
  // フラグをセットする
  sheet.getRange(row+2, 3).setValue('○');

}

function getTargetSheet() {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName('担当者');
  return sheet;
}

この状態で、プログラムを実行しようとすると以下のような権限の確認が出るのでOKにして進めます。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法
GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法
GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

プログラムを実行するたびに、前回フラグの”○”が移動していくのが確認できます。

あとは、Slackの通知に必要な部分を実装ていきます。

Slack通知の実装

まずは、Slack通知用のライブラリを読み込みます。

左ナビのライブラリの+ボタンをクリックするとポップアップが表示されます。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

以下のコードを入力して検索ボタンをクリックします。

1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq

バージョン6の状態で出るので、最新のバージョンに切り替えて、追加ボタンをクリックします。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

以下の関数を追加します。

“ここには、・・・”の部分は、それぞれの環境で取得したもの(トークン、チャンネルID)を入れてください。

Slackのトークンについては、レガシーなものではなく、必要な機能にしかアクセス権を与えないトークンを使うようにしてください。

ここでは、トークンの取得、チャンネルIDについては割愛します。

function sendSlack(slackID) {
  let slackApp = SlackApp.create('ここには、Slackで取得したトークンを設定');
  let channelId = 'ここには、slackのチャンネルIDを設定';
  let message = slackID + '\n本日掃除当番です。';
  slackApp.postMessage(channelId, message);
}

最初に書いたコードの最下部に、上記の関数を呼ぶ処理を追加します。

  // 前回フラグをクリアします
  sheet.getRange(2, 3, lastRow, 1).setValue('');
  // フラグをセットする
  sheet.getRange(row+2, 3).setValue('○');
  // Slackに通知する
  sendSlack(data[row][1]);

シートのslackIDの部分には、各担当者のslackのIDを以下の形式で、記入するようにしてください。

<@UG12345678>

あとは、実行を定期的に行うように設定します。

トリガーの設定

左ナビからトリガーをクリックします。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

トリガーを追加をクリックします。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

イベントのソースを選択を時間主導型にし、日付ベースのタイマー、時間を指定して保存します。

GAS(Google Apps Script)を使って掃除当番を順番でSlackに通知する方法

以上で、指定したチャンネル内で、担当者宛に、通知がされるようになります。

ではでは。