É 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?
É 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?
Respostas:
Você pode fazer isso adicionando um gatilho de script.
Suponha que seu formulário atual tenha duas colunas Timestamp
e 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 Triggers
menu e selecioneCurrent script's triggers
Preencha as listas suspensas da seguinte maneira:
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.
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.
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:
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);
}
}
getUniqueID
funçã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;
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.
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)),"")