せっかくなので、テストしたコンパクト版を公開します。
①Google Apps Scriptの Script Editorを開く
②スプレッドシートで名前付けされた範囲を設定
③Scriptを作成
scriptの内容は以下の通り。
項目名で取得する方法もありますが、セル番号取得しています。
プログラミングは久しぶりなのでスマートではないかも。
※もし、おかしいところがあればコメントください。
※もし、おかしいところがあればコメントください。
function responsemail() {
try{
sh = SpreadsheetApp.getActiveSpreadsheet();
r = sh.getRangeByName("sheetRange");
var s = r.getRowIndex();
var e = r.getLastRow();
var l = r.getColumnIndex();
//設定した範囲の行数を定義(タイトル行含む)
var j = 40 ;
Logger.log([s,e,l]);
for(var i=1; i< e-1 ; i++){
Logger.log([i,r.getCell(i, 1).getValue(),r.getCell(i, 2).getValue()]);
if(r.getCell(i, 1).getValue() == "") break;
if(r.getCell(i, 3).getValue() != "SENT"){
MailApp.sendEmail(r.getCell(i,1).getValue(), "XXXXXXXXXXからの自動返信", "この度はお問い合わせを頂きまして、誠にありがとうございます。\n本メールはXXXXXXXXX株式会社にWebサイトでお問い合わせを頂いた方に自動返信で送信しております。\n\n\n------------ ご送信内容の確認 ------------\n以下の内容が送信されました。"+"\nメールアドレス : "+r.getCell(i, 1).getValue()+"\n電話番号 : "+r.getCell(i, 2).getValue() ,
{cc : "xxxxxxxxx@xxxxxxxx.com"});
r.getCell(i, 3).setValue("SENT");
}
if(e > j-2 ){
//設定した範囲の行数に達したら管理者にメールを送信する
MailApp.sendEmail("xxxxxxxxx@xxxxxxxx.com", "***error*** Range overflow", "スプレッドシートの名前付けされた範囲の行数に達しました。行を拡張してください。 getLastRow="+e);
}
}
}catch(e){
//エラーが発生した場合に管理者にメールを送信する
MailApp.sendEmail("xxxxxxxxx@xxxxxxxx.com", "***error*** Auto Mail Send", "予期しないエラーが発生しました。 message="+e);
}
}
※自動返信が正常実行されると、メール送信ステータスに"SENT"が格納されます。
※ログ確認も組み込んでます。
④メニューTrigger > Current Script's triggers ...を選択
⑤Runに対象scriptを、Eventsに from Spredsheet - On form submitを選択
⑥フォームから入力して送信
⑦スプレッドシートで確認
⑧自動返答メールを確認
※スプレッドシート更新時のメール通知(共有-メール通知の設定)は、解除しました。
r.getCell(i, 1).getValue()
返信削除という部分ですが、随所に同じような所があったので、
function hoge(aIndex){
return r.getCell(i, 1).getValue()
}
とすれば、呼び出しが、hoge(1)な感じになって冗長さがなくなると思います。
fuciton hogeの定義は、responsemailの内部で定義
maitoさん ありがとうございます。
返信削除functionでまとめる方法やってみます。
大変参考になります。
返信削除scriptを書いたことのない初心者ですみません。
上記を参照にさせて頂いたのですが、
message=JavaException: Cell reference out of range
が表示されてなんとも解決できません。
もしお手隙な時間がございましたら
ご教授ください。
このエラーは、セルの範囲外のセルを参照した時に発生します。
返信削除「名前付けされた範囲」でセルの範囲を確認してみてください。
上記のロジックは、セルの範囲がB2から始まっていることに注意してください。(タイムスタンプ列は範囲外)
上記のサンプルコードのように「Logger.log」を組み込んで、apps scriptのスクリプトエディタ画面の[実行]でスクリプトを実行し、[表示]の[ログ]でログを見ると、参照したセルの内容が見れるので、原因判明に役立つと思います。
まーく様
返信削除早速の丁寧なご説明ありがとうございます。
非常に助かります。
ただ、範囲はB2からB41を指定させてもっているのですが、
ログをみると[2, 41, 2]と出てしまいます。
これをどのように解釈すれば宜しいのでしょうか?
申し訳ありませんが、再びお手隙のところで構いませんので
ご教授頂ければ幸いです。宜しくお願いします。
ログの[2, 41, 2]は、「名前付けされた範囲」がスプレッドシート上のどのセルかを示しており、左から最初の行番号、最後の行番号、最初の列番号のことです。
返信削除上記ロジック内では、最後の行番号のみ使用しています。
getCellは、名前付けされた範囲内の1から始まる番号です。
差し支えなければ、メールのタイトルと内容を削除してロジックを投稿頂ければと思います。
まーく様
返信削除先程解決しました。
SENTを書きこむセルを「名前付けされた範囲」に入れておかないといけなかったのですね。
非常に分かりやすい解説ありがとうございました。
随分と仕事が楽になります。助かりました。
今後とも宜しくお願いします。
お役に立ててよかったです!
返信削除