Posso adicionar um campo de incremento automático a uma planilha do Google com base em um formulário do Google?

20

É possível no Formulários Google atribuir um valor único a cada linha que ele insere na planilha e no carimbo de data e hora?

Toby Allen
fonte
O carimbo de data / hora do AFAIK é adicionado automaticamente quando você cria um formulário. Quando você olhar para dentro as colunas da folha de cálculo, o primeiro é normalmente timestamp (a menos que você excluiu-lo por alguma razão e eu realmente não sei o que acontece se você fizer isso)
Robert Koritnik
Eu estou supondo que algo mudou desde que esta resposta foi dada porque, depois de criar o gatilho e adicionar o código ao script, nada acontece quando o formulário é enviado. Alguém tem algum conselho para obter as soluções acima para trabalhar na nova versão do Google Sheeth
user3255228

Respostas:

11

Você pode fazer isso adicionando um gatilho de script.

Suponha que seu formulário atual tenha duas colunas Timestampe a resposta para uma pergunta. Portanto, atualmente você tem as colunas A e B preenchidas com dados. Vamos supor que você deseja que a coluna C tenha o número de incremento automático.

Você precisa primeiro ir para Tools > Script Editor

Na janela Editor de scripts, insira o seguinte script:

function onFormSubmit(e) {

var sheet = SpreadsheetApp.getActiveSheet();
var row =  SpreadsheetApp.getActiveSheet().getLastRow();

sheet.getRange(row,3).setValue(row);


}

Salve o script e vá para o Triggersmenu e selecioneCurrent script's triggers

Preencha as listas suspensas da seguinte maneira:

Gatilhos de script do Google

Clique Save

Em seguida, salve e feche a janela Script do aplicativo do Google.

Agora, quando seu formulário for enviado, ele preencherá o número da linha na coluna C, juntamente com os dados enviados por meio do formulário.

Para alterar a coluna na qual o número da linha é salvo, é necessário alterar esta linha do script:

sheet.getRange(row,3).setValue(row);

e altere o valor 3 para o número do índice da coluna correspondente.

codingbadger
fonte
É possível usar esse script, mas eu preciso de um número exclusivo para que, se eu excluir ou adicionar uma linha, não estrague tudo? Exemplo: Eu tenho ID ou linha 1, 2, 3, 4, 5, 6, mas excluo manualmente 5 depois que o ID de envio de um formulário 6 mudar para a linha 5, o próximo ID no envio de formulários será 6 novamente. Então, é possível usar o carimbo de data e hora e criar um número exclusivo de incremento automático?
Ainda melhor, agora eu usar isso para fazer uma solicitação GET para um controle url I com todos os dados e colocá-lo em linha reta em meu aplicativo
Toby Allen
7

Além da excelente resposta de Barry, se você deseja remover linhas e ainda manter um ID exclusivo, pode ter uma célula estática que mantém uma contagem. Você pode usar esse número e incrementá-lo em cada nova entrada na tabela.

Portanto, a modificação seria manter um número em algum lugar da planilha ('M1' no código abaixo) e modificar o código para ficar assim:

function onFormSubmit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getLastRow();

   var bugCount = sheet.getRange("M1").getValue();
   bugCount++;

   sheet.getRange(row,1).setValue(bugCount);
   sheet.getRange("M1").setValue(bugCount);
}

Mais uma vez, altere a segunda última linha para alterar onde seu ID é colocado.

Danny Parker
fonte
Eu apliquei isso, mas isso não é bem-sucedido no caso de excluir a linha entre as linhas de dados. Por isso, deve atualizar o valor escondido sempre que ocorrer exclusão de linha
O número não precisa ser atualizado na exclusão se IDs únicos forem necessários (conforme a pergunta original). Se você diminuir o valor na exclusão, receberá IDs duplicados.
Danny Parker
7

Com base nas duas respostas anteriores (de Barry e Danny):

Supondo que a coluna ID seja a coluna A. Escolha uma célula "Next ID" e defina-a com a seguinte fórmula (assumindo que esteja em "P1"):

=MAX(A:A)+1

Crie um script usando o editor de scripts no menu "Ferramentas" e cole o seguinte:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  NOTE: This cell should be set to: =MAX(A:A)+1
  var id = sheet.getRange("P1").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
  }
}

Adicione um gatilho de script usando o menu "Triggers" no editor de script: insira a descrição da imagem aqui

a si mesmo
fonte
4

Além das respostas acima - Esta solução não requer uma célula de planilha extra.

Você pode usar os manipuladores de eventos embutidos para enviar o formulário para obter um ID exclusivo. Como a planilha é apenas o destino do formulário, a exclusão de uma linha não exclui a resposta. Com aquilo em mente...

EDIT: removeu a necessidade de identificação e lidou com problemas de formatação de data.

/**
* This function extracts the relevant properties from the event handler,
* then uses them to get the uniqueID and record the response
* @param {Object} e The event parameter for form submission to a spreadsheet;
*     e has the following properties values, range, namedValues
*/

function onFormSubmit(e) {
  var uniqueID = getUniqueID(e.values);
  recordResponseID(e.range, uniqueID);
}

/**
* Records the unique ID for this response to the correct cell.
* @param  {Object} eventRange Range in which the response is written
* @param  {Integer} uniqueID   Unique id for this range
*/

function recordResponseID(eventRange, uniqueID) {
  var row = eventRange.getRow();
  var column = eventRange.getLastColumn() + 1;
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(row, column).setValue(uniqueID);

}
/**
* A shortcut function to get the form that is connected to this spreadsheet
* @return {Form}          The form associated with this spreadsheet.
**/

function getConnectedForm() {
  var formUrl = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
  var form =  FormApp.openByUrl(formUrl);
  return form;
}

/**
* Returns a unique ID for the response, by finding the actual Response that
* has the same properties.
* @param  {Array} eventValues Array of: Timestamp_string, form_response_value...
* @return {Integer}             The unique id (by 1 based array position) of the Response
*/

function getUniqueID(eventValues) {
  var isMatch = false;
  var eventItems = eventValues.slice(1);

  var responses = getConnectedForm().getResponses();
  //loop backwards through responses (latest is most likely)
  for (var i = responses.length - 1; i > -1; i--) {
    var responseItems = responses[i].getItemResponses();
    //check each value matches

    for (var j = 0; j < responseItems.length; j++) {
      if (responseItems[j].getResponse() !== eventItems[j]) {
        break;
      }
      isMatch = true;
    }
    if (isMatch) {
      return i + 1;
    }
  }
}

function testOnSubmit() {
  var answers = [
    ["Sue", "39", "Okay I suppose"],
    ["John", "22", "Great"],
    ["Jane", "45", "yeah no"],
    ["Bob", "33", "Super"]
  ];

  var form = getConnectedForm();
  var items = form.getItems();
  for (var i = 0; i < answers.length; i++) {
    var formResponse = form.createResponse();
    for (var j = 0; j < items.length; j++) {
      var item = items[j];
      var itemResponse = item.asTextItem().createResponse(answers[i][j]);
      formResponse.withItemResponse(itemResponse);
    }
    formResponse.submit();
    Utilities.sleep(500);
  }

}
Tom Horwood
fonte
Eu não entendo isso. Como isso é chamado quando o formulário é enviado?
CodyBugstein 11/11
@Irmay: Eu acho que isso deve ser um script na planilha. Você pode configurar um gatilho na planilha para executar uma função quando o formulário for enviado. Acrescentarei esse fato a esta resposta, se funcionar (preciso verificar).
Gary S.
11
A getUniqueIDfunção pode ser bastante simplificada, basta retornar o tamanho das respostas até a data (é o que a lógica dessa função descrita acima está fazendo de uma maneira bastante complicada). Basicamente, uma única linha na função:return getConnectedForm().getResponses().length;
Abid H. Mujtaba 6/16
2

Isso é um derivado das outras respostas, mas pode ser útil para usuários futuros.

function onEdit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getActiveCell().getRow();

   var bugCount = sheet.getRange("M2").getValue();
   bugCount++;

   if (sheet.getRange(row, 1).getValue() == "") {
      sheet.getRange(row,1).setValue(bugCount);
      sheet.getRange("M2").setValue(bugCount);    
   }

}

A principal diferença é que ele atualizará a coluna 1 na linha ativa quando essa linha for editada, mas apenas se ainda não houver um valor especificado.

Você deve definir o gatilho conforme mencionado em outras respostas na edição.

definir gatilho para na edição

nacross
fonte
0

Para "É possível no Formulário do Google atribuir um valor único a cada linha que ele insere na planilha e no carimbo de data e hora?" embora também permita a exclusão de uma linha na folha de respostas do formulário antes da adição de uma resposta adicional sem duplicar valores, isso deve funcionar:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
nozes
fonte