実現したいこと
Googleスプレッドシート上で該当列の値が指定する値と一致する場合、slackに通知を送る。
具体的には、該当する列が「Wチェック完了」になったら、指定するslackチャンネルに以下メッセージが届くようにする。
前提
通知を実装するにあたり使用しているツールは以下。
・Google App Script
・Slack(token ID)
発生している問題
成功している状態
該当列のセルに対して[データの入力規制]>[リストを直接指定]>「Wチェック完了」を入力した上で、
自ら直接、プルダウンから「Wチェック完了」を選択すると通知が届く。
失敗している状態
該当列のセルに対してIF関数を入力し、ある条件を満たしたら「Wチェック完了」となるように指定した上で、
ある条件を満たし該当列が「Wチェック完了」になっても通知が届かない。
考えられる問題解決のヒント
直接セルの値を変更するか、自動で(今回はIF関数)セルの値が変更するかの違いにヒントがありそう。
該当のGoogleスプレッドシート
該当のソースコード
function alertDataCheckFinish()
{
var colOffset = 0;
var dataStartCol = 1;
var companyNameCol = 1;
var blandNameCol = 2;
var keyCol = 12;
var dataColNum = 12;
var range = SpreadsheetApp.getActiveRange();
var rowidx = range.getRow();
var colidx = range.getColumn();
Logger.log('checkFinish');
if(colidx != keyCol){ return ; }
var sheet = SpreadsheetApp.getActiveSheet();
var aLine = sheet.getRange(rowidx, dataStartCol, 1, dataColNum);
if(!aLine){
return;
}
var status = aLine.getCell(1,keyCol-colOffset).getValue();
var companyName = aLine.getCell(1, companyNameCol-colOffset).getValue();
if(!companyName){
return;
}
var blandName = aLine.getCell(1, blandNameCol-colOffset).getValue();
if(!blandName){
return;
}
if( status == "Wチェック完了" ){
var message = '';
message += '<@アカウント名> *';
message += companyName;
message += '(';
message += blandName;
message += ')';
message += '* のWチェックが完了したため、Excelへのデータ移行をお願いします。';
}
sendDataCheckFinish(message, "通知botくん", "test");
}
function testDataCheckFinish()
{
sendDataCheckFinish("通知テストくん", "回答");
}
function sendDataCheckFinish(message, username, postChannel)
{
var url = 'https://slack.com/api/chat.postMessage';
var token = 'tokenID';
var channel = '#チャット名';
var text = message;
var username = 'データExcel移行依頼BOT';
var parse = 'full';
var icon_emoji = ':smile:';
var method = 'post';
var payload =
{
"token": token,
"channel" : channel,
"username" : username,
"text" : message,
"username" : username,
"parse" : parse,
"icon_emoji" : icon_emoji
};
var params = {
'method' : method,
'payload' : payload
};
UrlFetchApp.fetch(url, params);
}
試したこと
スクリプトエディタ上で、トリガー(イベント)を
「スプレッドシートから」・「編集時」
から
「スプレッドシートから」・「値の変更」
と変更したり、
こういったケースが他にもないかネットで調べましたが解決に至りませんでした。
また、上述した「考えられる問題解決のヒント」が怪しいですが、自分で解決できませんでした。
いちいち直接入力・選択しなくても、ある条件を満たしセルが自動で「Wチェック完了」になったら通知、という流れを実現したいです。
解決法をわかる方がいらっしゃったら、是非回答投稿をお願いします。
(自分は非エンジニアでして、上述コードも他のサイトを参考にしたりカスタマイズなどしたりしています)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
変更されてすぐ送られてくる必要がないのであれば、という前提で記します。
私は、似たようなものを作成したことがあり、そのときには、上に示して頂いた画像でいうと
(1)L列の右M列に「送信状況」みたいなカラムを作成
(2)L列「Wチェック完了」かつM列「空」の行を見つけたらSlack送信関数を作成
(3)2の関数を時間をトリガーに起動
みたいなことをしていました。
私が初心者で知識がないことにも由来するのですが、
なぜ、こんなまどろっこしいやり方をしたかというとGoogle Apps Scriptの編集のトリガーが
・関数による値の変更
・スクリプトによる値の変更
に対しては反応しなかったためです。
(なにかしら方法があるのかもしれませんが)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
イベントなのですが、スクリプトによる値の変更はイベントを発生させないというのは仕様に書いてあります。シート関数でどうかは明記されていませんが、おそらく動かないのでしょう。
ただ、IFで判定がきくということは、IFで判定するセルは手で書いているはずなので、
- 値の変更イベントとしてどのような編集でも受け付けられるトリガ(onEdit(e))を置く
- onEditで下記のいずれかの方法で完了を判定する
- IFをやめて、IF相当の判定をプログラムでやる
- IFを残して、編集したセルの番地(e.rangeを利用)から、行?を特定してその行のIFがあるセルの値が"完了"かどうか見に行く
- 完了ならslackに送る
で、いけるかなと。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
すでに前の方が答えられていますが、関数の処理による表示されている値の変更はトリガーの
対象になりません。
・方法1
s.maedaさんが提案されているように時間主導にして細かく刻んでgasを起動をすれば疑似的に再現が可能です。
「L列が「Wチェック完了」だったら通知送信、そうでないならなにもしない」という関数を書いて時間主導で1分おきに起動すれば、少なくとも条件を満たしてから1分以内には通知をいかせることができます。
・方法2
H列、K列の「完了」エリアを「値の変更」トリガーの対象にして、どこかが完了に変更されるたびに「Wチェック完了しているかどうか」の判定を行い、「wチェック完了」であれば通知を送る。ということもできます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる