虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Googleスプレッドシートに書き込まれたらSlackに通知する

こんにちは、最近はサウナにハマってるS.Sです。

今回は、Googleスプレッドシートに書き込みがったあった時に、Google Apps Script (以降、GAS)を使って、Slackに通知する方法をご紹介します。
サンプルで用意しました以下のスプレッドシートを使って説明します。
f:id:toranoana-lab:20200312203605p:plain
上記、スプレッドシートの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に投稿します。
f:id:toranoana-lab:20200311125410p:plain

Step2 スプレッドシートに書き込みがあったセルの値を取得する

スプレッドシートからスクリプト エディタを開きます。
ツール > スクリプト エディタ
f:id:toranoana-lab:20200312203900p:plain

するとGASのエディターが開きますので、ここにスクリプトを書きます。
まずは、アクティブセル(入力されたセル)を特定します。
f:id:toranoana-lab:20200311151717p:plain

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から時計のマークを押して、トリガーの設定を開きます。
f:id:toranoana-lab:20200312202352p:plain
「トリガーを追加」で新規にトリガーを追加します。
f:id:toranoana-lab:20200312202816p:plain
スプレッドシートに変更があった場合に通知したいので、
「イベントのソースを選択」を"スプレッドシート"、「イベントの種類を選択」を"変更"を指定して、トリガーを保存します。
f:id:toranoana-lab:20200312203139p:plain
これで準備が整いましたので、実際にサンプルのタスク管理のスプレッドシートにタスクを追加します。
するとステータスを変更した時に、Slack通知が送られました。
f:id:toranoana-lab:20200312205201p:plain

あとがき

これで、スプレッドシートの新規の書き込みを頻繁に確認しなくても、変更があった場合にSlackで通知してくれるようになるので大変便利です。

P.S

残念ながら、COVID-19の感染被害の防止の為中止となった技術書典ですが、虎の穴ラボでは用意していた同人誌を技術書典 応援祭にて0円にて頒布しております。
ぜひ御覧ください。
techbookfest.org

加えて今回は、有償版の同人誌も作成しております。Go、Kotlin、Rustに関連する内容をまとめた、内容の濃い薄い本になります。
こちらも、ぜひ入手してお楽しみください。
techbookfest.org

本日は、notoも更新されています。ぜひこちらも御覧ください。
note.com


虎の穴ラボではオタクなエンジニアを大募集中です。
ぜひ、リンクから採用フォームに応募してください。
「まず業務について聞いてみたい」という方は、カジュアル面談も実施していますので、こちらもフォームから申込みをお願いします。
虎の穴ラボのエンジニアが、ざっくばらんに業務についての質問から「今季何見ました?」というお話まで何でもお応えします。

WantedlyLAPLASでの採用も行っております)

yumenosora.co.jp

news.toranoana.jp