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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

3269閲覧

Googleスプレッドシートで、特定の列に特定の文字列が入力されていたらトリガーでメール通知したい。

Na7Na7

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2023/02/02 06:44

編集2023/02/09 05:39

実現したいこと

Googleスプレッドシートで、
特定の列に特定の文字列が入力されていたらトリガーでメール通知したい。
(特定のセルに文字入力ではないです)

前提

右のURL(https://teratail.com/questions/cbm7rb5o15ar9r )を参考に組みました。
※追記:アクティブについて知識が無かったため、おかしなスクリプトになっています※

「スプレッドシート上での表示が"残り●営業日"になったらメール通知」を行いたいため、
="残り"&NETWORKDAYS($H$1,G2)&"営業日"
でH1(TODAY)とF2(予定日)を引っ張って「残り●営業日」と表示されるようにしています。
(実際には祝日も計算に入れたかったため、隣のシートから2年分の祝日も引っ張ってきています。)

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

エラーは起こらず、デバックでもエラーが見つけられず、実行されたことになります。
ですが実行を行った場合でもメールが来ません。
毎日朝7時~8時に設定したトリガーもエラーなく実行履歴がありますが動きません。

該当のソースコード(修正版)

GoogleAppSscript

1function NotificationMail(){ 2 3const recipient = 'めるあど'; //通知を飛ばす先のgメールアドレス 4const subject = '3営業日前です';//通知タイトル 5const body = + '※本メールは●●のリマインド通知です※\n'; 6const options = { name: '通知' }; 7const ss= SpreadsheetApp.openById('シートのIDを入力');// 現在のSpreadSheetを取得 8const mySheet = ss.getSheetByName('シート名を入力'); // シート(SpreadSheetの下のタブ名を指定) 9 10SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名を入力").activate(); 11var myCell = mySheet.getRange("I:I"); // 12if(myCell.getValue()=='残り3営業日'){ //B列に入力があったか判定 13 14GmailApp.sendEmail(recipient, subject, body, options);//通知メールを送信 15} 16}

試したこと

まず数式を読み取れていないのではないかと疑い、
特定文字列を直接入力したところ通知メールが来たり来なかったりするなど再現性があやふやでした。
あやふやなのはメール送信数の制限に引っかかったとのではないかと、
残数を確認できるLogerを実行しましたが1500と余裕がありました。

数式を読み取るため、参考URLではgetValueでしたが、
シートに表示されている文字列で読み込んでもらおうと
getDisplayValueに変更しましたがダメでした。

getDisplayValueでも余計な装飾があるのが原因かと、
=NETWORKDAYS($H$1,F2)
と数式を削って「3」を条件に変更しても同じでした。
数式を組んだ場合はうまくいかないものなのでしょうか。

どなたかお知恵を貸して頂ければ幸いです。

●読み取りたいスプレッドシートのイメージ図です
検索列は質問投稿時はB列(数式)でしたが、今はI列(値のみ貼り付け)を指定しています。
数式が原因ではないと問題を分けたいからです。
毎日自動的にB列をJ列に値のみ貼り付けするスクリプトを組みました。
イメージ説明

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

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

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

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

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

YAmaGNZ

2023/02/02 06:54

トリガーで動作させているならアクティブセルがA1だったりしませんか? というかトリガー動作でなんでアクティブセルでの動作としたのでしょうか?
bebebe_

2023/02/02 07:07

現状だとアクティブセル(選択されているセル)が2列目かつ表示内容が「残り3営業日」の場合メールが送信されます。 判定するセルが決まった位置ならアクティブセルではなく直接指定してはどうでしょう。
Na7Na7

2023/02/03 02:49

YAmaGNZさん アクティブセルの意味を理解しておらずスクリプトをコピペして使用していたので、そのような動作をしていた可能性が高いです。コメントありがとうございます参考になりました。 bebebe_さん コメントありがとうございます。 2列目のどこかに「残り3営業日」と表示されていればメール送信する形にしたいので、その方法はとれないです申し訳ありません。 大量にセルを指定する方法があったら申し訳ありません。
bebebe_

2023/02/03 04:34

対象の文字列が複数セルあったり何行目であっても関係なく固定のメッセージを送ればいいのであれば2列目を配列として取得してその配列内に「残り3営業日」の要素があるか判定するような形にしてみてはどうでしょうか
Na7Na7

2023/02/03 05:41

コメントありがとうございます。 「複数セルあっても何行でも、一件以上あれば固定のメッセージを送る」で間違いありません。 自分でスクリプトを作れず、似たようなことをしているスクリプトを探して使っている段階の初心者なのでパッと浮かびませんが検索の参考にさせて頂きます。
guest

回答2

0

ベストアンサー

やりたいこととしてはこういった感じではないでしょうか

function NotificationMail(){ const recipient = 'めるあど'; //通知を飛ばす先のgメールアドレス const subject = '3営業日前です';//通知タイトル const body = + '※本メールは●●のリマインド通知です※\n'; const options = { name: '通知' }; const ss= SpreadsheetApp.openById('シートのIDを入力');// 現在のSpreadSheetを取得 const mySheet = ss.getSheetByName('シート名を入力'); // シート(SpreadSheetの下のタブ名を指定 var myCell = mySheet.getRange(2,9,mySheet.getLastRow()-1,1).getValues(); //I列を配列として取得 B列なら9→2 //console.log(myCell.flat()) //配列確認用 if(myCell.flat().includes('残り3営業日')){ //配列内に[残り3営業日]があるか判定 GmailApp.sendEmail(recipient, subject, body, options);//通知メールを送信 } }
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名を入力").activate();

とりあえずシートをアクティブにする必要はなさそうなので省いています。

var myCell = mySheet.getRange(2,9,mySheet.getLastRow()-1,1).getValues();

getRange("I:I")までだとI列をRangeとして取得するので「.getValues()」で値を2次元配列にして取得します。
("I:I")だと1000行分とかを取得するので「(2,9,mySheet.getLastRow()-1,1)」で
2行目、9列目から最下の入力がある行までの1列を1列でも2次元配列で取得します。

if(myCell.getValue()=='残り3営業日')

.getValue()だと1個目(1行目)だけが「残り3営業日」か判定するだけになります。
上の方で.getValues()で配列で取得してます。
flat()で2次元配列を1次元配列にして.includesを使うと配列中に「残り3営業日」があればTrueを返します。

投稿2023/02/09 05:37

編集2023/02/09 06:37
bebebe_

総合スコア504

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

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

Na7Na7

2023/02/09 07:44

無事に通知メールが送られました、ありがとうございます! トリガーでの稼働もできました。 解説もありがとうございます、次回以降スクリプトを組む際の参考にさせて頂きます。
guest

0

イメージ説明

getActiveCell()

https://developers.google.com/apps-script/reference/spreadsheet/sheet?hl=ja#getActiveCell()
リファレンスをご覧ください。

getActiveCell()

を使用する場合、参照元は

SpreadsheetApp.getActiveSpreadsheet();

である必要があります。

参考にしたコードは、「いま開いている(アクティブの)スプレッドシートのセルを見る」というものなのだと思いますが。ご質問者様がされたいことは「関数で特定のスプレッドシートの特定のセルの値を得る」というもので。

ようするに なにも Active (アクティブ)になっていないのに、アクティブされている場所を読みに行っているので、なにも起きないだけです。 

投稿2023/02/02 07:32

編集2023/02/02 07:34
penguin520

総合スコア345

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

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

Na7Na7

2023/02/03 08:45

理解の仕方が間違っているかもしれませんが試してみました。 .activateでアクティブシートに指定する、 またgetActiveCellではなくgetRangeで指定する。 このスクリプトで何度かメール通知成功したのですが、 微調節中に途中からメール通知が来なくなってしまったので確信が持てません…。 const activeSpreadSheet = SpreadsheetApp.openById("シートのID");// 現在のSpreadSheetを取得 var mySheet = activeSpreadSheet.getSheetByName('シート名'); // シート(SpreadSheetの下のタブ名を指定) SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名").activate(); var myCell = mySheet.getRange("B:B"); // if(myCell.getValue()=='残り3営業日'){ //B列に入力があったか判定
penguin520

2023/02/03 10:19

.activate() を初めて知りました。 ありがとうございます。 では、こちらでも、もうすこしお役にたてるコードを検証して提供させてください。 月曜日か火曜日になりますが、よろしくお願いします。
penguin520

2023/02/06 03:59

ご質問のコードを改めて拝見したのです。 やはり、 getRange()  を使う必要があります。 実装したいスプレットシートのサンプル画像を質問を編集してアップロードしていただけませんか。 どのような表から 残り3営業日 を取得して何がしたいのかがコードだけだとわかりません。 .activate() と使ったとしても、 getActiveCell() は、この場合使用しないと思います。
Na7Na7

2023/02/09 05:00

遅れて申し訳ありません。 スプレッドシートのスクショを貼りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問