Help us understand the problem. What is going on with this article?

Google Spreadsheetの変更内容通知をSlackに送る

More than 1 year has passed since last update.

Google Spreadsheetでタスク管理を行う場合、その更新通知をSlackに送れると便利。
Google App Scriptを利用してスクリプトを書いてみる。

目次

  1. Slackチームのトークンを取得
  2. Google Spreadsheetで更新されたセルの値を取得する
  3. 更新されたセルの値をSlackに送る
  4. おまけ:隣のセルなどを取得する

1. Slackチームのトークンを取得

Slackアプリ・トークンが既にある場合

ブラウザでSlackにログインした状態で、以下のURLにアクセス。
Tokens for Your Workspaceにトークンが表示されている。
https://api.slack.com/apps/{アプリID}/oauth?

Slackアプリ・トークンがまだ作成されていない場合

  1. アプリの作成 a. https://api.slack.com/apps にアクセスし、Create New Appのボタンから適当にアプリを作成 b. 左側のメニューにあるOAuth & Permissionsをクリック c. (必要があれば) Scopesの項目で、Select Permission Scopesにてアプリにもたせたい適当な権限を選択する
  2. トークンの生成 a. Install Your App to Workspaceのボタンをクリック b. Tokens for Your Workspace の項目にOAuth Access Tokenが表示される。

2. Google Spreadsheetで更新されたセルの値を取得する

関数の具体例

Spreadsheetの「ツール」→「スクリプトエディタ」を開き、以下のような関数を作る。

function showStatus(){ 
  var mySheet = SpreadsheetApp.getActiveSheet(); //シートの取得
  var myCell = mySheet.getActiveCell(); //アクティブなセルの取得
  if(myCell.getColumn()==1){ 
    var text = myCell.getValue(); //アクティブなセルの値を取得 
}

条件文にある数字の部分には、更新したとき通知してほしい列番号(この場合A列)を入れる。
参考:http://uxmilk.jp/25841

トリガーの設定

スクリプトエディタの「編集」から「現在のプロジェクトのエディタ」を開き、先程作ったshowStatusという関数にトリガーを設定する。
このプロジェクトでは変更内容通知を送りたいので、トリガーは「スプレッドシートから」「値の変更」。

なお、このとき、このプロジェクトはGoogleに認められていませんというようなアラートが出る(2017年8月22日現在)。
いかにも危険そうな真っ赤なアラートだが、実際は「あなたのGoogleアカウントとこのプロジェクトの連携を許可してください」のような意味。冷静に「詳細」という小さいリンクをクリックし、プロジェクトを自分のGoogleアカウントで承認する。

3. 更新されたセルの値をSlackに送る

Slack通知送信用関数の記述

以下の記事で詳細な関数の例が示されている。「Slack連携」という見出しを参照。
https://www.tam-tam.co.jp/tipsnote/javascript/post8499.html

この記事通りに従ってもできるのだろうが、なんだか分かりづらい部分もあったので、筆者は最初に作ったshowStatusという関数内にSlack通知送信用の関数を記述して、textという変数を条件文の中に書いた。
また、Slack通知更新用の関数のトリガーはスクリプトエディタで指定せず、この関数は条件文の中で実行するようにした。

筆者のテスト用スクリプト(省略版)

スプシのURL取得なども行っている。
あくまで例なので、通知文は文になっていない。

function showStatus(){
  var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得
  var myCell = mySheet.getActiveCell(); //アクティブなセルの取得
  var ss = SpreadsheetApp.getActiveSpreadsheet(); //スプシを取得
  var ss_url = ss.getUrl(); //スプシのURLを取得
  if(myCell.getColumn()==4){ //数字の部分には列番号(この場合D列)
    var message = myCell.getValue() + ss_url;
    slackPost(message);
  } 
}
function slackPost(message){
  var url        = 'https://slack.com/api/chat.postMessage';
  var token      = '取得したトークン';
  var channel    = 'Slackのチャネル or DM(#や@を忘れずに)';
  var username   = 'タスク更新通知BOT';
  var parse      = 'full';
  var icon_emoji = 'お好きな絵文字を';
  var method     = 'post'; 
  var payload = {
    'token'      : token,
    'channel'    : channel,
    'text'       : message,
    'username'   : username,
    'parse'      : parse,
    'icon_emoji' : icon_emoji
  };
  var params = {
    'method' : method,
    'payload' : payload
  };
  var response = UrlFetchApp.fetch(url, params);
}

※二度目になりますが、以下の記事にとても助けられています。ありがとうございます。
https://www.tam-tam.co.jp/tipsnote/javascript/post8499.html

4. おまけ:隣のセルの値などを取得する

隣接するセルの値を取得する

myCell.offset(0, 1).getValue(); //アクティブセルの一つ右
myCell.offset(0, -1).getValue(); //アクティブセルの一つ左
myCell.offset(1, 0).getValue(); //アクティブセルの一つ下
myCell.offset(-1, 0).getValue(); //アクティブセルの一つ上

参考:http://www.relief.jp/docs/google-spreadsheet-gas-offset.html
※myCellはテスト用スクリプトで使用した変数名

このようにして、上述のテスト用スクリプトの条件文を色々書き換えると、
【タスク「cssの修正」の開始予定日「8月22日」が追加されました】
のような通知も可能になる。

筆者のテスト用スクリプト(完成版)

※完成版ですが、一部省略しています。コメントアウト参照。
A列にタスクの開始予定日、B列にタスクの締切、C列にタスク名を書くことを想定している。

function showStatus(){
  var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得
  var myCell = mySheet.getActiveCell(); //アクティブセルを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet(); //スプシ(≠シート)を取得
  var ss_url = ss.getUrl();
  if(myCell.getColumn()==1){ //数字の部分には列番号(この場合A列)
    var text = 'タスク「' + myCell.offset(0, 2).getValue() + '」の開始予定日「' + myCell.getValue() + '」が追加されました' + ss_url;
    slackPost();
  } 
  if(myCell.getColumn()==2){ //数字の部分には列番号(この場合B列)
    var text = 'タスク「' + myCell.offset(0, 1).getValue() + '」の締切「' + myCell.getValue() + '」が追加されました' + ss_url;
    slackPost();
  }
  if(myCell.getColumn()==3){ //数字の部分には列番号(この場合C列)
    var text       = 'タスク「' + myCell.getValue() + '」が追加されました' + ss_url;
    slackPost();
  }
}
function slackPost(){
   //(省略版)と同様のため省略
 }

完了。

スクリプト動作確認済みですが、もし間違いがありましたら教示ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした