takeuchi

Google Apps Scriptを使って、スプレッドシートの内容をSlackに通知する

社内で、MTGの司会を当番制にしようということで、スプレッドシートで当番表をこさえたのですが、何かしら通知機能があるといいよなぁということでやってみました。
Google Apps Script(以降、GAS)を使って、当番表の内容をSlackに通知する、のです。

スプレッドシートの画面から、GASはどこで確認できるかというと、「ツール」から「スクリプトエディタ」を選択します。

cap03

そうすると、このような画面が ↓

cap04

※ ここにあるキャプチャの内容で、デモを用意しようと思ったのですが、閲覧権限では再現できず、セキュリティ的な観点で断念…。

スプレッドシート内の値を処理/取得

③の内容をどのように取得しているかというと、GASとJavascriptを使って、次のような記述をしております。

function core_function() {

    // 取り扱いたいスプレッドシートのURL
    var spreadSheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1opMSmVfeaDxvEcbBiBsQvkShF0ZuQV0WakjOHDWVnzk/edit#gid=0');

    // シートを指定 ここでは1ページ目のシートを対象としています。
    var sheet = spreadSheet.getSheets()[0];

    // シート内、記入のある最後の行数を取得
    var lastrow = sheet.getLastRow();

    // 何曜日か判定する
    var week = ['日','月','火','水','木','金','土'];
    var weekday = new Date();
        weekday = week[weekday.getDay()];

    // 名前の列と、日付の列の情報をそれぞれ取得する
    var name_array = sheet.getSheetValues(2, 1, lastrow, 1);
    var date_array = sheet.getSheetValues(2, 2, lastrow, 1);

    // 今日の日付をフォーマット指定して取得する (1)
    var today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");
    var date = new Array();

    // 取得した日付の値の数だけループ処理する
    var date_num = date_array.length;
    for(var i = 0; i < date_num - 1; i++) {

        // 取得した日付の値を、(1)と同様のフォーマットで取得する
        date.push(Utilities.formatDate(new Date(date_array[i]), "Asia/Tokyo", "yyyy/MM/dd"));

        // (1)と一致した値が、配列の中で何番目にあたるか、その番号を習得 (2)
        var num = date.indexOf(today);
    }

    // (2)で取得した番号を、名前の配列に渡して、該当する人の名前を取得する
    var member = name_array[num];

    // 無事、変数memberに人の値が取得できていて、平日だったら真
    var message;

    if(member && weekday != '土' && weekday != '日') {

        message = '@group: 今日の当番は' + member;

    } else{

        message = '今日は休みだよ';

    }

    // 送信したいメッセージを次の関数に渡します。
    // slack(message);

    /*
        デモではSlackとの連携のテストは再現できないので、
        下のSlackに送信する記述に関してはコメントアウトしております。
        代わりに以下のデバッグ用の記述を書いているおかげでデバッグボタンが機能している状態です。
    */

    Logger.log(message);
    Browser.msgBox(Logger.getLog());
}

これで、スプレッドシート内の当番の人の名前を、今日の日付で判定して取得できるわけです。

Slack連携

あとはこの情報をSlackに連携して、お知らせ・通知を流すことになります。関数を分けて記述しておくとわかりやすいかなと思います。

function slack(message) {
    // 各所必要な項目をセットします
    var url        = 'https://slack.com/api/chat.postMessage';
    var token      = 'トークン';
    var channel    = '#チャンネル名';
    var text       = message;
    // お好みのBOT名を指定できます
    var username   = '当番お知らせBOT';
    var parse      = 'full';
    // お好みのアイコン(絵文字)を指定できます
    var icon_emoji = ':sunny:';
    var method     = 'post';

    var payload = {
        'token'      : token,
        'channel'    : channel,
        'text'       : text,
        'username'   : username,
        'parse'      : parse,
        'icon_emoji' : icon_emoji
    };

    var params = {
        'method' : method,
        'payload' : payload
    };

    var response = UrlFetchApp.fetch(url, params);
}

・トークンについてはこちらからご確認ください
https://api.slack.com/web

cap02

※ 権限によってはトークン発行できない場合がございますので、その際には管理者に相談しましょう。

トリガーの設定

ここまで来たら設定はあと少しです。記述したプログラムを、いつ処理を走らせるのかを設定しましょう。
時計マークのボタンを押して、関数を選択して、いつ処理したいのかをポチポチ選択すれば完了です。

cap05

できた!

cap06

設定した以下の内容が表示されているのがわかるかと思います。

    // メッセージ
    var text       = message;
    // 投稿者名
    var username   = '当番お知らせBOT';
    // アイコン
    var icon_emoji = ':sunny:';

まとめ

これで当番の人に今日よろしくねとSlackで通知ができました!その他、単純な追記で次回の人への予告もできます。

    // 単純にnumを +1してやると、次の人の名前が取得できる
    var next_member = name_array[num + 1];
    var message = '@group: 今日の当番は' + member + '次回は' + next_member + 'さん';

その他、いろいろと便利に使えそうなので、下記を参考にぜひお試し下さい。

参考

・GAS 公式リファレンスはこちら
https://developers.google.com/apps-script/reference/

・Qiita/Advent Calendar Google Apps Script
http://qiita.com/advent-calendar/2015/gas

お問い合わせはこちら