2013年3月24日日曜日

Googleフォームからの投稿を管理者にメールで通知させるスクリプト

Google Driveの機能を使うと、簡単にメールフォームを設置できることがわかり、早速、お問い合わせフォームを作成してみました。
さらに、お問い合わせがあった場合に、管理者にその内容を自動でメール送信してくれる
ようにしてみました。
メールフォーム



目次:

フォームから送信があった事を管理者にメールで通知

メール通知を有効にすると、以下のようなメールが届きます。

ユーザーが 2013/03/24 10:21~10:21(日本標準時)に変更を加えました
フォームが送信されました

Powered by Google ドキュメント

これだと、その内容を確認するために、Google Driveにその度、アクセスしなければならず、ちょっと不便。

お問い合わせがあった場合に、内容を丸ごと、メールでお知らせしてくれる方法を、以下で見つけました。
http://d.hatena.ne.jp/yuichi_katahira/20120725/1343200049

ところが、私の場合、何故かエラーに (/_;)。(きっと、自分の設定にミスがあったのだと思いますが、原因がわからず…。katahira様、有り難うございました。)

フォーム送信があった場合に「内容を丸ごと」管理者にメールで通知

そこで、こちらのサイトの方法で、行ってみました。
http://creazy.net/2011/03/google_form_mailsend.html(ヤガー様、有り難うございました。)

特徴は、
  • 管理者に内容を丸ごと、メールしてくれる
  • お問い合わせ下さった方に「お問い合わせを受け付けました」のように自動返信が可能
  • 送信元は、フォームを設置したGoogleアカウントのGmailアドレス
  • 送信元のアドレスの変更は、できない

おお!これは便利!
お問い合わせ下さった方に自動返信したい場合は、上記サイトのヤガー様のスクリプトをそのままお使い下さい。

しかし、このGmailアドレスを、お問い合わせ下さった方とのやり取りに使いたくない、例えば、会社や店舗のアドレスでやり取りしたいといった状況もあるかと思います。

そこで、自分だけにメールが送信されるように、スクリプトを改変してみました。

スクリプトを設定

1)Googleドライブのスプレッドシートを開き、ツール→スクリプトエディタ→適当な名前をつけてスクリプトファイルを新規作成

2)編集画面になるので、1行目の「function myFunction() {  }」を削除

3)後述のスクリプトのソースをコピ−して貼付け。

4)メール文やメールアドレス等を、変更。
  1. メールの宛先(toの部分)に自分のアドレスを入力。
    「""」や「;」を削除してしまわないように注意。
     
  2. 入力カラム名を、スプレッドシートで表示されているもの(=フォーム設置の時に設定したもの)に変更する。

    var NAME_COL_NAME = 'お名前';
    var MAIL_COL_NAME = 'メールアドレス';
    var SUBJ_COL_NAME = '件名';
     
  3. 表示される文章を必要に応じ変更
    var subject 、var bodyに該当する部分です。
    「""」や「;」を削除してしまわないように注意。

5)「ファイル→保存」または、フロッピーアイコンをクリックして、保存する。
6)この時点でエラーがあった場合は、何行目に間違いがあるか、表示されます。

イベントを設定

1)「リソース→現在のプロジェクトのトリガー」と進み、新たにトリガーを追加して保存。


2)ここで、現在のプロジェクトのトリガーのイベントを、「スプレッドシートから」「フォーム送信時」に設定。

(私が試したスクリプトでは、ここでエラーが出たものもありました。)

3)最後に承認をして、終了。

最後に確認

設置したフォームから、お問い合わせしてみて、以下のようなメールが届けば、成功です。

○○ 様から
下記の内容で、お問い合わせを受信しました。
------------------------------------------------------------
【タイムスタンプ】
Sun Mar 24 2013 13:49:25 GMT+0900 (JST)
【お名前】
○○
【メールアドレス】
xxx@example.com
【件名】
テスト投稿します
【メッセージ】
メールで通知されるでしょうか?

ソース

先にあげたヤガーさんのスクリプトから、メールの宛先「to」が自分だけになるように、送信先のオプションを削除し、footerの文章も必要ないので、footerも削除しました。

私は知識がないので、これで正しいかどうか不明です。が、ちゃんと機能しているようです。誤り等ありましたら、ご指導下さいませ。

function sendMailFromForm() {
    Logger.log('sendMailFromForm() debug start');
    //------------------------------------------------------------
    // 設定エリアここから
    //------------------------------------------------------------
    // 件名、本文、フッター
    var subject = "[お問い合わせを受信しました]";
    var body
        = "下記の内容で、お問い合わせを受信しました。\n\n"
        + "------------------------------------------------------------\n";
    // 入力カラム名の指定
    var NAME_COL_NAME = 'お名前';
    var MAIL_COL_NAME = 'メールアドレス';
    var SUBJ_COL_NAME = '件名';
    // メール送信先
    var to    = "xxx@example.com";    // 送信先アドレス設定
    //------------------------------------------------------------
    // 設定エリアここまで
    //------------------------------------------------------------
    try{
        // スプレッドシートの操作
        var sh   = SpreadsheetApp.getActiveSheet();
        var rows = sh.getLastRow();
        var cols = sh.getLastColumn();
        var rg   = sh.getDataRange();
        Logger.log("rows="+rows+" cols="+cols);
        // メール件名・本文作成と送信先メールアドレス取得
        for (var j = 1; j <= cols; j++ ) {
            var col_name  = rg.getCell(1, j).getValue();    // カラム名
            var col_value = rg.getCell(rows, j).getValue(); // 入力値
            body += "【"+col_name+"】\n";
            body += col_value + "\n\n";
            if ( col_name === NAME_COL_NAME ) {
                body = col_value+" 様から\n\n"+body;
            }
            if ( col_name === SUBJ_COL_NAME ) {
                subject += col_value;
            }
        }
        // メール送信
            MailApp.sendEmail(to, subject, body);
         
    }catch(e){
        MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
    }
}
Related Posts Plugin for WordPress, Blogger...

6 件のコメント:

  1. とても分かりやすい説明どうもありがとうございます。

    書かれているのと全く同じように実行したのですが、

    件名:【失敗】Googleフォームからメール送信中にエラーが発生
    null のメソッド「getLastRow」を呼び出せません。

    というメールが送られてきてしまいます。

    何が悪いのでしょうか?

    いつも、タメになる記事をどうもありがとうございます。
    お時間ある時に、ご回答頂けると嬉しいです。

    返信削除
    返信
    1. 鈴木さん、こんにちは。ご覧頂き、どうも有り難うございます。
      まず、改変しないヤガーさんのスクリプト(http://creazy.net/2011/03/google_form_mailsend.html)で動くかどうか、試してみて下さい。設定エリアの、メールアドレスだけ変更すればOK。ここで、エラーだった場合は、私では、わかりません。 <(_ _)>

      これで良ければ、少しずつ、変更する度に、試してみて。どこか変更してエラーが出れば、そのいじった箇所に問題があるということがわかります。一度に変更しちゃうと、どこでミスが生じたのかわからないから。

      あつ、ここで、自分の間違いを発見!!!
      私のフォームは、問題なく機能していますが、「var admin」を削除して、「var to」に自分のアドレスを入れちゃってるから、送信者にはメール通知が行かない!
      ここは、オリジナルのままの方が良いです。ひえー。どうもスミマセン。
      // メール送信先
      var admin = "admin@example.com"; // 管理者(必須)
      var cc = ""; // Cc:
      var bcc = admin; // Bcc:
      var reply = admin; // Reply-To:
      var to = ""; // To: (入力者のアドレスが自動で入ります)

      削除
  2. とても分かりやすく参考になりました。
    ありがとうございました!
    Yuuji

    返信削除
    返信
    1. うまく機能しなかった方もいらしたようですので、Yuujiさんのフォームがちゃんと動いて良かったです (^^)。
      今、ちょっとブログは中断中ですが、こらからも、どうぞよろしくです♪

      削除
  3. 記事の方を拝見しました。

    googleフォームのメール通知をカスタマイズ出来ないものかと探していたので大変参考になりました。

    さて、もしお分かりでしたらご教授頂ければ幸いです。

    このスクリプトですと、フォーム全部がメールの本文に添付されて送信されますが、任意の項目のみを添付して送信する方法はありますでしょうか?

    例)
    1、都道府県
    2、市区
    3、町村

    という項目があったとして、メールに添付するのは2だけと言った感じです。

    返信削除
    返信
    1. hukuさん、化石レスで大変申し訳ありません。 m(_ _)m
      このスクリプトは、Googleドキュメントに保存されたスプレッドシートから、カラム名(項目名)と入力値(内容)を自動で取得した本文に、ヘッダーをつけて送信するものです。
      もし個別の項目ごとにということであれば、項目ごとに内容を取得するManabu Bannaiさんのやり方が良いかもしれませんよ。http://manablog.org/google-form-email-push/ 私は試していないので何とも言えないのですが…。hukuさんが、うまくいきますように。

      削除