25

データを収集し、AppScriptを使用して、入力したユーザーに確認メールを送信するシンプルなGoogleフォームがあります。ユーザーがフォームを送信した後、確認すると、回答を編集するためのリンクが表示されます。

そのリンクを確認メールの一部として含めたいのですが(現時点では、ページにのみ表示されます)、送信された応答を編集するためのURLを取得するにはどうすればよいですか?

を介してフォームへのリンクを取得できますSpreadsheetApp.getActiveSpreadsheet().getFormUrl()。それは私に次のフォーマットを与えます:https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>

ただし、リンクには、ユーザーが自分の応答を編集するために必要な編集キーは含まれていません。予想されるURLは次のようになります。https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>&edit=<editKey>

よろしくお願いします!

-K

編集:

これに関する機能リクエストを追加しました:http ://code.google.com/p/google-apps-script-issues/issues/detail?id = 1345&thanks = 1345&ts = 1337773007

4

9 に答える 9

22

@Henrique Abreuではこれが不可能だったという答えは、ごく最近まで真実でした。GoogleはFormResponsegetEditResponseUrl()クラスに追加したようで、これにより、次のようなコードを使用して、既存のフォームの束の編集URLを取得できるようになります。

function responseURL() {
 // Open a form by ID and log the responses to each question.
 var form = FormApp.openById('1gJw1MbMKmOYE40Og1ek0cRgtdofguIrAB8KhmB0BYXY'); //this is the ID in the url of your live form
 var formResponses = form.getResponses();
 for (var i = 0; i < formResponses.length; i++) {
   var formResponse = formResponses[i];
   Logger.log(formResponse.getEditResponseUrl());
 }
}

ユーザーが応答したときに自動的にメールで送信するようにするには、フォームの送信時にトリガーを追加します。私が取り組んでいる状況では、ユーザーがアプリアカウントでログインする必要がないため、メールアドレスに自動的にアクセスできないため、ユーザーのメールアドレスをキャプチャするテキストメッセージがあります。

フォームの編集があなたの望むものであるかどうかについての質問をします。私は、既存の応答を編集したり、を使用して事前に入力されたフォームを送信したりすることの相対的な利点に取り組んできましたtoPrefilledUrl()。これにより、時間の経過とともに状況がどのように変化したかを確認できます。これは、これを追跡することで得られる価値に帰着すると思います。

于 2014-02-16T23:36:47.133 に答える
2

Google Appsを使用している場合、レスポンダーはそこでフォームレスポンスを編集できます。

参照:フォームの回答を編集する方法

于 2012-05-23T01:36:53.370 に答える
2

-編集これが可能になりました。他の回答を参照してください。

ユーザーがフォームを送信した後、確認すると、回答を編集するためのリンクが表示されます。そのリンクを確認メールの一部として含めたいのですが

それは不可能です、期間。

そのリンクはどこからもアクセスできず、推測/構築することはできません。しかし、あなたに合うかもしれないいくつかの回避策があります(いくつかはここで言い換えることを提案しました)、例えば

入力されたフォームリンクを送信し、ユーザーに再送信してもらいます。彼の古い送信を認識して削除/無視できるように、何らかの制御フィールド(ユーザー名など)が必要になります。おそらくスクリプトを介して自動的に。

また、apps-script GUIを開発して公開し、このアプリスクリプトへのリンクと、編集するエントリを決定できる生成するパラメータを送信することもできます。このアプローチの欠点は、AppsScriptでフォーム全体を再設計するのがやや面倒でやり過ぎであるということです。しかし、繰り返しますが、それは機能します。

最後に、Apps Scriptの課題追跡システムで「拡張リクエスト」を開き、彼らとGoogleスプレッドシート/フォームチームが協力してソリューションを開発するまで待つことができます。

于 2012-05-23T02:14:54.460 に答える
2

これは、それを段階的に行う方法を示し、AppsScripts初心者のために内部で何が起こっているかを説明する明確なブログ投稿です。

http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html

ここで提供されているすべての優れた回答からまとめてそこにたどり着くことができますが、その投稿のスクリプトは私にとって最適でした。

于 2015-01-24T23:01:42.273 に答える
1

これは役に立ちますか?私はそれを試していませんが、しばらく前に同じものを探していて、これに気づきました。

このページから https://developers.google.com/apps-script/reference/forms/

そこからのコードにはこれが含まれています:

Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());

ジョン

于 2013-06-19T17:52:11.203 に答える
1

これを試してください:(私は第3部の2つのソリューションをマージするため、クレジットは私には適していません)

出典:Googleフォームで確認メールを送信

/* Send Confirmation Email with Google Forms */

function Initialize() {

    var triggers = ScriptApp.getScriptTriggers();

    for (var i in triggers) {
        ScriptApp.deleteTrigger(triggers[i]);
    }

    ScriptApp.newTrigger("SendConfirmationMail")
        .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
        .onFormSubmit()
        .create();

}

function SendConfirmationMail(e) {
  var form = FormApp.openById('***YOUR FORM CODE***');
    //enter form ID here

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('***SHEET NAME***');

    //Change the sheet name as appropriate
  var data = sheet.getDataRange().getValues();
  var urlCol = ***************COLUMN SEQUENCE EX 14******; // column number where URL's should be populated; A = 1, B = 2 etc
  var responses = form.getResponses();
  var timestamps = [], urls = [], resultUrls = [], url;

  for (var i = 0; i < responses.length; i++) {
    timestamps.push(responses[i].getTimestamp().setMilliseconds(0));
    urls.push(responses[i].getEditResponseUrl());
  }
  for (var j = 1; j < data.length; j++) {

    resultUrls.push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]:'']);
    url = resultUrls[i-1]
  }
  sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);  

    try {

        var ss, cc, sendername, subject, headers;
        var message, value, textbody, sender;

        // This is your email address and you will be in the CC
        cc = Session.getActiveUser().getEmail();

        // This will show up as the sender's name
        sendername = "****YOUR NAME******";

        // Optional but change the following variable
        // to have a custom subject for Google Docs emails
        subject = "Registro de Oportunidade submetido com sucesso";

        // This is the body of the auto-reply
        message = "Nós recebemos seu registro de oportunidade.<br>Muito Obrigado!<br><br>";

        ss = SpreadsheetApp.getActiveSheet();
        headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];

        // This is the submitter's email address
        sender = e.namedValues["********COLUMN NAME OF DESTINATION E-MAIL************"].toString();

        for (var i in headers) {

            value = e.namedValues[headers[i]].toString();

            // Do not send the timestamp and blank fields            
            if ((i !== "0") && (value !== "")) {
                message += headers[i] + ' :: ' + value + "<br>";
            }
        }

        message += "<br>Link to edit" + ' :: ' + url + "<br>";
        textbody = message.replace("<br>", "\n");

        GmailApp.sendEmail(sender, subject, textbody, 
                            {cc: cc, name: sendername, htmlBody: message});

    } catch (e) {
        Logger.log(e.toString());
    }

}
于 2014-02-03T03:05:28.030 に答える
1

すばらしい、スクリプトは機能します!ありがとう。

私のような初心者の場合:関数のandreのコードをSendConfirmationMail(e)スプレッドシートのコードエディタに貼り付け、「フォーム送信時に」トリガーを設定して実行します。これは、フォームスクリプトエディタではなく、スプレッドシートスクリプトエディタにあります。

いくつかの値をハックする必要があります。コードを読んでください。私にとって紛らわしいのは********COLUMN SEQUENCE EX 14******、編集URLを最終的に使用するシートの列番号にを置き換える必要があることでした。フォームが使い切っていたよりも1列多い39を使用しました。

ただし、この部分で実行時の問題が発生しました。

for (var i in headers) {

            value = e.namedValues[headers[i]].toString();

            // Do not send the timestamp and blank fields            
            if ((i !== "0") && (value !== "")) {
                message += headers[i] + ' :: ' + value + "<br>";
            }
        }

理由はわかりませんが、私はそれをこれに置き換えました:

 for (var keys in columns) {
        var key = columns[keys];
        if ( e.namedValues[key]) {
        message += key + ' :: '+ e.namedValues[key] + "<br>"; 
        } 
    }

私のために働きます。

于 2014-03-16T08:03:55.783 に答える
0

以前の回答を削除するよりも、そのメールアドレスから指定された値をフォームに入力してみることができます...

それは美しい方法ではありませんが、うまくいく可能性があります...

于 2012-05-23T01:15:49.287 に答える
-1

Spreadsheet APIを介してその値にアクセスできるとは思いません(つまり、Apps Scriptにもその値がありません)。私が考えることができる最も近いものは、このフィードの「キー」値です。ただし、テストして調べる必要があります。Spreadsheet APIに直接アクセスする以外に、私が知っている代替手段はありません。したがって、最初に、APIを使用して最後の行を取得する必要があります?reverse=true&max-results=1

于 2012-05-23T01:07:38.187 に答える