こんにちは、最近はサウナにハマってるS.Sです。
今回は、Googleスプレッドシートに書き込みがったあった時に、Google Apps Script (以降、GAS)を使って、Slackに通知する方法をご紹介します。
サンプルで用意しました以下のスプレッドシートを使って説明します。
上記、スプレッドシートの4列目(ステータス)に「未対応」が入力された場合に、追加されたタスクをSlack通知する仕組みを作成します。
目次
Step1 準備
Step2 スプレッドシートに書き込みがあったセルの値を取得する
Step3 2で取得した値を判断してSlackに通知する
Step4 書き込みがあった場合にスクリプトを発動させるためのトリガーを設定
Step1 準備
Slackへの投稿を行うには、Webhookの設定が必要です。以下のURLから設定が出来ます。
https://my.slack.com/services/new/incoming-webhook/
すると以下のようにWebhook URLが発行されます。このWebhook URLを使ってSlackに投稿します。
Step2 スプレッドシートに書き込みがあったセルの値を取得する
スプレッドシートからスクリプト エディタを開きます。
ツール > スクリプト エディタ
するとGASのエディターが開きますので、ここにスクリプトを書きます。
まずは、アクティブセル(入力されたセル)を特定します。
function myFunction() { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート var activeSheet = activeSpreadsheet.getActiveSheet(); // アクティブシート if(activeSheet.getName() != "タスク管理"){ return; } var activeCell = activeSheet.getActiveCell(); // アクティブセル }
getActiveSpreadsheet() にてスプレッドシートが取得出来ます。
次に、getActiveSheet() にて入力されたシートを取得して、getActiveCell()にて入力されたセルが特定出来ます。
また入力されたシートが「タスク管理」シート以外の場合に後続の処理がされないよう return; で終了します。
Step3 2で取得した値を判断してSlackに通知する
アクティブセルが取得出来ましたら今度は、セルの列数と入力値を見て、ステータスが「未処理」のタスクが追加された場合に、Slackに通知します。
function myFunction() { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート var activeSheet = activeSpreadsheet.getActiveSheet(); // アクティブシート if(activeSheet.getName() != "タスク管理"){ return; } var activeCell = activeSheet.getActiveCell(); // アクティブセル if(activeCell.getColumn() == 4 && activeCell.getValues() == "未対応"){ var newInputRow = activeCell.getRow(); var taskNo = activeSheet.getRange(activeCell.getRow(), 1).getValues(); // 送信するSlackのテキスト var slackText = "「タスク管理」に No." + taskNo + " のタスクが追加されました\n" + "https://docs.google.com/spreadsheets/d/*******************************/edit#gid=0&range=C" + newInputRow; sendSlack(slackText); } }
getColumn() でセルの列数とgetValues() でセルの入力値が取得出来ます。
今回は、4列目(ステータス)に"未対応"が入力されたことをSlack通知する条件とします。
次に、追加されたタスクのNo(1列目の値)を取得するために、getRow() で行数を取得します。
そして、getRange([行数], [列数]).getValues()で、特定の位置のセルの値が取得します。
これにより、activeSheet.getRange(activeCell.getRow(), 1).getValues() で入力された行数の1列目の値(今回の場合はタスクNo)が取得出来ます。
最後に、slackTextでSlackに通知するテキストを作成します。内容は、上記で取得した追加されたタスクNoとスプレッドシートのURLを載せています。
スプレッドシートのURLに #gid=0&range=[セルの位置] をパラメータに付けると、指定のセルの位置にリンク先を指定することが出来ます。
今回は、C列(タスク内容)をリンク先とします。
次は、Slackに通知する処理を作成します。
function sendSlack(slackText){ // Step1で取得したWebhook URLを設定 var webHookUrl = "https://hooks.slack.com/services/********/**********/**************"; var jsonData = { "channel": "#general", // 通知したいチャンネル 'icon_url' : "https://yumenosora.co.jp/wp-content/uploads/2019/07/40_HELP-320x320.png", "text" : slackText, "link_names" : 1, "username" : "HELPを求めるメイドちゃん" }; var payload = JSON.stringify(jsonData); var options = { "method" : "post", "contentType" : "application/json", "payload" : payload, }; // リクエスト UrlFetchApp.fetch(webHookUrl, options); }
Slack通知するための情報(チャンネルやアイコン、送信するテキスト)をJSON形式で作成しまして、JSON.stringify() でSlack送信用のリクエストパラメータを生成します。
それを UrlFetchApp.fetch() を使って、Step1にて取得したWebhook URL宛にAPIのリクエストを送信します。これにより、Slack通知が完了します。
最後に、作成したスクリプトを実行させるためのトリガーを設定します。
Step4 書き込みがあった場合にイベントを発動させるためのトリガーを設定
GASから時計のマークを押して、トリガーの設定を開きます。
「トリガーを追加」で新規にトリガーを追加します。
スプレッドシートに変更があった場合に通知したいので、
「イベントのソースを選択」を"スプレッドシート"、「イベントの種類を選択」を"変更"を指定して、トリガーを保存します。
これで準備が整いましたので、実際にサンプルのタスク管理のスプレッドシートにタスクを追加します。
するとステータスを変更した時に、Slack通知が送られました。
あとがき
これで、スプレッドシートの新規の書き込みを頻繁に確認しなくても、変更があった場合にSlackで通知してくれるようになるので大変便利です。
P.S
残念ながら、COVID-19の感染被害の防止の為中止となった技術書典ですが、虎の穴ラボでは用意していた同人誌を技術書典 応援祭にて0円にて頒布しております。
ぜひ御覧ください。
techbookfest.org
加えて今回は、有償版の同人誌も作成しております。Go、Kotlin、Rustに関連する内容をまとめた、内容の濃い薄い本になります。
こちらも、ぜひ入手してお楽しみください。
techbookfest.org
本日は、notoも更新されています。ぜひこちらも御覧ください。
note.com
虎の穴ラボではオタクなエンジニアを大募集中です。
ぜひ、リンクから採用フォームに応募してください。
「まず業務について聞いてみたい」という方は、カジュアル面談も実施していますので、こちらもフォームから申込みをお願いします。
虎の穴ラボのエンジニアが、ざっくばらんに業務についての質問から「今季何見ました?」というお話まで何でもお応えします。