2012/09/29

Google ドライブのフォームに入力があったらメール送信するスクリプト

GoogleのForm機能は便利なのですが、そのままだとFormに入力があってもメールが配信されません。

Google Apps Scriptsを使って、入力があったらメールが配信されるようにする方法、これを以下のサイトで以前見つけて、随分と便利に使わせていただいてます。
ありがとうございます。
http://creazy.net/2011/03/google_form_mailsend.html

今回、Google docsがdriveになったこともあり画面なんかを新しくしてみました。

まずは、Googole driveから、新しいFORMを作ります。

以前はGoogle docだったものが、Google Driveになったのでここからアクセスかな。
https://drive.google.com/?tab=co&authuser=0#my-drive


作成で、フォームを選んで作ります。

FORMの画面が出てくるので、入力項目を設定していきます。
2つ目以降の項目は、新たに追加していきます。
「お名前」と「メールアドレス」の項目をその名前で作って必須としておくと
メール送信のスクリプトの変更が少なくてすみます。
 ↓
項目の入力が終わったら、保存します。(後で追加変更も可能です。)
保存名でできたスプレッドシートを開きます。
 
メールを送信するスクリプトを追加しましょう。
このスクリプトを追加すると、フォームからの登録時に管理者と登録してくれた人にメールが届きます。

「ツール」の「スクリプトマネージャー」の[新規作成...]ボタン
または
「ツール」の「スクリプトエディター」を選択


最初のスクリプトなので、「Google Apps Script」という画面が出てきます。

左の「スクリプトを作成」の中の「空のプロジェクト」を選択

 ↓
編集画面になるので
----------- 最初に入っている以下のコードを消して
function myFunction() {

}
-----------
以下のスクリプトをコピー&ペーストします。

====================スクリプトここから====
function sendMailFromForm() {
    Logger.log('sendMailFromForm() debug start');

    //------------------------------------------------------------
    // 設定エリアここから
    //------------------------------------------------------------

    // 件名、本文、フッター
    var subject = "[参加お申し込み承りました]"; 
    var body
        = "お申し込みありがとうございます。\n\n"
        + "以下の内容で受付させていただきました。\n";
        + "------------------------------------------------------------\n";
    var footer
        = "------------------------------------------------------------\n\n"
        + "訂正など有りましたら、・・・・までご連絡ください。\n";
        + "当日のお越しをお待ちしております。";

    // 入力カラム名の指定
    var NAME_COL_NAME = 'お名前';
    var MAIL_COL_NAME = 'メールアドレス';
    var SUBJ_COL_NAME = '';

    // メール送信先
    var admin = "××××@gmail.com";
    var cc    = "";    // Cc:
    var bcc   = admin; // Bcc:
    var reply = admin; // Reply-To:
    var to    = "";    // To: (入力者のアドレスが自動で入ります)

    //------------------------------------------------------------
    // 設定エリアここまで
    //------------------------------------------------------------

    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 === MAIL_COL_NAME ) {
                to = col_value;
            }
            if ( col_name === SUBJ_COL_NAME ) {
                subject += col_value;
            }
        }
        body += footer;

        // 送信先オプション
        var options = {};
        if ( cc )    options.cc      = cc;
        if ( bcc )   options.bcc     = bcc;
        if ( reply ) options.replyTo = reply;

        // メール送信
        if ( to ) {
            MailApp.sendEmail(to, subject, body, options);
        }else{
            MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body);
        }
    }catch(e){
        MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
    } 
}
====================スクリプトここまで=====

その後、内容に応じて以下を変更
1)メールアドレスはお使いのアドレス(自分自身のアドレス)を入力してください。
  必要に応じてcc等を設定してください。
  admin となっているのは作成している人のgmailアカウントになります。
2)フォームで使っている「お名前」と「メールアドレス」の質問のタイトル(=項目名)が
違っている場合はスクリプトかフォーム変更してください。
  「お名前」は、メールの最初に xx様 という表記が入る
  「メールアドレス」フォームを入力してくれた人のアドレス。ここに返信される。
3)subjectや body、footerとなっている箇所の文章を必要に応じて変更
そしてその後保存してください。
名前はsendMailFromForm 等としておくと良いでしょう。

そして保存をしておきます。
次にスクリプトの実行のタイミングを設定します。

スクリプトの編集画面の「リソース」の「現在のスクリプトのトリガー」を選ぶと
スクリプト実行のタイミングの設定ポップアップが出てきます。



 ↓
formの入力があったときに実行したいので
イベントとして、「スプレッドシートから」「on form submit」(フォーム送信時)に
スクリプトが動作するよう選択します。

 ↓
これを初めて保存しようとすると、承認せよという画面が現れます。
ので承認をします。



もう一度保存とするとやっと保存ができます。
これで、登録したときに、メールが送信される設定になります。

フォーム画面から入力してテストしてみましょう。

入力するフォーム画面を出すには、スプレッドシートの「フォーム」の「ライブフォームを開く」から立ち上げることができます。

テストしてみてうまくいかないようであれば、フォーム用スプレッドシートの
「ツール」の「スクリプトマネージャー」または「スクリプトエディタ」から選んで編集してみましょう。

google driveのスプレッドシートにフォームからの入力が自動的に入るので、一緒のプロジェクトメンバと共有しやすいし途中で項目の増減があっても勝手に反映してくれるので管理が楽です。

3 件のコメント:

鈴木蘭 さんのコメント...

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

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

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

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

何が悪いのでしょうか?

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

REIKO OISHI さんのコメント...

とても参考になりました。ありがとうございます。
ところが、試したところメールで受け取ることができたのですが、以下のように表示されてしまいます。

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

どうすればよいでしょうか?

20131201 huku さんのコメント...

記事の方を拝見しました。

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

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

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

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

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