Czy możliwe jest "wstępne wypełnienie" formularza google za pomocą danych z arkusza kalkulacyjnego google?

Szukam sposobu na "wstępne wypełnienie" formularza google konkretnymi danymi z arkusza kalkulacyjnego google. Formularz będzie miał te same "standardowe" pytania dla wszystkich, ale dane w dwóch pierwszych pytaniach będą "wstępnie wypełnione" unikalnymi danymi z istniejącego arkusza kalkulacyjnego google. Dane będą unikalne na podstawie ich adresu e-mail w istniejącym arkuszu kalkulacyjnym.

PRZYKŁAD ARKUSZA KALKULACYJNEGO

Col 1       Col 2        Col 3 
email       name         birthday  
@mike       Mike Jones   May 9th 1975  
@jim        Jim Smith    April 19th 1985

FORMULARZ PRZYKŁAD PIERWSZY

Pytanie 1-wstępnie wypełnione danymi (Mike Jones) z arkusza kalkulacyjnego google.

Pytanie 2-wypełnione danymi (9 maja 1975) z arkusza kalkulacyjnego google.

Pytanie 3-puste (oczekujące na odpowiedź użytkownika)

Pytanie 4-puste (oczekujące na odpowiedź użytkownika)


FORMULARZ PRZYKŁAD DRUGI

Pytanie 1-wypełnione danymi (Jim Smith) z arkusza kalkulacyjnego google.

Pytanie 2-wypełnione danymi (19 kwietnia 1985) z arkusza kalkulacyjnego google.

Pytanie 3-puste (oczekujące na odpowiedź użytkownika)

Pytanie 4-puste (oczekujące na odpowiedź użytkownika)


Czy ktoś wie, czy da się to zrobić? Jeśli tak, każda pomoc lub kierunek będą bardzo mile widziane. Z góry dziękuję!
Todd
Author: Rubén, 2013-11-20

1 answers

Możesz utworzyć wstępnie wypełniony adres URL formularza z poziomu edytora formularzy, zgodnie z opisem w dokumentacji dla formularzy napędu. Będziesz miał taki adres URL, na przykład:

https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=Mike+Jones&entry.787184751=1975-05-09&entry.1381372492&entry.960923899

BuildUrls ()

W tym przykładzie pytanie 1," imię", ma ID 726721210, podczas gdy pytanie 2, "urodziny" to 787184751. Pytania 3 i 4 są puste.

Możesz wygenerować wstępnie wypełniony adres URL, dostosowując ten dostarczony przez interfejs do szablonu, jak to:

function buildUrls() {
  var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
  var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");  // Email, Name, Birthday
  var data = ss.getDataRange().getValues();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    var url = template.replace('##Name##',escape(data[i][1]))
                      .replace('##Birthday##',data[i][2].yyyymmdd());  // see yyyymmdd below
    Logger.log(url);  // You could do something more useful here.
  }
};

Jest to wystarczająco skuteczne - możesz wysłać wstępnie wypełniony adres URL każdej osobie, a ona będzie miała już wypełnione pytania.

BetterBuildUrls ()

Zamiast tworzyć nasz szablon za pomocą brute force, możemy go poskładać programowo. Będzie to miało tę zaletę, że możemy ponownie użyć kodu bez konieczności pamiętania o zmianie szablonu.

Każde pytanie w formularzu jest przedmiotem. Dla tego przykładu przyjmijmy, że postać ma tylko 4 pytania, jak je opisałeś. Pozycja [0] to "imię", [1] to "urodziny" i tak dalej.

Możemy utworzyć odpowiedź formularza, której nie będziemy przesyłać - zamiast tego częściowo wypełnimy Formularz, tylko po to, aby uzyskać wstępnie wypełniony adres URL formularza. Ponieważ API formularzy rozumie typy danych każdego elementu, możemy uniknąć manipulowania formatem łańcuchów dat i innych typów, co nieco upraszcza nasz kod.

(EDIT: {[33] }jest bardziej ogólna wersja tego w Jak aby wypełnić wstępnie pola wyboru formularza Google?)

/**
 * Use Form API to generate pre-filled form URLs
 */
function betterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Sheet1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    // Create a form response object, and prefill it
    var formResponse = form.createResponse();

    // Prefill Name
    var formItem = items[0].asTextItem();
    var response = formItem.createResponse(data[i][1]);
    formResponse.withItemResponse(response);

    // Prefill Birthday
    formItem = items[1].asDateItem();
    response = formItem.createResponse(data[i][2]);
    formResponse.withItemResponse(response);

    // Get prefilled form URL
    var url = formResponse.toPrefilledUrl();
    Logger.log(url);  // You could do something more useful here.
  }
};

Funkcja Yymmdd

Każda pozycja daty w wstępnie wypełnionym adresie URL formularza powinna mieć taki format: yyyy-mm-dd. Ta funkcja pomocnicza rozszerza obiekt Date o nową metodę obsługi konwersji.

Podczas odczytywania dat z arkusza kalkulacyjnego zostanie wyświetlony obiekt daty javascript, o ile format danych będzie rozpoznawalny jako data. (Twój przykład nie jest rozpoznawalny, więc zamiast May 9th 1975 możesz użyć 5/9/1975.)

// From http://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear().toString();                                    
  var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
  var dd  = this.getDate().toString();             

  return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};
 102
Author: Mogsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:58