2010年12月12日日曜日

Apps Scriptでフォーム送信時に自動返信する機能を作成

昨日、試行錯誤しながらも、自動送信までいけたので、今日はホームページの問い合わせフォームとか、セミナー申し込みフォーム等への実装を完了。久しぶりのScript作成だったので、苦労したところもありますが、思ったより簡単でした。

せっかくなので、テストしたコンパクト版を公開します。

①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を選択







⑥フォームから入力して送信

















⑦スプレッドシートで確認



⑧自動返答メールを確認











※スプレッドシート更新時のメール通知(共有-メール通知の設定)は、解除しました。

8 件のコメント:

  1. r.getCell(i, 1).getValue()
    という部分ですが、随所に同じような所があったので、
    function hoge(aIndex){
    return r.getCell(i, 1).getValue()
    }
    とすれば、呼び出しが、hoge(1)な感じになって冗長さがなくなると思います。

    fuciton hogeの定義は、responsemailの内部で定義

    返信削除
  2. maitoさん ありがとうございます。
    functionでまとめる方法やってみます。

    返信削除
  3. 大変参考になります。
    scriptを書いたことのない初心者ですみません。

    上記を参照にさせて頂いたのですが、
    message=JavaException: Cell reference out of range
    が表示されてなんとも解決できません。

    もしお手隙な時間がございましたら
    ご教授ください。

    返信削除
  4. このエラーは、セルの範囲外のセルを参照した時に発生します。
    「名前付けされた範囲」でセルの範囲を確認してみてください。
    上記のロジックは、セルの範囲がB2から始まっていることに注意してください。(タイムスタンプ列は範囲外)

    上記のサンプルコードのように「Logger.log」を組み込んで、apps scriptのスクリプトエディタ画面の[実行]でスクリプトを実行し、[表示]の[ログ]でログを見ると、参照したセルの内容が見れるので、原因判明に役立つと思います。

    返信削除
  5. まーく様

    早速の丁寧なご説明ありがとうございます。
    非常に助かります。

    ただ、範囲はB2からB41を指定させてもっているのですが、
    ログをみると[2, 41, 2]と出てしまいます。

    これをどのように解釈すれば宜しいのでしょうか?
    申し訳ありませんが、再びお手隙のところで構いませんので
    ご教授頂ければ幸いです。宜しくお願いします。

    返信削除
  6. ログの[2, 41, 2]は、「名前付けされた範囲」がスプレッドシート上のどのセルかを示しており、左から最初の行番号、最後の行番号、最初の列番号のことです。
    上記ロジック内では、最後の行番号のみ使用しています。
    getCellは、名前付けされた範囲内の1から始まる番号です。
    差し支えなければ、メールのタイトルと内容を削除してロジックを投稿頂ければと思います。

    返信削除
  7. まーく様

    先程解決しました。
    SENTを書きこむセルを「名前付けされた範囲」に入れておかないといけなかったのですね。
    非常に分かりやすい解説ありがとうございました。
    随分と仕事が楽になります。助かりました。

    今後とも宜しくお願いします。

    返信削除
  8. お役に立ててよかったです!

    返信削除