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

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

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

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

Google Apps Script

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

Q&A

1回答

982閲覧

【Google App Script】列のセルに入力、および更新がされたら特定の人にメールで通知をしたい

Yuppon

総合スコア5

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2021/07/17 13:52

A列の名前の人からの問い合わせ内容を、B列の問い合わせ内容が更新されたら、D列の担当者にメールで通知したい。

### A列の名前を入力すると、VLOOKUPでD列に担当者名が入るようになっています。B列の問い合わせ内容を入力したら、D列の担当者にメールで通知したいです。

|A|B|C|D|E|F|G|H|
|:--|:--:|--:|
名前|問い合わせ内容|日付|担当者|-|-|-|-|
赤坂|XXXXX|-|A|-|-|-|-|田中|C|
青山|XXXXX|-|B|-|-|-|-|赤坂|A|
赤坂|XXXXX|-|A|-|-|-|-|青山|B|

IJ-
名前担当者-
赤坂A-
青山B-

現在のコード

function sendNotification() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("QA"); const cell = ss.getActiveCell().getA1Notation(); const columnNameInAlphabet = cell.replace(/\d+/,''); const recipients = { '赤坂': 'aaaaa@gmail.com', '青山': 'bbbbb@outlook.jp' }; //名前を取得 const person = sheet.getRange('I'+ sheet.getActiveCell().getRowIndex()).getValue(); //メールの件名と本文 const subject = '【test】'+ss.getName(); const body = person + 'さんから問い合わせがありました。'; //更新された行が通知対象の場合メール送信 if (person in recipients == true){ MailApp.sendEmail(recipients[person], subject, body); } };

問題点 B列を入力または更新した際に通知を送りたいのですが、他のセルが変更されてもメールが送られてくる。また、赤坂さんが2回目の質問をした際(表の4行目)は通知が届かない。

行き詰ってしまったので、どこが原因かお分かりになる方、ご教示いただきたくお願いいたします。

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

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

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

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

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

guest

回答1

0

 B列を入力または更新した際に通知を送りたいのですが、他のセルが変更されてもメールが送られてくる。

この原因は、編集された列を限定せずにsendNotification()関数の処理を全部実行してしまっているからです。
「B列以外が編集されたとき」は何もせずreturnする必要があります。

getActiveColumn()を使うことも可能ですが、入力直後にアクティブセルが移動されたような場合、不具合が生じる可能性があります。

トリガーで実行する関数(sendNotification()関数)に引数を設定することにより、編集されたセルに関するデータを取得できるので、これを利用した方がよいでしょう。

js

1sendNotification(e) { 2 const col = e.range.columnStart; // 更新された列の取得 3 // 編集された列がB列以外の場合はreturn。 4 if (col != 2) return; 5

 

赤坂さんが2回目の質問をした際(表の4行目)は通知が届かない。

これは、

const person = sheet.getRange('I'+ sheet.getActiveCell().getRowIndex()).getValue();

で「A列」ではなく「I列」の該当行からpersonを取得していることが原因です。

たとえば4行目(B4)セルが編集されたとき、getActiveCell().getRowIndex()は「4」となり、
personには「I4」セルの値が入ります。
しかし「I4」セルは空白のため、person in recipients はfalseとなり、メールが送信されません。

ここは「A4」セルを取得するべきだと思われます。
(ここも前述と同様にgetActiveCell()ではなく、e.range.rowStartを使って、編集された行番号を取得しています)

js

1//名前を取得 2 const person = sheet.getRange('A'+ e.range.rowStart).getValue();

投稿2021/07/17 15:11

編集2021/07/17 15:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Yuppon

2021/07/17 22:31

qnoir様 丁寧に教えてくださりありがとうございます。 分かりやすく、理解できました。 記載してくださった内容を反映してみたのですが、 TypeError: Cannot read property 'range' of undefined というエラーが出てしまいます。 トリガーは、スプレッドシートから、変更時になっています。 いろいろ調べてるのですが、解決できていないのでもし対処法をご存じでしたらご教示いただければ幸いです。
退会済みユーザー

退会済みユーザー

2021/07/18 00:07 編集

sendNotification関数を実行させるトリガーの設定は、「変更時」ではなく、「編集時」にしてください。 (「変更時」にしていると、うまく動きません) あと、トリガー経由ではなく、エディタから直接sendNotification関数を実行するだけだとうまく動かず、上記のエラーが出ます。 スプレッドシートの、青山さんか赤坂さんの行のB列のセルを編集(入力)すると、トリガー経由で正常に実行されるはずです。 (もしテストのためメールを実際に送信したくない等であれば、 テスト時はMailApp.sendEmailの行はLogger.logに変えてください)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問