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

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

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

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

Q&A

解決済

1回答

818閲覧

特定列(複数)に値が入ったら、値が入った列の特定行の値をメールで通知したい。

kithne

総合スコア2

Google Apps Script

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

0グッド

0クリップ

投稿2021/02/12 03:03

前提・実現したいこと

イメージ説明
E列~G列の中の各列「3行目~5行目」に、blank以外の
ユーザデータ(氏名、所属、E-mail)値が入ったら(ペーストで値が入ったら)、
そのユーザデータ値が入った列の6行目のセル値に入っている値を、特定の人にメールで通知したいです。

■備考
各列の6行目は「3行目~5行目」に入ったユーザデータが数式でまとめて格納されています。

■GASで制限したい3つの条件
①A列やB列に値が入ってもメールは送信されない。

 ②blankのデータが「3行目~5行目」に入ってもメールは送信されない。

 ③ユーザデータが特定の列の「3行目~5行目」入る場合、一つの列だけに値が入るとは限らない。
E列とF列、またはE列~G列の複数列に同タイミングでユーザデータが入る場合がある。
上記の場合は、その値が入った列の分だけメール数が送信されるようにしたい。

該当のソースコード

//現在アクティブなスプレッドシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); //そのスプレッドシートにある最初のシートを取得 var sheet = ss.getSheets()[0]; //シートにあるアクティブなセルを取得  var objCell = sheet.getActiveCell(); //E列、6行目のユーザデータ値を取得  var formValue = sheet.getRange(6,3,1).getValues()[0]; function myFunction() {  //もしE列が編集された且つ、アクティブセル値が空欄ではない場合、メールを送信 if(objCell == 5 && objCell.getValue() !== '') { MailApp.sendEmail({to:"XXXXXX@.co.jp", subject:"通知", body:formValue[0]});; } }

試したこと

上記該当のソースコードでは、
E列のアクティブセルでしかメールが飛びません。。
E列~G列の中の各列の特定の行に値が入ったら、メールを通知するようにしたいです。
GASに精通されている方、お知恵をお貸しいただけますと幸いです。
どうぞ、よろしくお願いいたします。

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

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

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

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

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

sawa

2021/02/15 01:08

どういう運用をしたいのかと、トリガーの要件が不明確な気がします。 「編集時」をトリガーにやらず、実行ボタンやメニューからGAS動かした方がよいんじゃないでしょうか?(その方が暴発メールが起こらないんじゃないかと) ①A列やB列に値が入ってもメールは送信されない。 → C,Dはどういう扱いでしょうか?H列以降は? ②blankのデータが「3行目~5行目」に入ってもメールは送信されない。 → 1つでもblankがあればという意味合いでしょうか?
kithne

2021/02/15 10:15 編集

sawaさん コメントありがとうございます! >どういう運用をしたいのかと、トリガーの要件が不明確な気がします。 仰る通りですね。。失礼しました。 ●運用について 前提:新入社員の情報をスプレッドシートに入力したら、    特定の人にその社員情報を自動でメール通知したいと考えています。 ~手順~ 1.C、D列の3~5行目に新しく入社された社員情報を記入します。(A列、B列も社員情報記入欄にするか考えています。しかし今回は一旦C、D列のみとさせていただきます)  ※1列、1名分の社員情報が入るものとします。  ※記入の際は、3~5行目の氏名、所属、E-mailすべて記入されるものとします。(1つでもblankの項目があるということは無いものとします) 2.C、D列に記入した社員情報(今回は2名分)をコピーし、  E、F列に貼り付けを行います。 3.上記2.で社員情報を貼り付けたタイミングで、  その更新された列の6行目のセル値を特定の人にメールで通知したいです。 (今回は、E、F列の2名分の情報が更新されたため、「この方が入社されましたよ」との旨  2通のメールが通知される) ※C、D列に入ったデータは、新入社員が入るたびにデータを削除し、  使い回す運用で考えています。 ※E列以降はE列~G列のみ列挿入を行い、使い回す予定です。  H列以降は新入社員の情報が蓄積される形で運用を考えています。 >①A列やB列に値が入ってもメールは送信されない >→ C,Dはどういう扱いでしょうか?H列以降は? 明記が誤っておりました。 A~D列また、H列以降に値が入ってもメールは送信されないようにしたいです。 E、F、G列にだけ効くトリガーで運用したいと考えてます。 >②blankのデータが「3行目~5行目」に入ってもメールは送信されない。 >→ 1つでもblankがあればという意味合いでしょうか? いえ、3~5行目すべてブランクの状態であればという意味合いとなります。
guest

回答1

0

ベストアンサー

補足のご説明をいただいたので、とりあえず回答を入れときます。

E、F、G列にだけ効くトリガーで運用

sheet.getActiveCell() で編集箇所を取得するのではなく、関数に引数を設定して編集された列を取得し、そこから判別すると良いです。以下のような書き方で、編集開始列、編集終了列を取得して ifで判別するといった方法があります。

3~5行目すべてブランクの状態であれば

同じく引数のeをgetValuesしたものを使って判別可能です。

//あくまでサンプルとして 関数名をonEdtitにしてますが、シンプルトリガーではメール送信はできません function onEdit(e) { const startCol = e.range.columnStart; //編集された列の最初 const endCol = e.range.columnEnd; //編集された列の最後 if(startCol<5 || endCol>7) return; //編集範囲にE列~G列が入る場合は除外 const values = e.range.getValues(); //編集内容の値 if(values.flat(1).filter(v => v).length == 0) return; //編集内容が全て空なら除外 }

ただ、

2.C、D列に記入した社員情報(今回は2名分)をコピーし、E、F列に貼り付けを行います。

の部分なんかは、E,F列に直接入力する人も出てくると思いますし、その場合書き途中でメールが発砲する恐れがあるので、やはりボタン等でトリガーを実行するのがよいと思います。

例えば、

  1. 入力者が記入完了したら、スクリプト実行ボタンを押す
  2. E列~G列の記入されてる分(1~3通)のメールを特定の人に送信
  3. E列~G列の記入された値を 送信済みシートに転記してから消去

とか。

投稿2021/02/15 12:50

編集2021/02/15 16:41
sawa

総合スコア3002

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

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

kithne

2021/02/16 08:54

ご回答いただきありがとうございます。 頂いた内容でやりたいことが実現できそうです! また下記運用についても、検討したいと思います。 ありがとうございました! >例えば、 >入力者が記入完了したら、スクリプト実行ボタンを押す >E列~G列の記入されてる分(1~3通)のメールを特定の人に送信 >E列~G列の記入された値を 送信済みシートに転記してから消去
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問