Можно ли добавить поле автоинкремента в таблицу Google на основе формы Google?

20

Можно ли в Google Forms присваивать уникальные значения каждой строке, вставляемой в электронную таблицу, а также метку времени?

Тоби аллен
источник
Отметка времени AFAIK автоматически добавляется при создании формы. Когда вы заглядываете внутрь столбцов электронной таблицы, первым обычно является метка времени (если вы не удалили ее по какой-то причине, и я не знаю, что произойдет, если вы это сделаете)
Роберт Коритник,
Я предполагаю, что что-то изменилось с тех пор, как был дан этот ответ, потому что после создания триггера и добавления кода в скрипт ничего не происходит при отправке формы. Есть ли у кого-нибудь совет, как заставить вышеуказанные решения работать с новой версией Google Sheeth
user3255228

Ответы:

11

Вы можете сделать это, добавив триггер скрипта.

Предположим, что ваша текущая форма имеет две колонки Timestampи ответ на один вопрос. Таким образом, у вас есть столбцы A и B, заполненные данными. Предположим, вы хотите, чтобы в столбце C был номер автоматического увеличения.

Вы должны сначала перейти к Tools > Script Editor

В окне редактора скриптов введите следующий скрипт:

function onFormSubmit(e) {

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

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


}

Сохраните скрипт, затем перейдите в Triggersменю и выберитеCurrent script's triggers

Заполните раскрывающиеся списки следующим образом:

Триггеры Google Script

щелчок Save

Затем сохраните и закройте окно Google App Script.

Теперь, когда ваша форма отправлена, она заполняет номер строки в столбце C вместе с данными, которые были отправлены через вашу форму.

Если вы хотите изменить столбец, в который сохраняется номер строки, вам нужно изменить эту строку скрипта:

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

и измените значение 3 на соответствующий номер индекса столбца.

кодировщик
источник
Можно ли использовать этот сценарий, но мне нужен уникальный номер, чтобы при удалении или добавлении строки он не испортил пример: у меня есть идентификатор или строка 1, 2, 3, 4, 5, 6, но я удаляю вручную 5 после того, как идентификатор отправки формы 6 переместится в строку 5, поэтому следующим идентификатором отправки формы будет снова 6, у меня будет дубликат. Так можно ли использовать метку времени и сделать из нее уникальное автоматически увеличивающееся число?
Более того, теперь я использую это, чтобы сделать запрос на получение URL-адреса, который я контролирую со всеми данными, и поместить его прямо в мое приложение
Тоби Аллен,
7

В дополнение к превосходному ответу Барри, если вы хотите иметь возможность удалять строки и при этом сохранять уникальный идентификатор, у вас может быть статическая ячейка, которая поддерживает счет. Затем вы можете использовать это число и увеличивать его при каждой новой записи в таблице.

Таким образом, модификация будет заключаться в том, чтобы сохранить номер где-нибудь в вашей электронной таблице («M1» в приведенном ниже коде) и изменить код так, чтобы он выглядел следующим образом:

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

Опять же, измените вторую последнюю строку, чтобы изменить место, где находится ваш идентификатор.

Дэнни Паркер
источник
Я применил это, но это не удается в случае удаления строки между строками данных. поэтому он должен обновлять скрытое значение всякий раз, когда происходит удаление строки
Номер не нуждается в обновлении при удалении, если уникальные идентификаторы - это все, что требуется (согласно исходному вопросу). Если вы уменьшите значение при удалении, вы получите дубликаты ID.
Дэнни Паркер
7

Опираясь на оба предыдущих ответа (от Барри и Дэнни):

Предполагая, что столбец идентификатора - это столбец А. Выберите ячейку «Следующий идентификатор» и установите для нее следующую формулу (предполагая, что она находится в «P1»):

=MAX(A:A)+1

Создайте сценарий с помощью редактора сценариев в меню «Инструменты» и вставьте следующее:

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

Добавьте триггер сценария с помощью меню «Триггеры» в редакторе сценариев: введите описание изображения здесь

себя
источник
4

В дополнение к ответам выше - это решение не требует дополнительной ячейки электронной таблицы.

Вы можете использовать встроенные обработчики событий для отправки формы, чтобы получить уникальный идентификатор. Поскольку электронная таблица является просто местом назначения формы, удаление строки фактически не удаляет ответ. С этим в мыслях...

РЕДАКТИРОВАТЬ: устранена необходимость в идентификаторе и устранены проблемы с форматированием даты.

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

}
Том Хорвуд
источник
Я не понимаю этого. Как это вызывается при отправке формы?
CodyBugstein
@Imray: я думаю, что это должен быть скрипт в электронной таблице. Вы можете настроить триггер в электронной таблице для запуска функции при отправке формы. Я добавлю этот факт к этому ответу, если он работает (мне нужно проверить это).
Гэри С.
1
Эту getUniqueIDфункцию можно значительно упростить, просто возвращая длину ответов до настоящего времени (это то, что логика этой функции, описанная выше, делает довольно запутанным образом). В основном, одна строка в функции:return getConnectedForm().getResponses().length;
Абид Х. Муджаба
2

Это производная от других ответов, но она может быть полезна для будущих пользователей.

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

}

Основное отличие состоит в том, что он будет обновлять столбец 1 в активной строке при редактировании этой строки, но только если еще не указано значение.

Вы должны установить триггер, как указано в других ответах на редактирование.

установить триггер на редактирование

nacross
источник
0

Для "Можно ли в форме Google дать уникальное значение каждой строке, которую она вставляет в электронную таблицу, а также метку времени?" также допускается удаление строки в листе ответов формы перед добавлением следующего ответа без дублирования значений, это должно работать:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
pnuts
источник