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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

221閲覧

JavaScript:スプレッドシートの特定列に書き込みがあった場合に Google Chat にそのセルの書き込みを飛ばしたい

tsubugai.taka

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

JavaScript

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

1グッド

1クリップ

投稿2024/04/23 01:33

編集2024/04/23 03:19

実現したいこと

タイトルにも記載させていただいたのですが、スプレッドシートの特定列に書き込みがあった場合に Google Chat にそのセルの書き込みを飛ばしたいと考えております。(A3:A と B3:B に書き込みがあった場合に A3:A と B3:B の書き込み内容を Google Chat に飛ばしたい)
右も左もわかっていない初心者には高望みかもしれませんが、どうかお知恵をお借りできたらと思っております。

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

下記の Link にて紹介されていたコードを元にトライしているのですが、何点か問題にぶちあったってしまっております。(職場にマクロを組めるひともおらず、だれにも質問ができず困っております)
<問題点>
❶そもそもエラーコードがでてしまう(下にエラーコードを掲載しました)
❷シートの特定の列ではなく、どこが編集されても通知が送られてしまう可能性あり
❸シートの列 2か所が埋まった場合に通知がとばされない
❹通知文章が固定のものしか送られない可能性あり

❶のエラーコード
Exception: Request failed for https://chat.googleapis.com returned code 400. Truncated server response: {
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name "手上げあり" at 'message': Cannot find field.",
"statu... (use muteHttpExceptions option to examine full response)

該当のソースコード

function sheetsToHangout() { /* Spreadsheet */ let sheetName = '〇〇〇'; let sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); // データ取得範囲指定 const row = 2; const column = 1; const LastRow = sheet.getDataRange().getLastRow(); const LastColumn = sheet.getDataRange().getLastColumn(); const numRows = LastRow - row + 1; const numColumns = LastColumn - column + 1; // データ取得 let data = sheet.getRange(row, column, numRows, numColumns).getValues(); /* Hangout Chat */ // 投稿先指定 const url = '〇〇〇'; // 手順1で取得したURLをセット for (i=0; i < data.length; i++) { // 送信内容作成 let text = data[i][0]; let message = {'〇〇〇' : text} let params = { 'method': 'POST', 'headers' : { 'Content-Type': 'application/json; charset=UTF-8' }, 'payload':JSON.stringify(message) }; // 送信 UrlFetchApp.fetch(url, params); } }
特になし

試したこと・調べたこと

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

下記の Link を参照にトライしてみております。
https://qiita.com/Shin/items/72eaa5fa24b608c58b93

補足

特になし

TN8001😄を押しています

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

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

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

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

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

jimbe

2024/04/23 03:03

javascript の質問でしたら java のタグで無く javascript のタグにしてください。
tsubugai.taka

2024/04/23 03:20

ご教示をいただきありがとうございます💦 とてもありがたいです💦 ご指摘にあわせてタグを変更させていただきました💦
jimbe

2024/04/23 03:20

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

2024/04/23 04:55

let message = {'〇〇〇' : text} この部分の'〇〇〇'は'text'固定であるべきですが伏字にしているということは変更しているのでしょうか?
Lhankor_Mhy

2024/04/23 04:56

let message = {'〇〇〇' の 〇〇〇 は、具体的には何が入っていますか?
tsubugai.taka

2024/04/23 05:17

let message = {'〇〇〇' の部分には「報告あり」に変えておりました💦 この部分は正しくは下記のどちらかというイメージでしょうか💦 ❶ let message = {'text' : text} ❷ let message = {'text' : 報告あり}
tsubugai.taka

2024/04/23 05:58

ご返信ありがとうございます!たしかにこの「let message = {'〇〇〇'」の部分同じ内容で躓いておりました💦お恥ずかしいかぎりです。。 ですが、実は前のときも解決できずにおりまして、希望の動作がかなっておりません。 その間に、私的な問題ではありますが、部署移動がおこり当分必要がなくなっていたのですが、あらためていま必要になり問題を解決したいと思いここにすがらせていただいた所存でございます。
tsubugai.taka

2024/04/23 06:16

はい!ただ❶を修正すると、いま現在 A列に入力されているセルの情報がすべて 1つずつチャットに送られてしまい、その数が膨大すぎて途中でエラーが発生するような形になってしまいました💦
tsubugai.taka

2024/04/24 00:43

ありがとうございます!参考にさせていただきます💦
guest

回答1

0

ベストアンサー

特定のシートの特定の二つの列に書き込みがあったら、
書き込みがあった行のA列のセルとB列のセルの値をGoogleChatに通知するのであれば、
次のようなコードを書けると思います。

js

1/* 2* この関数をスプレッドシートの「編集時」のトリガーに設定します。 3* この関数はスクリプトエディタで「実行」をクリックしても 4* 編集されたセルを取得できないのでエラーになります。 5*/ 6function sheetToGoogleChat(e) { 7 if(!e) { 8 console.log('このスクリプトは、セルが編集された時に起動するようにトリガーを設定するものです\nエディタからは実行できませんのでトリガーの設定後にセルを編集してください'); 9 return; 10 } 11 // シート名と二つの列を指定 12 const sheetName = '手上げ'; // 確認するシート名 13 const column1 = 1; // A列 14 const column2 = 2; // B列 15 16 // 編集されたセルが対象のシートなら対象の列か確認 17 const range = e.range; 18 const sheet = range.getSheet(); 19 const column = range.getColumn(); 20 if (sheet.getName() === sheetName && [column1, column2].includes(column)) { 21 // 両方の列のセルに表示されている文字列を取得して確認 22 const value1 = range.offset(0, column1 - column).getDisplayValue(); 23 const value2 = range.offset(0, column2 - column).getDisplayValue(); 24 if (value1 && value2) { // どちらも書き込みがあるなら 25 // スクリプトエディタの「実行数」から確認できるログに記録 26 console.log('A列の値: ' + value1 + ' B列の値: ' + value2); 27 notifyGoogleChat(value1, value2); 28 } 29 } 30} 31 32/* Google Chat */ 33function notifyGoogleChat(value1, value2) { 34 const url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 手順1で取得したURLをセット 35 // 送信内容作成 36 let text = 'A列の値: ' + value1 + ' B列の値: ' + value2; 37 let message = { text } 38 let params = { 39 'method': 'POST', 40 'headers': { 41 'Content-Type': 'application/json; charset=UTF-8' 42 }, 43 'payload': JSON.stringify(message) 44 } 45 // 送信 46 UrlFetchApp.fetch(url, params); 47}

セルを編集したときの通知の画像

イメージ説明

投稿2024/04/23 10:33

編集2024/04/24 02:09
codemaker

総合スコア39

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

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

codemaker

2024/04/23 13:48

何行目に書き込みがあったかを通知するならもう少しコードが増えます。
tsubugai.taka

2024/04/24 01:05

丁寧に回答をいただきありがとうございます💦 また言われて私の言葉が足りていないことに気づきました、そちらも教えていただきありがとうございます💦 実行したかったことは、A列からV列まで項目があるシートがありまして、「A列が名前 / B列が作業項目」となっております。(シートのページもいくつかありまして、その中のひとつのページのみ必要となります) シートを管理者が常に開いた状態にしてなくても、シートに報告を書きこんださいに気づくことができるように常時使用しているチャットに「誰が・どの作業について」を届けたいと考えておりました💦 そのため、A列とB列の書き込み内容を書き込み時にチャットに送信できたらと考えました💦 ---------------------------------------------------------------------------------------------- 先ほどいただいたものを実行しましたが下記のエラーが出てしまいました💦(※そこで他にもページがあることに気づき、自分なりにどうやったらページを指定できるかな?と思い、少しだけ手を加えてみてトライしてみましたが、同じ結果でした💦) <エラーコード> TypeError: Cannot read properties of undefined (reading 'range') <試したもの> function sheetToGoogleChat(e) { // スプレッドシートの指定の二つの列に値が入力されたかを確認 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('手上げ'); const column1 = sheet.getRange("A:A") // A列 const column2 = sheet.getRange("B:B") // B列 // 編集されたセルを取得し対象の列か確認 const range = e.range; const column = range.getColumn(); if ([column1, column2].includes(column)) { // 両方の列のセルに表示されている文字列を取得して確認 const value1 = range.offset(0, column1 - column).getDisplayValue(); const value2 = range.offset(0, column2 - column).getDisplayValue(); if (value1 && value2) { // どちらも書き込みがあるなら // スクリプトエディタの「実行数」から確認できるログに記録 console.log('A列の値: ' + value1 + ' B列の値: ' + value2); notifyGoogleChat(value1, value2); } } } /* Google Chat */ function notifyGoogleChat(value1, value2) { const url = 'ここには Google Chat の Webhook URL をそのまま貼り付けました'; // 手順1で取得したURLをセット // 送信内容作成 let text = 'A列の値: ' + value1 + ' B列の値: ' + value2; let message = { text } let params = { 'method': 'POST', 'headers': { 'Content-Type': 'application/json; charset=UTF-8' }, 'payload': JSON.stringify(message) } // 送信 UrlFetchApp.fetch(url, params); }
codemaker

2024/04/24 01:22

エラーの原因は、他にシードがあることではなく、スクリプトエディタから実行したことによるものです。 エラーにならないようにしました。 また、指定したシートのときだけに通知するようにしました。
tsubugai.taka

2024/04/24 01:50

ありがとうございます!すごいです!エラーはでなくなりました! ですがA列とB列にあわせて何かを書き込んでもチャットが何も送られてきませんでした💦 もしかして Webhook の URL を全部はってはダメなどのルールはありましたでしょうか?💦 <新しく試したもの(Webhook の URL 以外は使用を試した通りに張り付けました💦)> function sheetToGoogleChat(e) { if(!e) { console.log('このスクリプトは、セルが編集された時に起動するようにトリガーを設定するものです\nエディタからは実行できませんのでトリガーの設定後にセルを編集してください'); return; } // シート名と二つの列を指定 const sheetName = '手上げ'; // 確認するシート名 const column1 = 1; // A列 const column2 = 2; // B列 // 編集されたセルが対象のシートなら対象の列か確認 const range = e.range; const sheet = range.getSheet(); const column = range.getColumn(); if (sheet.getName() === sheetName && [column1, column2].includes(column)) { // 両方の列のセルに表示されている文字列を取得して確認 const value1 = range.offset(0, column1 - column).getDisplayValue(); const value2 = range.offset(0, column2 - column).getDisplayValue(); if (value1 && value2) { // どちらも書き込みがあるなら // スクリプトエディタの「実行数」から確認できるログに記録 console.log('A列の値: ' + value1 + ' B列の値: ' + value2); notifyGoogleChat(value1, value2); } } } /* Google Chat */ function notifyGoogleChat(value1, value2) { const url = 'https://chat.googleapis.com/v1/spaces/AAAA1lEGLDE/messages?key=〇〇〇&token=〇〇〇'; // 手順1で取得したURLをセット // 送信内容作成 let text = 'A列の値: ' + value1 + ' B列の値: ' + value2; let message = { text } let params = { 'method': 'POST', 'headers': { 'Content-Type': 'application/json; charset=UTF-8' }, 'payload': JSON.stringify(message) } // 送信 UrlFetchApp.fetch(url, params); }
codemaker

2024/04/24 02:10

私が試した限りでは、 A列にXXXと記入し、その後B列にYYYと書き込んでから数秒後に A列の値: XXX B列の値: YYY と通知が来ました。↑画像を添付しました。 /* * この関数をスプレッドシートの「編集時」のトリガーに設定します。 * この関数はスクリプトエディタで「実行」をクリックしても * 編集されたセルを取得できないのでエラーになります。 */ スプレッドシート「編集時」のトリガーを設定しないと A列とB列に書き込んでも通知されませんよ。
tsubugai.taka

2024/04/24 02:32

ありがとうございます!!!!!!! トリガーを設定するのを忘れてました!!!!!!通知送られるようになりました!!!! 最後まで見捨てないでくださり本当にありがとうございました!!!!!! ちなみになんですが、通知が 2つ届いてしまうのですが、1つだけにするのは条件を2列にしてるので仕方ないでしょうか?💦
codemaker

2024/04/24 02:53

本来の動作は、 A列とB列を順に記入した時は、 A列への記入で起動したスクリプトは、A列は記入は確認できるがB列の記入がないので 通知はしないで終了します。 その後、B列への記入で起動したスクリプトは、A列とB列の記入が確認できるので通知をする。 という動作になるのですが、 A列の記入後直ちに(1秒未満で)B列に記入がなされると、 A列への記入で起動したスクリプトがB列を確認した時点で既にB列に記入がなされているため、 A列への記入で起動したスクリプトも通知をしてしまうので、 その後B列への記入で起動したスクリプトの通知と重複して通知されてしまいます。 テストで短時間に短い文字を入力するとそうなります。
tsubugai.taka

2024/04/24 02:58

そういうことだったんですね!!! A列とB列の項目がデータ規則を選択するだけの項目だったので 2つになったんだとわかりました!! atlanticSalmon さんは何で?を説明いただけるのでとてもわかりやすいです! 本当にありがとうございました!!!😭
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問