it-swarm.dev

É possível pré-preencher um formulário do google usando dados de uma planilha do google?

Estou procurando uma maneira de "preencher" um formulário do Google com dados específicos de uma planilha do Google. O formulário terá as mesmas perguntas "padrão" para todos, mas os dados das duas primeiras perguntas serão "preenchidos" com dados exclusivos de uma planilha do Google existente. Os dados serão exclusivos com base em seu endereço de e-mail na planilha existente.

EXEMPLO DE FONTE DE FONTE DE DADOS

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

FORMULÁRIO EXEMPLO UM

Pergunta 1 - preenchido com dados (Mike Jones) de uma planilha do google.

Questão 2 - preenchido com dados (9 de maio de 1975) de uma planilha do google.

Questão 3 - em branco (aguardando resposta do usuário)

Questão 4 - em branco (aguardando resposta do usuário)


FORMULÁRIO EXEMPLO DOIS

Questão 1 - preenchido com dados (Jim Smith) de uma planilha do google.

Questão 2 - preenchido com dados (19 de abril de 1985) de uma planilha do google.

Questão 3 - em branco (aguardando resposta do usuário)

Questão 4 - em branco (aguardando resposta do usuário)


Alguém sabe se isso pode ser feito? Se sim, qualquer ajuda ou direção será muito apreciada.

Agradeço antecipadamente!
Todd

62
Mr. B

Você pode criar um URL de formulário pré-preenchido no Editor de formulários, conforme descrito em documentação para formulários de unidade . Você vai acabar com um URL como este, por exemplo:

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

buildUrls ()

Neste exemplo, a pergunta 1, "Nome", tem um ID de 726721210, enquanto a pergunta 2, "Birthday" é 787184751. As perguntas 3 e 4 estão em branco.

Você poderia gerar o URL pré-preenchido adaptando aquele fornecido pela interface do usuário para ser um modelo, como este:

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.
  }
};

Isso é eficaz o suficiente - você pode enviar por e-mail a URL pré-preenchida para cada pessoa e elas já terão algumas perguntas preenchidas.

betterBuildUrls ()

Em vez de criar nosso modelo usando força bruta, podemos combiná-lo programaticamente. Isso terá a vantagem de podermos reutilizar o código sem precisarmos lembrar de alterar o modelo.

Cada questão em um formulário é um item. Para este exemplo, vamos supor que o formulário tenha apenas 4 perguntas, como você as descreveu. O item [0] é "Nome", [1] é "Aniversário" e assim por diante.

Podemos criar uma resposta de formulário, que não será enviada. Em vez disso, preencheremos parcialmente o formulário, apenas para obter o URL do formulário pré-preenchido. Como a API de Formulários entende os tipos de dados de cada item, podemos evitar manipular o formato de sequência de datas e outros tipos, o que simplifica um pouco nosso código.

( EDIT: Há uma versão mais geral disso em Como preencher as caixas de seleção do formulário do 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.
  }
};

função yymmdd

Espera-se que qualquer item de data no URL do formulário pré-preenchido esteja neste formato: yyyy-mm-dd. Essa função auxiliar estende o objeto Date com um novo método para manipular a conversão.

Ao ler datas de uma planilha, você terminará com um objeto Date de javascript, desde que o formato dos dados seja reconhecível como uma data. (Seu exemplo não é reconhecível, então em vez de May 9th 1975 você pode usar 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]);
};
90
Mogsdad