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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

240閲覧

スプレッドシート更新時のslack通知

Giselle87

総合スコア1

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

1クリップ

投稿2024/02/06 08:43

編集2024/02/06 10:52

実現したいこと

プログラミング独学の初心者です。よろしくお願いいたします。
スプレッドシート更新通知をslackに送信する仕組みを作っています。
GASとincoming webhookを連携しました。

【かなえたいこと】
・スプレッドシート指定[sheet]、ブック指定[book]
・行2つ指定[column1,colomn2]
・指定した行が記入されたとき、それぞれ指定した値[AまたはA',B]になった場合のみ通知送信
・column1=Aのときとcolumn1=A'のときで通知内容は異なる
・初回のみ通知送信し、以降は通知しない

発生している問題・分からないこと

column1=AまたはA' かつ column2=Bの状態で、
同じ行の別のセルを更新(追記、編集、削除ともに)すると再び通知が来てしまうので
これを無くしたいです。

エラーメッセージ

error

1エラーは発生しておりません。

該当のソースコード

///////////////////////////////////////////////// // onEdit(e):slack更新通知 // //////////////////////////////////////////////// function onEdit(e) { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート(book) var activeSheet = activeSpreadsheet.getActiveSheet(); // アクティブシート(sheet) if(activeSheet.getName() != "sheet"){ // 特定のシート以外の時は処理を中断する return; } var activeCell = activeSheet.getActiveCell(); // アクティブセル var activeValue = activeCell.getValue(); // アクティブセルの値 var newInputRow = activeCell.getRow(); // アクティブ行 var newInputColumn = activeCell.getColumn(); // アクティブ列 var spreadsheetUrl = "spreadsheeturl"; // スプレッドシートのURL if(activeSheet.getRange(activeCell.getRow(),1).getValue() == " A " && activeSheet.getRange(activeCell.getRow(),2).getValue() == " B " && activeSheet.getRange(activeCell.getRow(),99).getValue() == "FALSE") { // 通知1 // 送信するSlackのテキスト1 var slackText = "**test message1**"; sendSlack(slackText); }else if(activeSheet.getRange(activeCell.getRow(),1).getValue() == " A' " && activeSheet.getRange(activeCell.getRow(),2).getValue() == " B " && activeSheet.getRange(activeCell.getRow(),99).getValue() == "FALSE") { // 通知2 // 送信するSlackのテキスト2 var slackText = "**test message2**"; sendSlack(slackText); } } ///////////////////////////////////////////////// // sendSlack:slackに更新通知を送信 // //////////////////////////////////////////////// function sendSlack(slackText){ // slackにて追加したWebhook URLを設定 var webHookUrl = "**webhookurl**"; var jsonData = { // "channel": "#test", // // 'icon_emoji' : "test.png", // "text" : slackText, "link_names" : 1, "username" : "bot名" }; var payload = JSON.stringify(jsonData); var options = { "method": "post", "contentType": "application/json", "payload": payload }; // リクエスト UrlFetchApp.fetch(webHookUrl, options); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べてみたところ、新たに通知済みフラグ列[flag]を作成し、
flag=falseの場合のみ通知を送信→送信後にflag=trueに書き換える、
という処理を追加すると希望が叶いそうです。

条件を追加し、flag=falseの場合のみ通知を送信までは出来るようになったのですが、
通知送信後の書き換え処理がうまくいきません。
Googleで検索してそれらしい記述を追記してみましたが、
エラーは出ないものの希望どおりの挙動になりません。

【追記した内容】
sheet.getRange(lastRow, noticedCol).setValue(true);
を  sendSlack(slackText);  の後ろに追記
【その結果】
通知自体が動かなくなりました

補足

皆様のお力をどうかお貸しください。
よろしくお願いいたします。

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

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

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

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

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

jimbe

2024/02/06 09:17

java では無く javascript では? 両者は全く違うモノです。
Giselle87

2024/02/06 10:52

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
jimbe

2024/02/06 11:47

編集ありがとうございます。
guest

回答1

0

ベストアンサー

通知が送信された行のどこかに「通知済み」というマークを付けることで、その行が通知済みであることを記録し、以後の更新で再通知を防止する必要があります。
スプレッドシートに「通知済み」を記録する列を追加します。これは、例えば列99などを利用できます。
通知を送信する前に、その行が既に通知されているかどうかを確認します。
通知が送信されたら、「通知済み」列にマークを付けます。

function onEdit(e) { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = activeSpreadsheet.getActiveSheet(); if(activeSheet.getName() != "sheet"){ return; } var activeCell = e.range; // e.range を使って修正 var activeRow = activeCell.getRow(); var activeColumn = activeCell.getColumn(); var spreadsheetUrl = "spreadsheeturl"; // 通知済み列の番号 var notifiedColumn = 99; // 通知済み列の値を取得 var notifiedValue = activeSheet.getRange(activeRow, notifiedColumn).getValue(); // 通知済みであれば処理終了 if(notifiedValue == "TRUE") return; // 条件に合致するかチェック if((activeSheet.getRange(activeRow,1).getValue() == "A" || activeSheet.getRange(activeRow,1).getValue() == "A'") && activeSheet.getRange(activeRow,2).getValue() == "B") { // 通知メッセージを作成 var slackText; if(activeSheet.getRange(activeRow,1).getValue() == "A"){ slackText = "**test message1**"; } else if(activeSheet.getRange(activeRow,1).getValue() == "A'"){ slackText = "**test message2**"; } // Slackに通知を送信 sendSlack(slackText); // 通知済み列にマークを付ける activeSheet.getRange(activeRow, notifiedColumn).setValue("TRUE"); } } function sendSlack(slackText){ var webHookUrl = "**webhookurl**"; var jsonData = { "text" : slackText, "link_names" : 1, "username" : "bot名" }; var payload = JSON.stringify(jsonData); var options = { "method": "post", "contentType": "application/json", "payload": payload }; UrlFetchApp.fetch(webHookUrl, options); }

投稿2024/02/07 07:24

shoshinsha123

総合スコア213

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

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

Giselle87

2024/02/07 07:51

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 大変丁寧にご教示いただき、誠にありがとうございました。
shoshinsha123

2024/02/07 07:52

解決おめでとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問