Czy mogę dodać pole autoakumulacji do arkusza kalkulacyjnego Google na podstawie formularza Google?

20

Czy w Formularzach Google można nadać unikalną wartość każdemu wierszowi, który wstawia do arkusza kalkulacyjnego, a także znacznikowi czasu?

Toby Allen
źródło
Znacznik czasu AFAIK jest dodawany automatycznie podczas tworzenia formularza. Gdy zajrzysz do kolumn arkusza kalkulacyjnego, pierwszy to zwykle znacznik czasu (chyba że go z jakiegoś powodu usunąłeś, a tak naprawdę nie wiem, co się stanie, jeśli to zrobisz)
Robert Koritnik
Zgaduję, że coś się zmieniło od czasu udzielenia tej odpowiedzi, ponieważ po utworzeniu wyzwalacza i dodaniu kodu do skryptu nic się nie dzieje po przesłaniu formularza. Czy ktoś ma jakieś porady dotyczące uzyskania powyższych rozwiązań do pracy nad nową wersją Google Sheeth
user3255228

Odpowiedzi:

11

Możesz to zrobić, dodając wyzwalacz skryptu.

Załóżmy, że twój obecny formularz ma dwie kolumny Timestampi odpowiedź na jedno pytanie. Więc obecnie masz kolumny A i B wypełniające się danymi. Załóżmy, że chcesz, aby kolumna C zawierała numer automatycznego przyrostu.

Najpierw musisz przejść do Tools > Script Editor

W oknie edytora skryptów wprowadź następujący skrypt:

function onFormSubmit(e) {

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

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


}

Zapisz skrypt, a następnie przejdź do Triggersmenu i wybierzCurrent script's triggers

Wypełnij menu rozwijane w następujący sposób:

Wyzwalacze skryptów Google

Kliknij Save

Następnie zapisz i zamknij okno Google App Script.

Teraz, gdy formularz zostanie przesłany, wypełni numer wiersza w kolumnie C wraz z danymi przesłanymi za pośrednictwem formularza.

Jeśli chcesz zmienić kolumnę, w której zapisany jest numer wiersza, musisz zmienić ten wiersz skryptu:

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

i zmień wartość 3 na odpowiedni numer indeksu kolumny.

codingbadger
źródło
Czy można użyć tego skryptu, ale potrzebuję unikalnego numeru, więc jeśli kiedykolwiek usunę lub dodam wiersz, nie spieprzę go przykład: mam identyfikator lub wiersz 1, 2, 3, 4, 5, 6, ale ręcznie usuwam 5 po przesłaniu formularza ID 6 przejdzie do wiersza 5, więc kolejny identyfikator formularza w formularzu ponownie będzie 6, będę miał aduplikację. Czy można zatem użyć znacznika czasu i stworzyć z niego unikalny numer automatycznie zwiększający?
Co więcej, teraz używam tego, aby wysłać żądanie do adresu URL, który kontroluję wszystkimi danymi i umieszczam bezpośrednio w mojej aplikacji
Toby Allen
7

Oprócz doskonałej odpowiedzi Barry'ego, jeśli chcesz móc usuwać wiersze i nadal mieć unikalny identyfikator, możesz mieć statyczną komórkę, która utrzymuje liczbę. Następnie możesz użyć tego numeru i zwiększać go przy każdym nowym wpisie do tabeli.

Modyfikacja polegałaby więc na tym, aby gdzieś w arkuszu kalkulacyjnym zachować liczbę („M1” w poniższym kodzie) i zmodyfikować kod, aby wyglądał następująco:

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

Ponownie zmień drugi ostatni wiersz, aby zmienić miejsce, w którym znajduje się Twój identyfikator.

Danny Parker
źródło
Zastosowałem to, ale nie jest to skuteczne w przypadku usuwania wiersza między wierszami danych. dlatego powinien aktualizować ukrytą wartość za każdym razem, gdy nastąpi usunięcie wiersza
Numer nie wymaga aktualizacji po usunięciu, jeśli unikalne identyfikatory to wszystko, co jest wymagane (zgodnie z pierwotnym pytaniem). Jeśli zmniejszysz wartość przy usuwaniu, otrzymasz duplikaty identyfikatorów.
Danny Parker
7

Opierając się na obu poprzednich odpowiedziach (od Barry'ego i Danny'ego):

Zakładając, że kolumna ID to kolumna A. Wybierz komórkę „Następny identyfikator” i ustaw ją na następującą formułę (zakładając, że jest ona w „P1”):

=MAX(A:A)+1

Utwórz skrypt za pomocą edytora skryptów w menu „Narzędzia” i wklej:

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

Dodaj wyzwalacz skryptu za pomocą menu „Wyzwalacze” w edytorze skryptów: wprowadź opis zdjęcia tutaj

się
źródło
4

W odpowiedzi na powyższe odpowiedzi - To rozwiązanie nie wymaga dodatkowej komórki arkusza kalkulacyjnego.

Możesz użyć wbudowanej obsługi zdarzeń do przesłania formularza, aby uzyskać unikalny identyfikator. Ponieważ arkusz kalkulacyjny jest tylko miejscem docelowym formularza, usunięcie wiersza nie powoduje usunięcia odpowiedzi. Pamiętając o tym...

EDYCJA: usunięto potrzebę posiadania identyfikatora i rozwiązano problemy z formatowaniem daty.

/**
* 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
źródło
Nie rozumiem tego Jak to się wywołuje po przesłaniu formularza?
CodyBugstein,
@Imray: Myślę, że to musi być skrypt w arkuszu kalkulacyjnym. W arkuszu kalkulacyjnym można skonfigurować wyzwalacz, aby uruchamiał funkcję po przesłaniu formularza. Dodam ten fakt do tej odpowiedzi, jeśli zadziała (muszę to sprawdzić).
Gary S.
1
getUniqueIDFunkcja może być znacznie uproszczone poprzez proste odesłanie długość odpowiedzi do tej pory (to właśnie logika tej funkcji opisano powyżej robi w dość pokrętny sposób). Zasadniczo pojedyncza linia w funkcji:return getConnectedForm().getResponses().length;
Abid H. Mujtaba
2

Jest to pochodna innych odpowiedzi, ale może być przydatna dla przyszłych użytkowników.

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

}

Główną różnicą jest to, że zaktualizuje kolumnę 1 w aktywnym wierszu podczas edycji tego wiersza, ale tylko wtedy, gdy nie określono jeszcze wartości.

Powinieneś ustawić wyzwalacz, jak wspomniano w innych odpowiedziach na temat edycji.

ustaw wyzwalacz na podczas edycji

nacross
źródło
0

Do „Czy to możliwe, w formularzu Google dać unikalną wartość dla każdego wiersza wstawia do arkusza kalkulacyjnego, a także datownik?” umożliwiając również usunięcie wiersza z formularza Formularz odpowiedzi przed dodaniem kolejnej odpowiedzi bez powielania wartości, powinno to działać:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
orzechy
źródło