質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

4664閲覧

スプレッドシート内の特定のシートの最終行が編集された際に内容をslackに通知する方法について

bananaanya

総合スコア13

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2019/02/14 02:51

編集2019/02/18 09:36

前提・実現したいこと

Googleフォームの入力内容を反映しているスプレッドシートになります。

シートが「案件一覧」「担当案件数」「レポート」の3つがあり、
そのうちの「案件一覧」のA列の最終行が更新されたときのみslack通知をしたいです。
slack通知する際、シート内の内容も一緒に通知したいと考えています。

発生している問題・エラーメッセージ

slackにpostされません。。。

該当のソースコード

function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var Ash = ss.getActiveSheet(); var last_row = ss.getLastRow(); //スプレッドシートにデータが入力されている箇所の、最終行の数値を取得 var myCell = ss.getActiveCell(); //アクティブセルを取得 if(Ash.getSheetName()=='案件一覧' && myCell.getColumn()==1 && myCell.getRow()>=last_row){ function sendtoslack() { var payload = { 'username' : '自動通知Bot', 'text' : myCell.offset(0, 4).getValue() + '\n```' + '【' + myCell.offset(0, 12).getValue() + '】' + myCell.offset(0, 6).getValue() + '/' + myCell.offset(0, 8).getValue() + '```' + '\n上記ご依頼ありがとうございます。' + '\n本件、' + myCell.getValue() + '(' + myCell.offset(0, 1).getValue() + ')が担当いたします。 \nよろしくお願いいたします。' , 'channel' : '#test', 'icon_emoji': ':good:', 'link_names': 1 } var options = { 'method':'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload), } var url = 'https://hooks.slack.com/services/〇〇〇'; //投稿するスラックのURL UrlFetchApp.fetch(url, options); } } }

試したこと

下記のように、はじめにシート名で特定し、
if条件でA列の最終行の指定をするとすべてのシートで作用するようになりました。。
(最終行関係なくA列に編集を加えるとslackにpostされてしまいます。)

var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName("案件一覧"); var last_row = sh.getLastRow(); //スプレッドシートにデータが入力されている箇所の、最終行の数値を取得 var myCell = sh.getActiveCell(); //アクティブセルを取得 if(myCell.getColumn()==1 && myCell.getRow()>=last_row){

補足情報(FW/ツールのバージョンなど)

GAS初心者で、いろいろしらべているのですが解決できずです。
どうぞお力添えのほど宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

根本的に見直したほうがいいですが、きれいなコードより動くコード、なので

  • 特定のシートのみにする

javascript

1var ss = SpreadsheetApp.getActiveSpreadsheet(); 2var sh = ss.getSheetByName("案件一覧"); 3var last_row = sh.getLastRow(); //スプレッドシートにデータが入力されている箇所の、最終行の数値を取得 4var myCell = sh.getActiveCell(); //アクティブセルを取得 5 6var currentSheetName = SpreadsheetApp.getActiveSheet().getName(); 7if( currentSheetName != "案件一覧" ) { return; } //これ。シート名が違ったら処理中断
  • 最終行

javascript

1if(myCell.getColumn()==1 && myCell.getRow()==last_row){

後ろの比較は>=ではなく==では?


最新のコード欄

javascript

1function onEdit(e) { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sh = ss.getSheetByName("案件一覧"); 4 var last_row = sh.getLastRow(); //スプレッドシートにデータが入力されている箇所の、最終行の数値を取得 5 var myCell = sh.getActiveCell(); //アクティブセルを取得 6 7 var currentSheetName = SpreadsheetApp.getActiveSheet().getName(); 8 if( currentSheetName != "案件一覧" ) { return; } //これ。シート名が違ったら処理中断 9 10 if(myCell.getColumn()==1 && myCell.getRow()==last_row){ 11 var payload = { 12 'username' : 'slackBot', 13 'text' : myCell.offset(0, 4).getValue() + '\n```' + '【' + myCell.offset(0, 12).getValue() + '】' + myCell.offset(0, 6).getValue() + '/' + myCell.offset(0, 8).getValue() + '```' + '\n上記ご依頼ありがとうございます。' + '\n本件、' + myCell.getValue() + '(' + myCell.offset(0, 1).getValue() + ')が担当いたします。 \nよろしくお願いいたします。' , 14 'channel' : '#test', 15 'icon_emoji': ':good:', 16 'link_names': 1 17 } 18 var options = { 19 'method':'post', 20 'contentType': 'application/json', 21 'payload': JSON.stringify(payload), 22 } 23 var url = 'https://hooks.slack.com/services/xxxx'; //投稿するスラックのURL 24 UrlFetchApp.fetch(url, options); 25 } 26}

こんな感じですかね

  • q174346_onEditっていうのをトリガー登録します
  • __test_ではじまる2つは「関数実行」からテスト可能

javascript

1function __test_q174346_onEdit() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const e = { 'range': sheet.getActiveCell(), 'value': sheet.getActiveCell().getValue()}; 4 q174346_onEdit(e); 5} 6function q174346_onEdit(e) { 7 const editingSheetName = e.range.getSheet().getName(); 8 switch(editingSheetName) { 9 case "案件一覧": 10 CaseListEditing(e); 11 return; 12 default: 13 return; 14 } 15} 16function CaseListEditing(e) { 17 const col = e.range.getColumn(); 18 switch(col) { 19 case 1: //A列 20 CaseListEditingRowA(e); 21 return; 22 default: 23 return; 24 } 25} 26function CaseListEditingRowA(e) { 27 const row = e.range.getRow(); 28 const lastRow = e.range.getSheet().getLastRow(); 29 if(row != lastRow) { return; } //最終行以外無視 30 const param1 = e.range.offset(0,4).getValue(); 31 const param2 = e.range.offset(0,12).getValue(); 32 const param3 = e.range.offset(0,6).getValue(); 33 const param4 = e.range.offset(0,8).getValue(); 34 const param5 = e.value; 35 const param6 = e.range.offset(0,1).getValue(); 36 const message = param1 + '\n```' + '【' + param2 + '】' + param3 + '/' + param4 + '```\n上記ご依頼ありがとうございます。\n本件、' + param5 + '(' + param6 + ')が担当いたします。 \nよろしくお願いいたします。'; 37 sendToSlack(message); 38} 39function __test_sendToSlack() { 40 sendToSlack("関数実行にてテスト"); 41} 42function sendToSlack(message) { 43 message = message || "test"; 44 const incomingHook = ''; //投稿するスラックのURL 45 const payload = { 46 'username' : '自動通知Bot', 47 'text' : message, 48 'channel' : '#test', 49 'icon_emoji': ':good:', 50 'link_names': 1 51 } 52 var options = { 53 'method':'post', 54 'contentType': 'application/json', 55 'payload': JSON.stringify(payload), 56 } 57 return UrlFetchApp.fetch(incomingHook, options); 58}

投稿2019/02/14 03:02

編集2019/02/14 07:57
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bananaanya

2019/02/14 03:11 編集

早速ご回答ありがとうございます。>< 修正してみましたが、post されません。 function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName("案件一覧"); var last_row = sh.getLastRow(); //スプレッドシートにデータが入力されている箇所の、最終行の数値を取得 var myCell = sh.getActiveCell(); //アクティブセルを取得 var currentSheetName = SpreadsheetApp.getActiveSheet().getName(); if( currentSheetName != "案件一覧" ) { return; } //これ。シート名が違ったら処理中断 if(myCell.getColumn()==1 && myCell.getRow()==last_row){ function sendtoslack() { var payload = { 'username' : 'slackBot', 'text' : myCell.offset(0, 4).getValue() + '\n```' + '【' + myCell.offset(0, 12).getValue() + '】' + myCell.offset(0, 6).getValue() + '/' + myCell.offset(0, 8).getValue() + '```' + '\n上記ご依頼ありがとうございます。' + '\n本件、' + myCell.getValue() + '(' + myCell.offset(0, 1).getValue() + ')が担当いたします。 \nよろしくお願いいたします。' , 'channel' : '#test', 'icon_emoji': ':good:', 'link_names': 1 } var options = { 'method':'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload), } var url = 'https://hooks.slack.com/services/xxxx'; //投稿するスラックのURL UrlFetchApp.fetch(url, options); } } } やはり根本から見直すべきですかね・・・
papinianus

2019/02/14 03:23 編集

前提として、このコードで送信されることは全くないはずです。 修正のどこかの段階で、動かなくなっていたはずです。途中からsendtoslack部分にfunctionを付けたのでなければ、どこかに`sendtoslack();`という一行が存在していたはず。もしfunction sendtoslackが後付けならその次点で送信は行われなくなっていたと考えられます。 送信できるであろうところまでコードを修正して、追記しています。
bananaanya

2019/02/14 03:44

>途中からsendtoslack部分にfunctionを付けたのでなければ、どこかに`sendtoslack();`という一行が存在していたはず。もしfunction sendtoslackが後付けならその次点で送信は行われなくなっていたと考えられます。 たしかに sendtoslack(); を削除して、後付けでfunction sendtoslackを追加しました。。どの段階で変更したかもう一度確認してみます! また追記までありがとうございます・・!!!
bananaanya

2019/02/18 06:33

もろもろありがとうございます・・! テスト通知はうまくいきましたが、やはりスプレッドシート更新してもslackに通知がいかないです><
bananaanya

2019/02/18 08:42

すみません、通知うまくできました・・・!!ありがとうございました!
guest

0

A列以外の列にVLOOK関数を組んでいたため
当初のLast_rowの指定ではシート全体の最終行を指定するようになっており、
正しいLast_rowの取得ができず、Postできないことがわかりました。

▽Last_rowの取得を以下に変更

var columnAVals = ss.getRange('A:A').getValues(); // A列の値を配列で取得 var last_row = columnAVals.filter(String).length; //空白を除き、配列の数を取得 

▽シートの指定はpapinianusさんのご回答をもとに以下で指定

function msgSlack() { var ss = SpreadsheetApp.getActive().getSheetByName('案件一覧'); var rng = ss.getActiveCell(); //アクティブセルを取得 var currentSheetName = SpreadsheetApp.getActiveSheet().getName(); if(currentSheetName != "案件一覧" ) { return; } //これ。シート名が違ったら処理中断

投稿2019/02/18 09:27

bananaanya

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問