Googleフォームを使ってフォーム送信時のアクションを設定する

今回は打って変わってGoogleフォームの話。
最近、あるイベントの参加申し込みフォームを作っていたので、備忘録として残します。

イベントの申し込みフォームを作りたい場合などに便利なGoogleフォームですが、
込み入った内容を実現しようとすると工夫が必要になります。
今回はGoogleフォームを使って、フォーム送信時のアクション(メール通知、ページ表示)を設定する方法を見ていきます。

googleフォーム

実現できることと実現できないこと

よくある要件として、フォームが送信されたときにメールを送信したい、送信完了ページをカスタマイズしたい、といったものがあります。
この観点で、できることとできないことを整理すると以下のようになります。

標準の機能で実現可能

  • フォームが送信された際に規定のメールアドレスにメールを送る
  • フォーム送信完了ページで規定の内容を表示する

カスタマイズすれば実現可能

  • フォームが送信された際に任意のメールアドレスにメールを送る

実現不能

  • フォーム送信完了ページで入力内容を表示する

フォームが送信された際に規定のメールアドレスにメールを送る

フォームが送信されたことを管理者に通知するなど、規定のメールアドレスにメール通知したい場合は、標準の機能で実現できます。
やり方は以下のとおり。

  1. フォームのデータが保存されるスプレッドレッドシートを開きます。
  2. メニューから、ツール>通知ルールをクリックします。
  3. 「通知ルールの設定」ダイアログで、「ユーザーがフォームを送信したとき」にチェックを入れます。
  4. 「通知方法」を「メール – 1日1回」「メール – その都度」から選びます。
  5. 「保存」ボタンを押します。

notify
ただし、申込者に確認メールを送るなど、入力されたメールアドレスにメール通知したい場合は、この方法では実現できません。


フォーム送信完了ページで規定の内容を表示する

フォーム送信完了ページで、あらかじめ設定しておいた文字列を表示したい場合、標準の機能で実現できます。
やり方は以下のとおり。

  1. フォームを開きます。
  2. 画面下部の「確認ページ」欄を編集します。

confirm
ただし、入力内容をもとに組み立てた文字列を表示することはできません。


フォームが送信された際に任意のメールアドレスにメールを送る

申込者に確認メールを送るなど、入力されたメールアドレスにメール通知したい場合は多々あるかと思います。
このような要件はGoogleフォームで標準で用意されている機能では実現できないのですが、Google Apps ScriptsendEmailを使えば実現可能です。

参考にしたのは下記のサイトです。手順もここを見ればわかります。

Googleドキュメントのフォーム機能からGoogle Apps Scriptを使ってメール送信 – Creazy!(クリエイジー!)

以下、使ったスクリプトです。

function sendMail() {
    // メール宛先
    var admin = "admin@example.com"; // 管理者
    var cc    = "";    // Cc:
    var bcc   = admin; // Bcc:
    var reply = admin; // Reply-To:
    var to    = "";    // To:
  
    // 件名、本文、フッター
    var subject = "[お申し込み]"; 
    var body
        = "お申し込みいただき、ありがとうございました。\n\n" 
        + "------------------------------------------------------------\n";
    var footer
        = "------------------------------------------------------------\n\n"
        + "担当 " + admin + "\n";

    // スプレッドシートの列名
    var NAME_COL_NAME = '名前';
    var MAIL_COL_NAME = 'メールアドレス';

    try{
        // スプレッドシートの操作
        var sh   = SpreadsheetApp.getActiveSheet();
        var rows = sh.getLastRow();
        var cols = sh.getLastColumn();
        var rg   = sh.getDataRange();
     
        // メール件名・本文作成と送信先メールアドレス取得
        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;
            }
            // "メールアドレス"欄への入力を宛先に流用する
            else if ( col_name == MAIL_COL_NAME ) {
                to = 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, "Email address not specified. ", body);
        }
    }catch(e){
        // エラー発生時は管理者のメールアドレスにエラー内容を通知する
        MailApp.sendEmail(admin, "Unknown error occurred. ", e.message);
    } 

}

上記のように、スプレッドシートの値を列からとってくることができるので、とってきた値を計算してsetValueでシートに書き込むなどすれば、集計等の処理まで自動化することもできます。


フォーム送信完了ページで入力内容を表示する

これは実現できそうだと思いきや、実現できませんでした。。

Google Apps ScriptのsetConfirmationMessageを使えばFormの確認ページを変更することはできなくはないのですが、確認ページがブラウザ表示されるタイミングで実現する方法は見当たりませんでした。
(コミュニティでは不可能と言われているようです。)


あと片付け

フォームをいろいろと送信して試していると、ゴミデータが溜まっていくかと思います。
本番運用前にちゃんと後片付けしましょう。

フォームの後片付け

  1. メニュー->回答->すべての回答を削除
  2. サブメニュー->回答を受付中 を2回クリック

スプレッドシートの後片付け

  1. 行を選択して 編集->行Xを削除

以上、珍しくGoogleフォームの話でした。

    • 坂田
    • 2014年 7月 25日

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

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

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

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

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

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

  1. 坂田さん
    コメントありがとうございます。
    フォームの一部の項目のみを本文に含めることは可能です。

    body += “【”+col_name+”】\n”;
    body += col_value + “\n\n”;

    この部分でbody変数に追加した文字列をメール本文にしているので、col_nameが”市区”だった場合のみbodyに文字列を追加するようにifブロックで囲めばオッケーです。
    わからないことがあれば気軽にコメントください。

    • 坂田
    • 2014年 7月 25日

    ご回答ありがとうございます。

    おっしゃっていることは何となくわかるのですが、それがスクリプトとなるとさっぱりわからないのです。

    厚かましいお願いですが、その部分のコード?を教えて頂けますでしょうか。

  2. 動作確認してなくて申し訳ないですが、パッと書くとこんな感じです。
    さっきのコードを下記に置き換えると動くと思います。

    var SHIKU_COL_NAME = ‘市区’;
    if ( col_name === SHIKU_COL_NAME ) {
    body += “【”+col_name+”】\n”;
    body += col_value + “\n\n”;
    }

    • 坂田
    • 2014年 7月 26日

    ありがとうございます。

    しかし、「getLastRow」のエラーが出てしまいました。
    スクリプト修正前の段階(記事掲載のコード)でも出ました。

  3. Googleフォーム側にスクリプトを作成していませんか?
    Googleスプレッドシート側に作成する必要があります。

    • 坂田
    • 2014年 7月 26日

    出来ました!!

    フォームに書いてました。
    なんだかすごい根本的なところで間違っておりました。

    遅い時間までおつきあいくださりありがとうございます。

  4. 無事にできたようで何よりです!

    • 坂田
    • 2014年 7月 26日

    朝っぱらから申し訳ありません。
    もう一つだけ教えて頂けますでしょうか。

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

    上記の質問を一つのページに作成している場合は、先般お教え頂いたコードで行けるのですが、質問をプルダウンにして回答に応じてページ移動、という機能を使うと以下のような形式になります。

    1ページ目
    タイトル:日本の都道府県一覧
    北海道・・・2ページ目へ
    青森県・・・3ページ目へ
    岩手県・・・
    ・・・
    ・・

    2ページ目
    タイトル:市区
    北海道の市区一覧

    3ページ目
    タイトル:市区
    青森県の市区一覧

    こうなると、先般お教え頂いたコードだと対応出来ないのです。
    1ページにまとめて、テキストフィールドでユーザーに任意に入力させると、集計をする際にかなり難儀になる事が予想されるので、プルダウンで選ばせたいのです。

    なのでふと思いついたのは、回答があった項目のみをメールに添付、ということなのですが、こういったことは可能なのでしょうか?

    もしくは他に実現出来る手段はあるのでしょうか?

    長々と申し訳ありません。

  5. この記事でお伝えしている方法では、Googleフォームの結果として保存されるGoogleスプレッドシートの各列の値をメール本文に埋め込んで送信しています。
    「質問をプルダウンにして回答に応じてページ移動」という機能については使ったことがないのでなんとも言えませんが、その機能を使った状態でGoogleスプレッドシート側にどのように登録されるか確認して、列名と対応する処理を正しくスクリプトに反映すれば実現できると思います。

    • 坂田
    • 2014年 7月 26日

    なんだか壮大な話になりそうな気がしました。

    ちなみにこういうスクリプトを書く?作る?ことは可能でしょうか?
    もちろん有料でお願いするつもりです。

  6. 試しに回答を送信してスプレッドシートを確認すればわかると思いますが、「質問をプルダウンにして回答に応じてページ移動」の機能を使った場合についても、ページタイトルはスプレッドシートの列名にはなりません。スプレッドシートの列名になるのは質問のタイトルです。

    > ちなみにこういうスクリプトを書く?作る?ことは可能でしょうか?
    > もちろん有料でお願いするつもりです。
    申し訳ございませんが、こちらのブログはあくまで個人ブログであり、有償無償問わず、そのようにスクリプト作成を請け負うような業務は承っておりません。

    上記で実現できないようであれば、Googleドライブのサポートにお問い合わせいただくのがよいかと思います。
    https://support.google.com/drive/answer/4431192?hl=ja

  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。