前提・実現したいこと
"スプレッドシートで特定の列(サンプルではQ列)に新規入力があった場合、gmailで通知メールを送る"
スクリプトを組み、通知を受け取れるよう試みました。
発生している問題・エラーメッセージ
スクリプトも組みあがり、デバックも問題なし。しかし実際に利用するシート(本番シート)上で試したところうまく動作しないようで、どれだけ待っても通知が送信させませんでした。
該当のソースコード
function notification(){
const recipient = 'sample@gmail.com'; //通知を飛ばす先のgメールアドレス
const subject = '新規入力あり';//通知タイトル
const body = 'https://docs.google.com/spreadsheets/d/samplxxxxxxxx';//確認するシートのURL
var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得
var myCell = mySheet.getActiveCell(); //アクティブセルを取得
if(myCell.getColumn()==17){ //Q列に入力があったか判定
GmailApp.sendEmail(recipient, subject, body);//通知メールを送信
}
}
試したこと
実際にはあらかじめテスト用シートを作成し動作を確認してみたのですが、そちらでは問題なく通知を飛ばすことができました。ソースコードとの具体的な相違点は、通知を飛ばす先のgメールアドレスを自分のアドレスに、確認するシートのURLを対象のシートのものに変えた2点のみ。そこはテスト用シートも本番シートもかわらないので、同様に動いてくれると思ったのですがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
・スクリプトのトリガーは“スプレッドシートから-変更時”に設定しています。
・本当は更新時にリアルタイムで通知を受け取れればどのような手段でもいいのですが、何故かシートの通知ルール設定機能が動いてくれないのでスクリプトで実現しようと思った次第です。
・今後の拡張性を考えてQ列のセルの内容で判定するようにしています。
・初心者で至らないところもありますが、何卒よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
私の環境でも、同じコードとトリガーでメール受信できましたので、コード自体はあっているように思います。※なぜか、入力3~4回に1回しかメール受信できませんでした。。。
ですので、作成したスクリプト(プロジェクト)と、入力した際にメール送信させたいスプレッドシートが正しく紐づいているか、確認してみるのはいかがでしょうか。
スクリプト編集画面の左上、「青地に白矢印(従来のスクリプトエディタ)」か「Apps Script(新しいエディタ)」をクリックすると、自分が操作しているプロジェクトの確認ができるようです。
投稿2021/04/01 11:25
総合スコア5
0
ベストアンサー
まず確認することは、その処理が起動したかですが
ログでも入れて、実行数の所からログを確認してみてはいかがでしょうか。
実行結果はありますか?あればログ内容はどうなっていますか?
(追記)
今の処理が動かない理由は不明ですが、今の処理は不完全な部分もあるため
ちゃんと動かないスプレットシートの関数として実行するのをあきらめて
以下の処理を自分のスプレットシートの関数として定義し、それを時間起動型
(時間はレスポンスが欲しい適当な時間で)で実行させるのは如何でしょうか。
内容は
監視対象のスプレットシートのQ列の内容を、自分のスプレットシートのQ列の内容と比較
違っていれば、監視対象のデータを自分のスプレットシートにコピーした後にメールを行う
というものです。
これであれば複数列の修正にも対応できているので、こちらの方が良いのではないでしょうか。
以下にサンプルコードを提示します。これでどうでしょうか。
GAS
1function notification() { 2 var targetSpreadsheet=SpreadsheetApp.openById("(監視対象のスプレットシートのID)"); 3 var targetSheet= targetSpreadsheet.getSheetByName("(監視対象のシート名"); 4 var thisSpreadsheet=SpreadsheetApp.openById("(自分のスプレットシートのID)"); 5 var thisSheet= thisSpreadsheet.getSheetByName("(自分のシート名"); 6 var lastrow = targetSheet.getLastRow(); 7 var c17s=targetSheet.getRange(1,17,lastrow,1).getValues(); 8 var c17s2=thisSheet.getRange(1,17,lastrow,1).getValues(); 9 10 for (let i = 0; i < c6s.length; i++) { 11 if (c17s[i].toString() != c17s2[i].toString() ){ 12 console.log('違う'); 13 thisSheet.getRange(1,17,lastrow,1).setValues(c17s) 14 //ここでメール 15 break 16 } 17 } 18}
toString()で文字列化して比較しているのは日時データを生のまま比較すると
常に違う判定に私がテストした際にはなった為です。
投稿2021/03/31 20:43
編集2021/04/20 22:30総合スコア1508
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/01 21:33 編集
2021/04/02 03:00
2021/04/02 14:55
2021/04/06 03:10 編集
2021/04/06 03:47 編集
2021/04/08 11:07
2021/04/08 11:54
2021/04/12 13:50
2021/04/12 14:07
2021/04/13 10:40 編集
2021/04/13 13:34
2021/04/14 10:09
2021/04/15 22:16
2021/04/18 06:36 編集
2021/04/18 11:42
2021/04/20 04:32
2021/04/20 22:16
2021/04/22 01:54
2021/04/22 03:56
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/02 02:53